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
Example #3
0
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()
Example #4
0
    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
Example #5
0
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)
Example #7
0
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
Example #8
0
 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()
Example #10
0
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()
Example #11
0
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()
Example #13
0
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))
Example #14
0
 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()
Example #16
0
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)
Example #19
0
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()
Example #20
0
 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
Example #21
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
Example #22
0
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)
Example #24
0
# 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()