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()