• 0
spri

Analog Scope - what prompts change in DwfState?

Question

I'm currently trying to synchronize analog pulses on both AWGs with digital pulses, and simultaneously run both analog scopes and the digital scope. I am trying to trigger all outputs and all scope acquisitions to happen simultaneously with a single PC-Trigger source using the SDK. 

First question: Why isn't there an AnalogInTriggerSlopeSet function? (You can set the TriggerSlope to rising edge for AnalogOut, DigitalOut, and DigitalIn). Without an AnalogInTriggerSlopeSet function, how do you set the AnalogInTrigger to respond to the same signal as the other three? 

Second Question: What prompts the change in Analog/DigitalInStatus from 'prefill' to 'armed' or 'done'? In the Acquisition code in the SDK, it looks like the status changes when the buffer fills? In my code below, why isn't it progressing to 2=Done to break out of the loop? It looks like it is getting stuck waiting for the trigger (which already happened).  

 

            #digital pulse control setup                         
            self.dwf.FDwfDigitalOutEnableSet(hdwf, c_int(0), c_int(1)) # enable dIO pin 0
            self.dwf.FDwfDigitalOutDividerSet(hdwf, c_int(0), c_int(int(hzSys.value/(100*self.qRate)))) # divider=internal clock/ (100counts*frequency)
            self.dwf.FDwfDigitalOutCounterSet(hdwf, c_int(0), c_int(100-self.qDuty), c_int(self.qDuty)) # set counts low, counts high from duty cycle     
            print "configured digital output"
                 
            # analog pulse control setup
            self.dwf.FDwfAnalogOutNodeEnableSet(hdwf, c_int(0), AnalogOutNodeCarrier, c_int(True))
            self.dwf.FDwfAnalogOutNodeEnableSet(hdwf, c_int(1), AnalogOutNodeCarrier, c_int(True))
            # for second channel set master the first channel, slave channel is controlled by the master
            self.dwf.FDwfAnalogOutMasterSet(hdwf, c_int(1), c_int(0));
 
            self.dwf.FDwfAnalogOutNodeFunctionSet(hdwf, c_int(-1), AnalogOutNodeCarrier, funcSquare)
            self.dwf.FDwfAnalogOutNodeFrequencySet(hdwf, c_int(-1), AnalogOutNodeCarrier, c_double(self.xRate))
            self.dwf.FDwfAnalogOutNodeAmplitudeSet(hdwf, c_int(-1), AnalogOutNodeCarrier, c_double(0.5)) 
            self.dwf.FDwfAnalogOutOffsetSet(hdwf, c_int(-1), c_double(0.5))
            self.dwf.FDwfAnalogOutNodeSymmetrySet(hdwf, c_int(-1), AnalogOutNodeCarrier, c_double(symm)) #pulse width
            self.dwf.FDwfAnalogOutNodePhaseSet(hdwf, c_int(1), AnalogOutNodeCarrier, c_double(self.x2Phase)) #phase shift for second channel
            self.dwf.FDwfAnalogOutRunSet(hdwf, c_int(-1), c_double(self.xDuration))  #set run duration on all channels
            self.dwf.FDwfAnalogOutIdleSet(hdwf,c_int(-1), c_int(0))
            print "configured analog output"
            
            #configure digital input scope               
            self.dwf.FDwfDigitalInDividerSet(hdwf, c_int(int(hzSys.value/(100*self.xRate)))) #same sample rate as xray
            self.dwf.FDwfDigitalInSampleFormatSet(hdwf, c_int(16))            # 16bit per sample format
            cSamples = 1000 # set number of sample to acquire
            rgwSamples = (c_uint16*cSamples)()
            self.dwf.FDwfDigitalInBufferSizeSet(hdwf, c_int(cSamples))
            print "configured digital input"
            
            #configure analog input scope 
            self.dwf.FDwfAnalogInFrequencySet(hdwf, c_double(int(hzSys.value/(100*self.xRate))))
            self.dwf.FDwfAnalogInBufferSizeSet(hdwf, c_int(1000)) 
            
            self.dwf.FDwfAnalogInChannelEnableSet(hdwf, c_int(0), c_bool(True))
            self.dwf.FDwfAnalogInChannelRangeSet(hdwf, c_int(0), c_double(5))
            
            self.dwf.FDwfAnalogInChannelEnableSet(hdwf, c_int(1), c_bool(True))
            self.dwf.FDwfAnalogInChannelRangeSet(hdwf, c_int(1), c_double(5))              
            
            rg1 = (c_double*1000)()   #rg = pointer to allocated buffer to copy the acquisition data
            rg2 = (c_double*1000)()   #rg = pointer to allocated buffer to copy the acquisition data
            print "configured analog input"

            #set up PC trigger to start pulse output AND acquisition
            self.dwf.FDwfAnalogOutTriggerSourceSet(hdwf, c_int(0), trigsrcPC)
            self.dwf.FDwfDigitalOutTriggerSourceSet(hdwf, trigsrcPC)
            self.dwf.FDwfAnalogOutTriggerSlopeSet(hdwf, c_int(0), c_int(0)) # set channel 1 to trigger on rising edge
            self.dwf.FDwfDigitalOutTriggerSlopeSet(hdwf, c_int(0))
            
            self.dwf.FDwfDigitalInTriggerSourceSet(hdwf, trigsrcPC)
            self.dwf.FDwfDigitalInTriggerSlopeSet(hdwf, c_int(0))  #rising edge
            
            self.dwf.FDwfAnalogInTriggerSourceSet(hdwf, trigsrcPC)
