def set_waveform(self, waveform, channel): if self.waiting_waveforms[ channel] != waveform: # if the current waveform has not been preloaded by prepare_set_waveform_async wave = keysightSD1.SD_Wave() if self.waveform_ids[channel] is None: wave.newFromArrayDouble( 0, np.zeros((50000, )).tolist()) # WAVE_ANALOG_32 self.module.waveformLoad(wave, channel) wave = keysightSD1.SD_Wave() self.waveform_ids[channel] = channel waveform_id = self.waveform_ids[channel] waveform_data = np.asarray(waveform).tolist() wave.newFromArrayDouble(0, waveform_data) # WAVE_ANALOG_32 self.module.waveformReLoad(wave, waveform_id, 0) self.waveforms[channel] = waveform else: # in case the waveform has been preloaded, exchange the current waveform for the waiting_waveform waveform_id = self.waiting_waveform_ids[channel] waveform = self.waiting_waveforms[channel] self.waiting_waveform_ids[channel] = self.waveform_ids[channel] self.waiting_waveforms[channel] = self.waveforms[channel] self.waveform_ids[channel] = waveform_id self.waveforms[channel] = waveform trigger_source_type = self.trigger_source_types[channel] trigger_source_channel = self.trigger_source_channels[channel] trigger_delay = self.trigger_delays[channel] trigger_behaviour = self.trigger_behaviours[channel] self.stop() self.module.AWGflush(channel) self.module.AWGtriggerExternalConfig(channel, trigger_source_channel, trigger_behaviour) self.module.AWGqueueConfig(channel, 1) # inifnite cycles self.module.AWGqueueWaveform( channel, waveform_id, trigger_source_type, # keysightSD1.SD_TriggerModes.AUTOTRIG, trigger_delay, 1, 0) if self.marker_delay[channel]: self.module.AWGqueueMarkerConfig( channel, # nAWG 2, # each cycle 1 << channel, # PXI channels 1 if channel == 0 else 0, # trigIOmask 1, # value (0 is low, 1 is high) 0, # syncmode self.marker_length[channel], # length5Tclk self.marker_delay[channel]) # delay5Tclk self.module.AWGqueueSyncMode(channel, 1)
def prepare_set_waveform_async(self, waveform, channel): wave = keysightSD1.SD_Wave() if self.waiting_waveform_ids[channel] is None: wave.newFromArrayDouble(0, np.zeros( (50000, )).tolist()) # WAVE_ANALOG_32 self.module.waveformLoad(wave, channel) wave = keysightSD1.SD_Wave() self.waiting_waveform_ids[channel] = channel waveform_id = self.waiting_waveform_ids[channel] waveform_data = np.asarray(waveform).tolist() wave.newFromArrayDouble(0, waveform_data) # WAVE_ANALOG_32 self.module.waveformReLoad(wave, waveform_id, 0) self.waiting_waveforms[channel] = waveform_data
def gaussian_waveform(): # Configure a waveform and send from the AWG using individual commands waveform = ks.SD_Wave() # newFromFile(self, waveformFile) waveform.newFromFile( "C:/Users/Public/Documents/Keysight/SD1/Examples/Waveforms/Gaussian.csv" ) # waveformLoad(self, waveformObject, waveformNumber, paddingMode = 0) AWGobj.waveformFlush() #empties AWG memory AWGobj.waveformLoad(waveform, 0) # channelWaveShape(nChannel, waveShape) -- sets the waveform type for the output channel AWGobj.channelWaveShape(0, ks.SD_Waveshapes.AOU_AWG) # AWG.channelAmplitude(ch, value in Volts) AWGobj.channelAmplitude(0, 1.0) # AWGqueueWaveform(self, nAWG, waveformNumber, triggerMode, startDelay, cycles, prescaler) # triggermode >>> 0=Auto, 1=Software/HVI, 5=S/HVI-perCycle, 2=External Trigger, 6=ExternalTrigger/Cycle AWGobj.AWGqueueWaveform(0, 0, 0, 0, 0, 0) #AWGqueueMarkerConfig(self, nAWG, markerMode, trgPXImask, trgIOmask, value, syncMode, length, delay) # length must be equal or greater than 2 #AWGobj.AWGqueueMarkerConfig(0, 1, 0x01, 0, 1, 0, 2, 0) AWGobj.AWGqueueMarkerConfig(0, ks.SD_MarkerModes.START, 0x01, 0, ks.SD_TriggerValue.HIGH, ks.SD_SyncModes.SYNC_CLK10, 10, 0) AWGobj.AWGstart(0) # Stop the AWG AWGobj.AWGstop(0) # Close the session and clear out variables AWGobj.close()
def loadWaveform(self, channels, waveform, start_delay, waveId=1): """Loads a waveform and enqueues it for all the channels Parameters ---------- channels : [int] A list of channel numbers in the range 1:4. waveform : [float] A list of waveform points, in range of -1.0 to +1.0). start_delay : float The delay from trigger to the waveform being played, in seconds. waveId : int, optional Each waveform is identified with a unique number. The default is 1. Returns ------- TYPE DESCRIPTION. """ log.info("Loading waveform...") if len(waveform) == 0: log.info("Waveform is empty") return -1 # plt.plot(waveform) wave = key.SD_Wave() error = wave.newFromArrayDouble(key.SD_WaveformTypes.WAVE_ANALOG, waveform) if error < 0: log.info("Error Creating Wave - {}".format(error)) error = self.handle.waveformLoad(wave, waveId) if error < 0: log.info("Error Loading Wave - {}".format(error)) start_delay = start_delay / 10E-09 # expressed in 10ns start_delay = int(np.round(start_delay)) log.info("Enqueueing waveform {}, StartDelay = {}".format( waveId, start_delay)) for channel in channels: error = self.handle.AWGqueueWaveform(channel, waveId, key.SD_TriggerModes.SWHVITRIG, start_delay, 1, self.WAVE_PRESCALER) if error < 0: log.info("Queueing waveform failed! - {}".format(error)) error = self.handle.AWGqueueConfig(channel, key.SD_QueueMode.CYCLIC) if error < 0: log.info("Configure cyclic mode failed! - {}".format(error)) error = self.handle.AWGstart(channel) if error < 0: log.info("Starting AWG failed! - {}".format(error)) log.info("Finished Loading waveform") return 1
class testSimple: wave = signadyne.SD_Wave() card = signadyne.SD_AOU() def burstexample(self): waveformFile = ['', '', ''] waveformFile[0] = os.path.join(path_noisefiles, 'Signadyne/AWGN_A.csv') print waveformFile[0] waveformFile[1] = os.path.join(path_noisefiles, 'Signadyne/AWGN_B.csv') waveformFile[2] = os.path.join(path_noisefiles, 'Signadyne/AWGN_C.csv') # Create waveforms objects in PC RAM from waveforms files print(self.card.waveformFlush()) print('wave0') print(self.wave.newFromFile(waveformFile[0])) print(self.card.waveformLoad(self.wave, 0)) print('wave1') print(self.wave.newFromFile(waveformFile[1])) print(self.card.waveformLoad(self.wave, 1)) print('wave2') print(self.wave.newFromFile(waveformFile[2])) print(self.card.waveformLoad(self.wave, 2)) print('Channel') print(self.card.channelWaveShape(nChannel=1, waveShape=6)) print(self.card.channelAmplitude(nChannel=1, amplitude=1.5)) print('queues') print(self.card.AWGflush(1)) print( self.card.AWGqueueWaveform(nAWG=1, waveformNumber=0, triggerMode=0, startDelay=0, cycles=1, prescaler=0)) print( self.card.AWGqueueWaveform(nAWG=1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0)) print( self.card.AWGqueueWaveform(nAWG=1, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0)) print('queueConfig', self.card.AWGqueueConfig(nAWG=1, mode=1)) time.sleep(2) print('AWGstart', self.card.AWGstart(nAWG=1)) return (True, "No Error")
def clearOldWaveforms(self): """Flush AWG queue and remove all cached waveforms""" self.AWG.waveformFlush() self.previous_upload = {(n + 1): np.array([]) for n in range(self.nCh)} self.waveform_sizes = dict() # waveform zero is a 50 us empty waveform used for delays waveform_id = 0 data_zero = np.zeros(int(round(50E-6 / self.dt))) wave = keysightSD1.SD_Wave() wave.newFromArrayDouble(0, data_zero) self.AWG.waveformLoad(wave, waveform_id) # update cached parameters self.previous_upload[waveform_id] = data_zero self.waveform_sizes[waveform_id] = len(data_zero)
def awgQueueWaveform(moduleAOU): #AWG Channel Variables nChannels = 2 hwVer = moduleAOU.getHardwareVersion() if hwVer < 4: CHmin = 0 else: CHmin = 1 #AWG Queue settings for all channels syncMode = keysightSD1.SD_SyncModes.SYNC_CLK10 #keysightSD1.SD_SyncModes.SYNC_CLK10 #keysightSD1.SD_SyncModes.SYNC_NONE queueMode = keysightSD1.SD_QueueMode.ONE_SHOT startDelay = 0 prescaler = 0 nCycles = 0 #Trigger settings triggerMode = keysightSD1.SD_TriggerModes.SWHVITRIG_CYCLE #Load waveform to AWG memory moduleAOU.waveformFlush() #memory flush wave = keysightSD1.SD_Wave() wfmNum = 0 wave.newFromFile( "C:/Users/Public/Documents/Keysight/SD1/Examples/Waveforms/Gaussian.csv" ) moduleAOU.waveformLoad(wave, wfmNum) for nAWG in range(CHmin, CHmin + nChannels): #AWG queue flush moduleAOU.AWGstop(nAWG) moduleAOU.AWGflush(nAWG) #Set AWG mode amplitude = 1 moduleAOU.channelWaveShape(nAWG, keysightSD1.SD_Waveshapes.AOU_AWG) moduleAOU.channelAmplitude(nAWG, amplitude) #AWG configuration moduleAOU.AWGqueueConfig(nAWG, queueMode) moduleAOU.AWGqueueSyncMode(nAWG, syncMode) #Queue waveform to channel nAWG moduleAOU.AWGqueueWaveform(nAWG, wfmNum, triggerMode, startDelay, nCycles, prescaler) moduleAOU.AWGstart(nAWG) #AWG starts and wait for trigger moduleAOU.AWGtrigger( nAWG) #AWG trigger to output a first waveform before the HVI loop
def newWaveform(self, file_arrayA, arrayB=None, waveformType=0): '''Memory usage: Waveforms created with New are stored in the PC RAM, not in the module onboard RAM. Therefore, the limitation in the number of waveforms and their sizes is given by the amount of PC RAM.''' # waveformType 0: Analog 16Bits, Analog normalized waveforms (-1..1) defined with doubles # please refer AWG Waveform types about others wave = keysightSD1.SD_Wave() if isinstance(file_arrayA, str): wave.newFromFile(file_arrayA) return wave else: # 5: DigitalType, Digital waveforms defined with integers if waveformType==5: wave.newFromArrayInteger(waveformType, file_arrayA, arrayB) else: wave.newFromArrayDouble(waveformType, file_arrayA, arrayB) return wave
def sendWaveform(self, ch, waveform_id, data=None): """Send waveform to AWG channel""" # get data from channel, if not available if data is None: data = self.getValueArray('Ch%d - Waveform' % (ch + 1)) # make sure we have at least 30 elements if len(data) < 30: # pad start or end, depending on trig alignment if self.getValue('Waveform alignment') == 'Start at trig': data = np.pad(data, (0, 30 - len(data)), 'constant') else: data = np.pad(data, (30 - len(data), 0), 'constant') # granularity of the awg is 10 if len(data) % 10 > 0: # pad start or end, depending on trig alignment if self.getValue('Waveform alignment') == 'Start at trig': data = np.pad(data, (0, 10 - (len(data) % 10)), 'constant') else: data = np.pad(data, (10 - (len(data) % 10), 0), 'constant') # scale to range amp = self.getChannelValue(ch, 'Amplitude') data_norm = data / amp data_norm = np.clip(data_norm, -1.0, 1.0, out=data_norm) # check if data changed compared to last upload if waveform_id in self.previous_upload: if np.array_equal(data_norm, self.previous_upload[waveform_id]): # data has not changed, no need to upload return # data has changed, update previous value. note: this only happens # for pre-defined waveform_id 1-4, to avoid caching hw looping data self.previous_upload[waveform_id] = data_norm # keep track of waveform lengths self.waveform_sizes[waveform_id] = len(data_norm) # upload waveform wave = keysightSD1.SD_Wave() waveformType = 0 wave.newFromArrayDouble(waveformType, data_norm) ret = self.AWG.waveformLoad(wave, waveform_id) if ret < 0: self.log('Upload error:', keysightSD1.SD_Error.getErrorMessage(ret)) raise UploadFailed()
def amplitude_modulation(channel=0, fc=50e6, wf=None): #out[t] = (A + G*AWG[t]) * cos(2pi fc t + phi) #set carrier cos(2pi fc t + phi) A = 0. AWGobj.channelAmplitude(channel, A) AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_SINUSOIDAL) AWGobj.channelFrequency(channel, fc) G = 1 #modulation gain #load modulating waveform AWG[t] waveform = ks.SD_Wave() if (wf != None): print 'Waveform passed as parameter!' waveform.newFromArrayDouble(waveformType=0, waveformDataA=wf) else: # newFromFile(self, waveformFile) waveform.newFromFile( "C:/Users/Public/Documents/Keysight/SD1/Examples/Waveforms/Gaussian.csv" ) # waveformLoad(self, waveformObject, waveformNumber, paddingMode = 0) AWGobj.waveformFlush() #empties AWG memory AWGobj.waveformLoad(waveform, 0) #loads waveform in module onboard RAM #modulationAmplitudeConfig (nChannel, modulationType, modulationGain), modulationType=1 for amplitude modulation AWGobj.modulationAmplitudeConfig(channel, 1, G) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=0, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueMarkerConfig(0, ks.SD_MarkerModes.START, 0x01, 0, ks.SD_TriggerValue.HIGH, ks.SD_SyncModes.SYNC_CLK10, 10, 0) AWGobj.AWGstart(0) AWGobj.AWGstop(0) AWGobj.close()
def loadWaves(module): for pulseDescriptor in module.pulseDescriptors: if len(pulseDescriptor.pulses) > 1: waves = [] for pulse in pulseDescriptor.pulses: samples = pulseLab.createPulse(module.sample_rate / 5, pulse.width, pulse.bandwidth, pulse.amplitude / 1.5, pulseDescriptor.pri, pulse.toa) if pulse.carrier != 0: carrier = pulseLab.createTone(module.sample_rate, pulse.carrier, 0, samples.timebase) wave = samples.wave * carrier waves.append(samples.wave) wave = interweavePulses(waves) else: #not interleaved, so normal channel pulse = pulseDescriptor.pulses[0] samples = pulseLab.createPulse(module.sample_rate, pulse.width, pulse.bandwidth, pulse.amplitude / 1.5, pulseDescriptor.pri, pulse.toa) wave = samples.wave if pulse.carrier != 0: carrier = pulseLab.createTone(module.sample_rate, pulse.carrier, 0, samples.timebase) wave = wave * carrier waveform = key.SD_Wave() error = waveform.newFromArrayDouble(key.SD_WaveformTypes.WAVE_ANALOG, wave) if error < 0: log.info("Error Creating Wave: {} {}".format( error, key.SD_Error.getErrorMessage(error))) log.info("Loading waveform length: {} as ID: {} ".format( len(wave), pulseDescriptor.id)) error = module.handle.waveformLoad(waveform, pulseDescriptor.id) if error < 0: log.info("Error Loading Wave - {} {}".format( error, key.SD_Error.getErrorMessage(error)))
def waveform_gen_test (ch1=0, ch2=2, fc = 50e6, phase = 0, wait_time=10, AM=False): #configuring trigger AWGobj.triggerIOconfig (direction = ks.SD_TriggerDirections.AOU_TRG_IN, syncMode = ks.SD_SyncModes.SYNC_CLK10) AWGobj.AWGtriggerExternalConfig (nAWG=ch1, externalSource=ks.SD_TriggerExternalSources.TRIGGER_EXTERN, triggerBehavior=ks.SD_TriggerBehaviors.TRIGGER_RISE) AWGobj.AWGtriggerExternalConfig (nAWG=ch2, externalSource=ks.SD_TriggerExternalSources.TRIGGER_EXTERN, triggerBehavior=ks.SD_TriggerBehaviors.TRIGGER_RISE) for i in [ch1, ch2]: print 'Config ch. ',i if AM: A = 0. AWGobj.channelAmplitude(i, A) AWGobj.channelWaveShape(i, ks.SD_Waveshapes.AOU_SINUSOIDAL) AWGobj.channelFrequency(i, fc) G = 0.25 #modulation gain AWGobj.modulationAmplitudeConfig (i, 1, G) else: AWGobj.channelAmplitude(i, .3) AWGobj.channelWaveShape(i, ks.SD_Waveshapes.AOU_AWG) AWGobj.modulationAmplitudeConfig (i, 1, 0) #AWGobj. AWGobj.AWGflush(i) AWGobj.channelPhase (0, 0) AWGobj.channelPhase (2, 90) wf_gauss = ks.SD_Wave() wf_gauss.newFromArrayDouble (waveformType = 0, waveformDataA = gaussian_pulse(200)) wf_wait = ks.SD_Wave() wf_wait.newFromArrayDouble (waveformType = 0, waveformDataA = np.zeros(wait_time)) wf_rect = ks.SD_Wave() wf_rect.newFromArrayDouble (waveformType = 0, waveformDataA = square_pulse(150)) AWGobj.waveformFlush() AWGobj.waveformLoad(wf_gauss, 0); AWGobj.waveformLoad(wf_wait, 1); AWGobj.waveformLoad(wf_rect, 2); #trigger mode: 0 = Auto, 2: external, 6: external-cyclic #AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=0, triggerMode=2, startDelay=0, cycles=2, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=0, triggerMode=2, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=5, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=2, triggerMode=0, startDelay=0, cycles=5, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=5, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=2, triggerMode=0, startDelay=0, cycles=7, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=5, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=2, triggerMode=0, startDelay=0, cycles=10, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=ch1, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch2, waveformNumber=0, triggerMode=2, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch2, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch2, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=ch2, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueConfig (nAWG=ch1, mode=1) AWGobj.AWGqueueConfig (nAWG=ch2, mode=1) ch_mask = 0xF#2**ch1+2**ch2 print 'AWG start...' AWGobj.AWGstartMultiple(ch_mask) time.sleep(50) AWGobj.AWGstopMultiple(ch_mask) print 'AWG stop...' AWGobj.waveformFlush() ''' AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_OFF) AWGobj.AWGqueueConfig (nAWG=channel, mode=0) AWGobj.AWGstart(channel) AWGobj.AWGstop(channel) ''' AWGobj.AWGflush(ch1) AWGobj.AWGflush(ch2) AWGobj.close()
class Test_HVItriggersync(Test): # Dummy attributes Amplitude = 1 wave_id = 1 prescaler = 0 start_delay = 0 cycles = 100 # Attributes accessible through object initialization test_key = "HVItriggersync" master_slot = None slave_slot = None master_index = None #index in HVI sequence (might need this if HVI project is built in simulate mode) slave_index = None #index in HVI sequence (might need this if HVI project is built in simulate mode) master_channel = None slave_channel = None # Attributes accessible through class methods master_module = keysightSD1.SD_AOU( ) #assigned with call to associate() method slave_module = keysightSD1.SD_AOU( ) #assigned with call to associate() method waveform = keysightSD1.SD_Wave() hvi = keysightSD1.SD_HVI() def __init__(self, module_dict, master_slot, slave_slot, master_channel, slave_channel, master_index=0, slave_index=1): super().__init__(module_dict) self.master_slot = master_slot self.slave_slot = slave_slot self.master_index = master_index self.slave_index = slave_index self.master_channel = master_channel self.slave_channel = slave_channel self._associate() # This private method associates the master & slave modules (publicly accessible) of this test with the modules # created in the base class def _associate(self): for module in self._module_instances: if module[2][ 1] == self.master_slot: # if a module was found in master_slot, assign it to master_module self.master_module = module[0] elif module[2][ 1] == self.slave_slot: # if a module was found in slave_slot, assign it to slave_module self.slave_module = module[0] else: print( "[ERROR] Associate function: Module found in slot that was not specified as master or slave" ) def send_PXI_trigger_pulse(self, PXI_line_nbr, delay=.2): time.sleep(delay) self.master_module.PXItriggerWrite(PXI_line_nbr, 0) time.sleep(delay) self.master_module.PXItriggerWrite(PXI_line_nbr, 1) def set_waveform(self, filestr): self.waveform.newFromFile(filestr) print( "Loaded {} into HVI Trigger Sync Test's waveform".format(filestr)) def set_hvi(self, filestr): self.hvi.open(filestr) self.hvi.compile() self.hvi.load() print("Loaded {}.HVI into HVI Trigger Sync Test".format(filestr))
def add_waveform(self, filestr): wave = keysightSD1.SD_Wave() wave.newFromFile(filestr) self.waveform_array.append(wave) print("Loaded {} into Fast Branching Test's waveform array".format( filestr))
def waveform_gen_test(channel=0, fc=50e6, wait_time=10, repeat_cycle=0, load_waveforms=False): #set carrier cos(2pi fc t + phi) A = 0. AWGobj.channelAmplitude(channel, A) AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_SINUSOIDAL) AWGobj.channelFrequency(channel, fc) G = 0.5 #modulation gain #load modulating waveform AWG[t] if load_waveforms: wf_gauss = ks.SD_Wave() wf_gauss.newFromArrayDouble(waveformType=0, waveformDataA=gaussian_pulse(50)) wf_wait = ks.SD_Wave() wf_wait.newFromArrayDouble(waveformType=0, waveformDataA=np.zeros(wait_time)) wf_rect = ks.SD_Wave() wf_rect.newFromArrayDouble(waveformType=0, waveformDataA=np.ones(50)) AWGobj.waveformFlush() AWGobj.AWGflush(0) AWGobj.waveformLoad(wf_gauss, 0) AWGobj.waveformLoad(wf_wait, 1) AWGobj.waveformLoad(wf_rect, 2) AWGobj.modulationAmplitudeConfig(channel, 1, G) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=2, triggerMode=0, startDelay=0, cycles=2, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=1, triggerMode=0, startDelay=0, cycles=3, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueConfig(nAWG=0, mode=repeat_cycle) print 'AWG start...' AWGobj.AWGstart(0) time.sleep(5) AWGobj.AWGstop(0) print 'AWG stop...' AWGobj.waveformFlush() AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_OFF) AWGobj.AWGqueueConfig(nAWG=0, mode=0) AWGobj.AWGstart(0) AWGobj.AWGstop(0) AWGobj.AWGflush(0) AWGobj.close()
class Test_HVIexternaltrigger(Test): # Dummy attributes Amplitude = 1 wave_id = 1 prescaler = 0 start_delay = 0 cycles = 0 # Attributes accessible through object initialization test_key = "HVI external trigger" module_a_slot = None module_a_channel = None module_b_slot = None module_b_channel = None # Attributes accessible through class methods module_a = keysightSD1.SD_AOU() module_b = keysightSD1.SD_AOU() waveform = keysightSD1.SD_Wave() hvi = keysightSD1.SD_HVI() def __init__(self, module_dict, module_a_slot, module_a_channel, module_b_slot, module_b_channel): super().__init__(module_dict) self.module_a_slot = module_a_slot self.module_a_channel = module_a_channel self.module_b_slot = module_b_slot self.module_b_channel = module_b_channel self._associate() # This private method associates the module modules (publicly accessible) of this test with the modules # created in the base class def _associate(self): for module in self._module_instances: if module[2][ 1] == self.module_a_slot: # if a module was found in master_slot, assign it to master_module self.module_a = module[0] elif module[2][1] == self.module_b_slot: self.module_b = module[0] else: print( "[ERROR] Associate function: Module found in slot that was not specified as master or slave" ) def send_PXI_trigger_pulse(self, PXI_line_nbr, delay=.2): time.sleep(delay) self.module.PXItriggerWrite(PXI_line_nbr, 0) time.sleep(delay) self.module.PXItriggerWrite(PXI_line_nbr, 1) def set_waveform(self, filestr): self.waveform.newFromFile(filestr) print( "Loaded {} into HVI Trigger Sync Test's waveform".format(filestr)) def set_hvi(self, filestr): self.hvi.open(filestr) self.hvi.compile() self.hvi.load() print("Loaded {}.HVI into HVI Trigger Sync Test".format(filestr))
import keysightSD1 import time num_waveforms = 1000 num_trigs = 1000 awg = keysightSD1.SD_AOU() awg_id = awg.openWithSlot("", 1, 7) # error_flush = awg.AWGflush(1) error_waveshape = awg.channelWaveShape(1, keysightSD1.SD_Waveshapes.AOU_AWG) wave = keysightSD1.SD_Wave() error_createwave = wave.newFromFile(r"C:\Users\Administrator\PycharmProjects\HVITestBench\Sin_10MHz_20456_samples.csv") # error_createwave = wave.newFromFile(r'C:\Users\Public\Documents\Keysight\SD1\Examples\Waveforms\Sin_10MHz_50samples_192cycles.csv') error_waveformload = awg.waveformLoad(wave, 1, 0) error_queueconfig = awg.AWGqueueConfig(1, keysightSD1.SD_QueueMode.CYCLIC) for i in range(0,num_waveforms): error_queue = awg.AWGqueueWaveform(1, 1, keysightSD1.SD_TriggerModes.SWHVITRIG_CYCLE, 0, 1, 0) # awg.AWGqueueWaveform(nAWG, waveformNumber=, triggerMode=, startDelay=,cycles=,prescaler=) for i in range(0,num_trigs): print("Sending %s trigger"%i) error_trigger = awg.AWGtrigger(1) time.sleep(.3)
def _fast_branching_hw_config(Test_obj): # Need to configure each module in the test for module_inst in Test_obj.module_instances: moduleAOU = module_inst[0] # AWG Settings Variables hwVer = moduleAOU.getHardwareVersion() if hwVer < 4: nAWG = 0 else: nAWG = 1 # AWG reset moduleAOU.AWGstop(nAWG) moduleAOU.waveformFlush() moduleAOU.AWGflush(nAWG) # Set AWG mode amplitude = 1.0 moduleAOU.channelWaveShape(nAWG, keysightSD1.SD_Waveshapes.AOU_AWG) moduleAOU.channelAmplitude(nAWG, amplitude) # Queue settings syncMode = keysightSD1.SD_SyncModes.SYNC_NONE queueMode = keysightSD1.SD_QueueMode.ONE_SHOT moduleAOU.AWGqueueConfig(nAWG, queueMode) moduleAOU.AWGqueueSyncMode(nAWG, syncMode) # Create a pulsed waveform wfmType = keysightSD1.SD_WaveformTypes.WAVE_ANALOG wfmLen = 200 wfmNum = 1 wfmNum1 = 2 onTime = 50 wfmData = [] for ii in range(0, wfmLen): value = 0.0 if ii < onTime: value = 1.0 wfmData.append(value) wave = keysightSD1.SD_Wave() wave.newFromArrayDouble(wfmType, wfmData) error = moduleAOU.waveformLoad(wave, wfmNum) if (error < 0): print("WaveformLoad0 error ", error) # Create a ramp waveform wfmData1 = [] for ii in range(0, wfmLen): value = 0.0 if ii < onTime: value = float(ii) / onTime wfmData1.append(value) wave1 = keysightSD1.SD_Wave() wave1.newFromArrayDouble(wfmType, wfmData1) error = moduleAOU.waveformLoad(wave1, wfmNum1) if (error < 0): print("WaveformLoad1 error ", error) moduleAOU.AWGstart(nAWG)
def waveform_gen_test(channel=0, fc=50e6, wait_time=10, AM=False): #configuring trigger AWGobj.triggerIOconfig(direction=ks.SD_TriggerDirections.AOU_TRG_IN, syncMode=ks.SD_SyncModes.SYNC_CLK10) AWGobj.AWGtriggerExternalConfig( nAWG=channel, externalSource=ks.SD_TriggerExternalSources.TRIGGER_EXTERN, triggerBehavior=ks.SD_TriggerBehaviors.TRIGGER_RISE) if AM: A = 0. AWGobj.channelAmplitude(channel, A) AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_SINUSOIDAL) AWGobj.channelFrequency(channel, fc) G = 1 #modulation gain AWGobj.modulationAmplitudeConfig(channel, 1, G) else: AWGobj.channelAmplitude(channel, 1.) AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_AWG) wf_gauss = ks.SD_Wave() wf_gauss.newFromArrayDouble(waveformType=0, waveformDataA=gaussian_pulse(200)) wf_wait = ks.SD_Wave() wf_wait.newFromArrayDouble(waveformType=0, waveformDataA=np.zeros(wait_time)) wf_rect = ks.SD_Wave() sq_pulse = 0.5 * np.ones(200) wf_rect.newFromArrayDouble(waveformType=0, waveformDataA=sq_pulse) #plt.plot (sq_pulse) #plt.show() AWGobj.waveformFlush() AWGobj.AWGflush(channel) AWGobj.waveformLoad(wf_gauss, 0) AWGobj.waveformLoad(wf_wait, 1) AWGobj.waveformLoad(wf_rect, 2) #trigger mode: 0 = Auto, 2: external, 6: external-cyclic #AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=0, triggerMode=2, startDelay=0, cycles=2, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=channel, waveformNumber=0, triggerMode=2, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=channel, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=channel, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=channel, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueConfig(nAWG=channel, mode=1) print 'AWG start...' AWGobj.AWGstart(channel) time.sleep(5) AWGobj.AWGstopMultiple(channel) print 'AWG stop...' AWGobj.waveformFlush() AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_OFF) AWGobj.AWGqueueConfig(nAWG=channel, mode=0) AWGobj.AWGstart(channel) AWGobj.AWGstop(channel) AWGobj.AWGflush(channel) AWGobj.close()
def AWGUpload(self, seq): ''' Uploade into the AWG board RAM and queue. Input: Sequence Class. Output: None ''' for i in range(len(seq.waveform_list)): temp_Wave = keysightSD1.SD_Wave() temp_Wave.newFromArrayDouble(0, seq.waveform_list[i]) self.AWG1.waveformLoad(temp_Wave, i, 0) self.MARK1.waveformLoad(temp_Wave, i, 0) sequence_list = seq.sequence_list waveform_list = seq.waveform_list ''' newFromArrayDouble(int waveformType, double waveformData) waveformType(0: Analog 16bits; 1: Analog 32bits) waveformLoad / into the module onboard RAM (SD Wave waveform Object, int waveformNumber, int paddingMode) padding mode: (default 0) AWGqueueWaveform(int nAWG, int waveformNumber, int triggerMode, int startDelay (10ns) < must smaller than 65536 ns, int cycles, int prescaler) triggerMode(0: Auto; 1: SWHVITRIG; 5: SWHVITRIG_CYCLE; 2: EXTRIG; 6: EXTRIG_CYCLE) ''' for i in range(8): if len(sequence_list[i]) != 0: wait_time = 0 if i <= 3: num_seq = 0 for k in range(len(sequence_list[i])): time_delay = sequence_list[i][k][1] - wait_time if sequence_list[i][k][2] == 1: time_delay = sequence_list[i][k][1] - \ seq.sequence_length * num_seq num_seq += 1 self.AWG1.AWGqueueWaveform(i+1, sequence_list[i][k][0], sequence_list[i][k][2], time_delay/10, 1, 0) wait_time = sequence_list[i][k][1] + \ len(waveform_list[sequence_list[i][k][0]]) else: wait_time = 0 num_seq = 0 for k in range(len(sequence_list[i])): time_delay = sequence_list[i][k][1] - wait_time if sequence_list[i][k][2] == 1: time_delay = sequence_list[i][k][1] - \ seq.sequence_length * num_seq num_seq += 1 self.MARK1.AWGqueueWaveform(i-3,sequence_list[i][k][0], sequence_list[i][k][2], time_delay/10, 1, 0) wait_time = sequence_list[i][k][1] + \ len(waveform_list[sequence_list[i][k][0]]) * 2 print "Upload wave Succeed" print 'Wait for 1 sec, AWG and Mark start wait for trigger' time.sleep(1) self.AWG1.AWGstartMultiple(0b1111) self.MARK1.AWGstartMultiple(0b1111) return 0
def write_waveform(self, name, analog_samples, digital_samples, is_first_chunk, is_last_chunk, total_number_of_samples): """ Write a new waveform or append samples to an already existing waveform on the device memory. @param name: str, waveform name, human readabla @param analog_samples: numpy.ndarray of type float32 containing the voltage samples @param digital_samples: numpy.ndarray of type bool containing the marker states (if analog channels are active, this must be the same length as analog_samples) @param is_first_chunk: bool, flag indicating if it is the first chunk to write. If True this method will create a new empty wavveform. If False the samples are appended to the existing waveform. @param is_last_chunk: bool, flag indicating if it is the last chunk to write. Some devices may need to know when to close the appending wfm. @param total_number_of_samples: int, The number of sample points for the entire waveform (not only the currently written chunk) @return: (int, list) number of samples written (-1 indicates failed process) and list of created waveform names """ tstart = datetime.datetime.now() self.log.debug('@{} write wfm: {} first: {} last: {} {}'.format( datetime.datetime.now() - tstart, name, is_first_chunk, is_last_chunk, total_number_of_samples)) waveforms = list() min_samples = 30 if not (is_first_chunk and is_last_chunk): self.log.error('Chunked Write not supported by this device.') return -1, waveforms # Sanity checks if len(analog_samples) == 0: self.log.error('No analog samples passed to write_waveform.') return -1, waveforms if total_number_of_samples < min_samples: self.log.error('Unable to write waveform.' '\nNumber of samples to write ({0:d}) is ' 'smaller than the allowed minimum waveform length ({1:d}).' ''.format(total_number_of_samples, min_samples)) return -1, waveforms # determine active channels activation_dict = self.get_active_channels() active_channels = {chnl for chnl in activation_dict if activation_dict[chnl]} active_analog = natural_sort(chnl for chnl in active_channels if chnl.startswith('a')) # Sanity check of channel numbers if active_channels != set(analog_samples.keys()).union(set(digital_samples.keys())): self.log.error('Mismatch of channel activation and sample array dimensions for ' 'waveform creation.\nChannel activation is: {0}\nSample arrays have: ' ''.format(active_channels, set(analog_samples.keys()).union(set(digital_samples.keys())))) return -1, waveforms for a_ch in active_analog: a_ch_num = self.__ch_map[a_ch] wfm_name = '{0}_ch{1:d}'.format(name, a_ch_num) wfm = ksd1.SD_Wave() analog_samples[a_ch] = analog_samples[a_ch].astype('float64') / 2 self.log.debug('wfmobj: {} {} {} min: {} max: {}'.format( a_ch, name, wfm_name, np.min(analog_samples[a_ch]), np.max(analog_samples[a_ch]))) self.log.debug('@{} Before new wfm {}'.format(datetime.datetime.now() - tstart, a_ch)) wfmid = self._fast_newFromArrayDouble( wfm, ksd1.SD_WaveformTypes.WAVE_ANALOG, analog_samples[a_ch]) self.log.debug('@{} After new wfm {}'.format(datetime.datetime.now() - tstart, a_ch)) if wfmid < 0: self.log.error('Device error when creating waveform {} ch: {}: {} {}' ''.format(wfm_name, a_ch, wfmid, ksd1.SD_Error.getErrorMessage(wfmid))) return -1, waveforms if len(self.written_waveforms) > 0: wfm_nr = max(set(self.written_waveforms.values())) + 1 else: wfm_nr = 1 self.log.debug('@{} Before loading wfm {} '.format(datetime.datetime.now() - tstart, a_ch)) written = self.awg.waveformLoad(wfm, wfm_nr) self.log.debug('@{} Samples written: {} {} '.format(datetime.datetime.now() - tstart, a_ch, wfm, written)) if written < 0: self.log.error('Device error when uploading waveform {} id: {}: {} {}' ''.format(wfm, wfm_nr, written, ksd1.SD_Error.getErrorMessage(written))) return -1, waveforms self.written_waveforms[wfm_name] = wfm_nr waveforms.append(wfm_name) self.log.debug('@{} Finished writing waveforms'.format(datetime.datetime.now() - tstart)) return total_number_of_samples, waveforms
def amplitude_modulation_ramsey2(channel=0, fc=50e6, wait_time=10): #out[t] = (A + G*AWG[t]) * cos(2pi fc t + phi) tr_ch = 2 #set carrier cos(2pi fc t + phi) A = 0. AWGobj.channelAmplitude(channel, A) AWGobj.channelWaveShape(channel, ks.SD_Waveshapes.AOU_SINUSOIDAL) AWGobj.channelWaveShape(tr_ch, ks.SD_Waveshapes.AOU_AWG) #AWGobj.channelAmplitude(tr_ch, .5) AWGobj.channelFrequency(channel, fc) G = 0.5 #modulation gain #load modulating waveform AWG[t] wf_pi = ks.SD_Wave() wf_pi.newFromArrayDouble(waveformType=0, waveformDataA=gaussian_pulse(50)) wf_wait = ks.SD_Wave() wf_wait.newFromArrayDouble(waveformType=0, waveformDataA=np.zeros(wait_time)) wf_pi2 = ks.SD_Wave() wf_pi2.newFromArrayDouble(waveformType=0, waveformDataA=pi_pulse(50)) AWGobj.waveformFlush() AWGobj.waveformLoad(wf_pi, 0) AWGobj.waveformLoad(wf_wait, 1) AWGobj.waveformLoad(wf_pi2, 2) #modulationAmplitudeConfig (nChannel, modulationType, modulationGain), modulationType=1 for amplitude modulation AWGobj.modulationAmplitudeConfig(channel, 1, G) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=2, triggerMode=0, startDelay=0, cycles=2, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=1, triggerMode=0, startDelay=0, cycles=3, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=0, waveformNumber=1, triggerMode=0, startDelay=0, cycles=1, prescaler=0) ''' AWGobj.AWGqueueWaveform(nAWG=2, waveformNumber=0, triggerMode=0, startDelay=0, cycles=7, prescaler=0) AWGobj.AWGqueueWaveform(nAWG=2, waveformNumber=1, triggerMode=0, startDelay=0, cycles=4, prescaler=0) #AWGobj.AWGqueueWaveform(nAWG=2, waveformNumber=2, triggerMode=0, startDelay=0, cycles=1, prescaler=0) ''' #AWGqueueConfig (nAWG, mode) #mode: 0: one shot, 1: cyclic AWGobj.AWGqueueConfig(nAWG=0, mode=0) #AWGobj.AWGqueueConfig (nAWG=2, mode=0) #AWGqueueMarkerConfig (nAWG, markerMode, trgPXImask, trgIOmask, value, syncMode, length5Tclk, delay5Tclk) #markerMode: operation mode of the queue: 0: disabled, 1: on WF start, 2: on WF start after WF delay # 3: ON every cycle, 4: End (not implemented) #trgPXImask: mask to select PXI triggers to use (bit0: PXItrg0, etc, etc) #trgIO mask: mask to select front-panel triggers to use (bit0: triggerIO) #vlaue: 0: low, 1: high #syncMode: 0: immediate, 1: sync10 #length: pulse length in multiples of TCLK x 5 #delay: pulse delay in multiples of TCLK x 5 AWGobj.AWGqueueMarkerConfig(nAWG=0, markerMode=ks.SD_MarkerModes.START, trgPXImask=0x01, trgIOmask=0, value=ks.SD_TriggerValue.HIGH, syncMode=ks.SD_SyncModes.SYNC_CLK10, length=10, delay=0) #AWGobj.triggerIOconfig (direction = ks.SD_TriggerDirections.AOU_TRG_OUT, syncMode = ks.SD_SyncModes.SYNC_NONE) #AWGobj.triggerIOwrite (value=1) AWGobj.AWGstart(0) for i in np.arange(3): time.sleep(1) print AWGobj.AWGisRunning(0) AWGobj.AWGstop(0) print AWGobj.AWGisRunning(0) #AWGobj.AWGreset(0) AWGobj.waveformFlush() print AWGobj.AWGisRunning(0) ''' AWGobj.AWGstartMultiple (0x05) time.sleep(5) AWGobj.AWGstopMultiple (0xF) AWGobj.AWGstop(0) AWGobj.AWGstop(2) ''' #AWGobj.triggerIOwrite(value=0) AWGobj.close()
def AWGqueueWfm(moduleAOU): error = 0 # AWG Settings Variables hwVer = moduleAOU.getHardwareVersion() if hwVer < 4: nAWG = 0 else: nAWG = 1 # AWG reset moduleAOU.AWGstop(nAWG) moduleAOU.waveformFlush() moduleAOU.AWGflush(nAWG) # Set AWG mode amplitude = 1.0 moduleAOU.channelWaveShape(nAWG, keysightSD1.SD_Waveshapes.AOU_AWG) moduleAOU.channelAmplitude(nAWG, amplitude) # Queue settings syncMode = keysightSD1.SD_SyncModes.SYNC_NONE queueMode = keysightSD1.SD_QueueMode.ONE_SHOT moduleAOU.AWGqueueConfig(nAWG, queueMode) moduleAOU.AWGqueueSyncMode(nAWG, syncMode) # Create a pulsed waveform wfmType = keysightSD1.SD_WaveformTypes.WAVE_ANALOG wfmLen = 200 wfmNum = 1 wfmNum1 = 2 onTime = 50 wfmData = [] for ii in range(0, wfmLen): value = 0.0 if ii < onTime: value = 1.0 wfmData.append(value) wave = keysightSD1.SD_Wave() wave.newFromArrayDouble(wfmType, wfmData) # wave.newFromFile("C:\\Users\\Public\\Documents\\Keysight\\SD1\\Examples\\Waveforms\\Gaussian.csv") error = moduleAOU.waveformLoad(wave, wfmNum) if (error < 0): print("WaveformLoad0 error ", error) # Create a ramp waveform wfmData1 = [] for ii in range(0, wfmLen): value = 0.0 if ii < onTime: value = float(ii) / onTime wfmData1.append(value) wave1 = keysightSD1.SD_Wave() wave1.newFromArrayDouble(wfmType, wfmData1) # wave1.newFromFile("C:\\Users\\Public\\Documents\\Keysight\\SD1\\Examples\\Waveforms\\Exponential.csv") error = moduleAOU.waveformLoad(wave1, wfmNum1) if (error < 0): print("WaveformLoad1 error ", error) moduleAOU.AWGstart(nAWG)
# Otherwise, a new trigger is required to actuate each cycle prescaler = 0 # Integer division reduces high freq signals to lower frequency # ---------- # Select settings and use specified variables awg = keysightSD1.SD_AOU() # Creates SD_AOU object called awg awg.openWithSlot(product, chassis, slot) # Connects awg object to module awg.channelAmplitude(channel, amplitude) # Sets output amplitude for awg awg.channelWaveShape(channel, waveshape) # Sets output signal type for awg awg.waveformFlush() # Cleans the queue awg.AWGflush(channel) # Stops signal from outputing out of channel 1 # Create an array that represents a sawtooth signal using "numpy" array = numpy.zeros(10000) # Create array of zeros with 1000 elements array[0] = -1 # Initialize element 0 as -0.5 for i in range(1, len(array)): # This for..loop will increment from -0.5 array[i] = array[i - 1] + .0002 # Increment by .001 every iteration wave = keysightSD1.SD_Wave() # Create SD_Wave object and call it "wave" # (will place the array inside "wave") error = wave.newFromArrayDouble( keysightSD1.SD_WaveformTypes.WAVE_ANALOG, array.tolist()) # Place the array into the "wave" object waveID = 0 # This number is arbitrary and used to identify the waveform awg.waveformLoad(wave, waveID) # Load the "wave" object and give it an ID awg.AWGqueueWaveform(channel, waveID, keysightSD1.SD_TriggerModes.SWHVITRIG, delay, cycles, prescaler) # Queue waveform to prepare it to be output # ---------- awg.AWGstart(channel) # Start the AWG awg.AWGtrigger(channel) # Trigger the AWG to begin # ---------- # Close the connection between the AWG object and the physical AWG hardware. awg.close()