Esempio n. 1
0
    def run_simple(self, bias, samples = 1.0, gateDelay = 0.75, field = 0.0, 
                   biasDivider = 1e-3, cvAmp = -1e-6, gateAmp = 9.1788, 
                   filename = 'DAQIO_gateTest_{0:.0f}'.format(time.time())):
        
        """ This runs the actual experiment. It can be called independently of the
            run() function. """
        
        tools.write_log('DAQIO_gateTest', locals(), filename+'.log.txt')
        file = open(filename+'.dat.txt','a')
        self.end_run = False
        
        #setup output channels
        bias_channel = 'Dev1/ao0'
        bias_out = nidaqmx.AnalogOutputTask()
        bias_out.create_voltage_channel(bias_channel, min_val = -10.0, max_val = 10.0)
        
        gate_channel = 'Dev1/ao1'
        gate_out = nidaqmx.AnalogOutputTask()
        gate_out.create_voltage_channel(gate_channel, min_val = -10.0, max_val = 10.0)
        
        gat = np.arange(0,10.1,0.1)
        gates = np.append(gat, [gat[::-1], -gat, -gat[::-1]])
        self.data = np.zeros((len(gates), samples+3))
        sample_data = np.zeros((samples,1))
        
        #setup input channel
        input_channel = 'Dev1/ai0' #if using differential mode this should be the high side
        sample_rate = 5000
        itask = nidaqmx.AnalogInputTask()
        itask.create_voltage_channel(input_channel, terminal = 'diff', min_val = -10.0, max_val = 10.0)
        itask.configure_timing_sample_clock(rate = sample_rate, samples_per_channel = samples, 
                                            sample_mode = 'finite')
        itask.alter_state('commit')
        
        print 'bias turning on...'
        bias_out.write(bias/biasDivider)
        time.sleep(10.0)

        #run experiment
        exitGate = 0.0
        print 'GO!'
        for i, gate in enumerate(gates):
            itask.start()
            gate_out.write(gate/gateAmp)
            time.sleep(gateDelay)
            sample_data = itask.read()
            itask.wait_until_done()
            itask.stop()
            self.data[i,0] = gate
            self.data[i,1] = sample_data.mean()*cvAmp
            self.data[i,2] = bias/self.data[i,1]
            self.data[i,3:] = sample_data.transpose()
            np.savetxt(file, [self.data[i]], fmt = '%+.6e', delimiter = '\t')
            if (msvcrt.kbhit() and ord(msvcrt.getch()) == 113) or self.end_run:
                    exitGate = gate
                    print "Program ended by user."
                    break
                
        bias_out.write(0.0)
        bias_out.clear()
        gate_out.write(0.0) #turn off gate, should already be at 0
        gate_out.clear()
        del gate_out, bias_out #delete DAQ object so it can be reused
        file.close()
        print 'Done.'
 def run_simple(biasLim, fieldLim, gate = 0.0, ivAvg = 1,
                 cvResistor = 10.0, cvAmp = -1e-6, gateAmp = 9.1788, 
                 srcDelay = 0.01, fieldDelay = 2.0, 
                 nplc = 1, nvmRange = 0.1):
                 
     """ Runs the actual experiment. Can be called directly if plotting is
         not needed. """
         
     tools.write_log('iv_magField', locals(), filename+'.log')
     
     biasBuffer = tools.get_buffer_size(biasLim[0], biasLim[1], biasLim[2]) 
     bias = np.linspace(biasLim[0], biasLim[1], biasBuffer)
     np.savetxt(file, [np.insert(bias, 0, 0.0)], fmt = '%+.6e', delimiter = '\t')
     fieldBuffer = tools.get_buffer_size(fieldLim[0], fieldLim[1], fieldLim[2]) 
     fields = np.linspace(fieldLim[0], fieldLim[1], fieldBuffer) 
     
     source = keithleypair.IVmax1024("GPIB::22", timeout = 60.0) #keithley object
     mag = instruments.oxford_magnet("GPIB::20", rate = 0.2, timeout = 60.0)
     daqGate = nidaqmx.AnalogOutputTask() #DAQ output object
     daqGate.create_voltage_channel('Dev1/ao0', min_val = -10.0, max_val = 10.0)
     daqGate.write([gate/gateAmp])
     time.sleep(1.0)
         
     #setup sweep and nanovoltmeter parameters
     source.general_setup(beep = True)
     currLim = [x/cvResistor for x in biasLim] 
     source.source_sweep_setup(currLim[0], currLim[1], currLim[2], srcDelay)
     source.source_arm_setup()
     source.source_trig_setup()
     source.voltmeter_channel_setup(nplc, nvmRange, digital_filter = False)
     source.voltmeter_trig_setup() 
     source.voltmeter_buffer_setup(biasBuffer)
     realBuffer = int(source.ask(':sour:swe:poin?'))
     if int(biasBuffer) != realBuffer:
         raise RuntimeError('buffer sizes do not match: {0}, {1}'.format(int(biasBuffer), realBuffer))
     
     #check that everything is setup
     print 'source state    = {}'.format(source.source_chk_op_evnt_reg())
     print 'voltmeter state = {}'.format(source.voltmeter_chk_meas_evnt_reg())
     
     #arm sweep
     source.write_serial(':init:imm')
     time.sleep(0.25)
     source.write(":sour:swe:arm")
     time.sleep(3.0)
     
     mag.go_to_field(fieldLim[0], fieldDelay)
     
     for field in fields:
         print 'running IV for field = {}T'.format(field)
         mag.go_to_field(field, fieldDelay)
         data = np.array(source.execute_sweep(ivAvg = ivAvg, timeout = 120.0), dtype = np.floating)
         data = data*cvAmp #calculate current from voltage measurement
         for i in range(ivAvg): #save all data before averaging
             np.savetxt(file, [np.insert(data[i], 0, field)], fmt = '%+.6e', delimiter = '\t')
             self.file.flush(); os.fsync(self.file)
             print data[i][0], data[i][1], '...', data[i][-2], data[i][-1]
         data = data.mean(axis = 0) #average over multiple IV curves for plot
         
         if msvcrt.kbhit():
             if ord(msvcrt.getch()) == 113:
                 print "Program ended by user.\n"
                 break 
     print 'Cleaning up...'
     source.write(":outp 0") #turn off current source
     source.close()
     mag.end_at_zero() #set field back to zero
     mag.close()
     daqGate.write([0.0]) #turn off gate
     del mag, source, daqGate
     self.file.close()