#            self.dwf.FDwfAnalogInTriggerSlopeSet(hdwf,) #this command doesn't exist for analogin!
            print "set up triggers"
           
            #configure everything to wait for trigger
            self.dwf.FDwfAnalogOutConfigure(hdwf, c_int(0), c_bool(True)) # start master, slave will follow 
            self.dwf.FDwfDigitalOutConfigure(hdwf, c_int(1))
            self.dwf.FDwfDigitalInConfigure(hdwf, c_bool(0), c_bool(1))
            self.dwf.FDwfAnalogInConfigure(hdwf, c_int(1), c_int(1))  # starts both analog in pins (hdwf, bool-reconfigure, bool-start)
            print "initialized pins"            
            
            #send the trigger
            self.dwf.FDwfDeviceTriggerPC(hdwf)
            print "PC trigger pulse sent"
            
            #plot the things
            sts = c_int()
            while True:  #data acquisition status should == 5 - filling buffer               
                self.dwf.FDwfDigitalInStatus(hdwf, c_int(1), byref(sts))
                sts1 = sts.value
                self.dwf.FDwfAnalogInStatus(hdwf, c_int(1), byref(sts))
                print ("analog status = " + str(sts.value))
                print ("digital status = " +str(sts1))
                if sts.value == DwfStateDone.value :    #status ==2 = done
                    print "acquisition complete"                 
                    break

When I run this, this is my printout: image.png.d22d9dcf224bfedbd7d0931d07452e31.png

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Hi @spri

1. BOOL FDwfAnalogInTriggerConditionSet(HDWF hdwf, DwfTriggerSlope trigcond);

2. The duration of prefill depends on the acquisition rate and the number of pre-trigger samples (trigger position in the buffer).

Before the trigger signal make sure the instruments are in armed state:

...
sts = c_int()
while True: # wait to be armed
  self.dwf.FDwfDigitalInStatus(hdwf, c_int(0), byref(sts))
  if sts.value != DwfStateArmed.value :
    continue
  self.dwf.FDwfAnalogInStatus(hdwf, c_int(0), byref(sts))
  if sts.value != DwfStateArmed.value :
    continue
  break

#send the trigger
self.dwf.FDwfDeviceTriggerPC(hdwf)
...

 

Share this post


Link to post
Share on other sites
  • 0

Thanks, I got the TriggerConditionSet fixed. 

I understand the purpose/function of the loop you provided. However, before the trigger, I am now getting stuck with the analog status in prefill -- it never progresses to 'armed' (the digital status switches from prefill to armed in one iteration through the loop). I tried changing the TriggerPositionSet (based on other forum posts), but it hasn't changed the problem. Can you explain more how the prefill works?

Thank you!

Share this post


Link to post
Share on other sites
  • 0

Hi @spri

The instruments move to prefill state to fill the buffer with required pre-trigger samples. This is done to fill the left side of the T0 and only after this will move to armed state waiting for trigger.

FDwfAnalogInTriggerPositionSet(HDWF hdwf, double secPosition);
secPosition - relative to the middle of the screen, with zero half pre-trigger half post trigger data
FDwfDigitalInTriggerPositionSet(HDWF hdwf, unsigned int cSamplesAfterTrigger);
cSamplesAfterTrigger - samples after trigger, half of the buffer size is the middle of the buffer

I don't see your whole code so I don't see what could be wrong. You might try the following or add time.sleep(#) before trigger-pc to cover the pre-fill cycle:

...
sts = c_int()
while True: # wait to finish prefill
  self.dwf.FDwfDigitalInStatus(hdwf, c_int(0), byref(sts))
  if sts.value != DwfStatePrefill.value :
    break
while True: # wait to finish prefill
  self.dwf.FDwfAnalogInStatus(hdwf, c_int(0), byref(sts))
  if sts.value != DwfStatePrefill.value :
    break

#send the trigger
self.dwf.FDwfDeviceTriggerPC(hdwf)
...

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now