-
RE: KTH-2651A Minimum Operating Voltage as Load
For an electronic load product type like the 2380 series, you are right to be aware of minimum operating voltage when sinking current.
However, a SourceMeter has very different analog architecture and does not have a similar concern.
If asking the SMU to source negative current (sink current into the HI terminal) you will also specify a (maximum) voltage compliance limit. But the actual voltage that will develop between the HI to LO terminal is a consequence of the I*R drop external to the SMU and not due to internal I*R drops.
You could short HI to LO and have it sink current and it would be perfectly happy with the near to zero volt drop on HI to LO.
When sourcing current, the minimum allowed voltage compliance programmed value is 10mV. But you'd set it this low only if you wanted to enforce this as a maximum voltage that the DUT should experience when forcing the current by the SMU.
Instead, you would set the voltage compliance to value larger than the expected I*R of the DUT. -
RE: how to calculate the accuracy Dmm4020
You have it correct.
For the 200 ohm range, the 1 year spec: 0.03% of value + 0.004% of range
For 10 ohm DUT measured on this range:
0.03% x 10 = 0.003 ohms
0.004% x 200 = 0.008 ohms
Total Error Budget: 0.011 ohms -
RE: Connections on a 3723 single-pole matrix switch
If you make use of backplane relays or connect the DMM LO to the Output HI of bank 2, then you could measure between any two pins of bank 1 and bank 2.
If you have more than one 3723 card in the 3706A chassis, jumpering it to the backplane will be recommended way.
On rear of the 3706A is a DB15 connector that brings out the DMM HI and LO as well as the backplane relays HI and LO.
A small jumper on the DB15 could connect the DMM LO to the HI of backplane 3 (for example).
Each card (one by one) would need to close backplane #3 of MUX Bank 2 when a channel on that card is one of pins.
In the channel patterns, you can associate backplane relays with the card channel to have this automatic closure of the backplane relay with the channel. -
RE: 4200A-SCS command "GD" and "EX" cannot find user library
IP address is controlled in the "normal" way for a Windows computer (Network settings).
Good question about if it uses the upper or lower port. I find that it uses the one that is connected to my network.
If I have LAN cable connected to both of them, I'm finding that KXCI will attach the IP address of the upper port.
I did a little experiment with the commands.
In KULT, build a simple Library and Module for the the system beep to play a tone.
I'm able to remotely execute it with the UL and EX commands.
The GD command brings back the info about the parameters of the library.
See the attached images.
I've got version 1.11 of Clarius on the 4200A-SCS -
RE: AFG31000 Series - Sample Code for using optional SEQuencer
If the optional SEQ license is not there, then the SEQ feature of Advanced mode can still be used, but only in run mode = continuous.
Continuous also limits you to one waveform entry with infinite repeat.
Wait, jump are disabled too.
Both channels can have a waveform (but need same number of points in each).
Right now, it seems the only means to present a single waveform file that contains more than 131K entries to the SEQ is to bring it on a thumb drive (*.tfwx).
How to get it onto a thumb drive? I used ArbExpress (3.6). Use the File>Open to open a saved scope waveform or a csv file of the waveform. Then use File>Save As to save the tfwx file for the AFG to use.
Hopefully in near future we will have an API for creating the large sequence directly onto the AFG storage. -
RE: AFG31022 downloading waveforms
Here is a Python sample for loading a custom waveform to the standard ARB mode.
It was targeting generation of double pulse test waveform type.
It is easy matter to save the EMEM memory to a tfwx file on the M: or U: drive for use in the SEQ.
''' Create waveform and send to AFG31102 Double Pulse Test Waveform --- A1---- ---A2--- | | | | | | | | -----------| |----------| |------------ <-- t1 -->|<--- t2 --->|<-----t3---->|<---t4---->|<---t5---->| Pulse Heights, A1 and A2 , correspond to the Vgs applied to the FET and therefore control the Ids current level. rise/fall times = don't care yet duration of other time segements = important ''' import pyvisa import numpy as np # for test wave import matplotlib.pyplot as plt # for plotting, not required #time durations for our waveform t1 = 1e-6 t2 = 1e-6 #duration of A1 t3 = 1e-6 # off time in between two pulses t4 = 1e-6 #duration of A2 t5 = 1e-6 #voltage amplitudes of the pulses A1 = 1.25 #volts A2 = 3 #volts AFG_SampleRate = 250e6 total_time = t1 + t2 + t3 + t4 + t5 t_axis = np.arange(0, total_time, 1/AFG_SampleRate) wave = np.multiply(0, t_axis) # populate with zeros ARB_SRC_FREQ = int (AFG_SampleRate / len(t_axis)) print('********************') print('ARB_SRC_FREQ: ' + str(ARB_SRC_FREQ)) print('without option, limit size of ARB to 131K entries') print('Num Pts per ARB Waveform: ' + str(len(t_axis))) print(len(wave)) #overwrite some of the zeros with our pulse height values #first pulse start_index=int(t1 * AFG_SampleRate) stop_index = start_index + int(t2 * AFG_SampleRate) print('start index pulse1: ' + str(start_index)) print('stop index pulse1: ' + str(stop_index)) for i in range(start_index, stop_index): #pulse top wave[i] = A1 # second pulse start_index=int((t1+ t2+ t3) * AFG_SampleRate) stop_index = start_index + int(t4* AFG_SampleRate) print('start index pulse2: ' + str(start_index)) print('stop index pulse2: ' + str(stop_index)) for i in range(start_index, stop_index): #pulse top wave[i] = A2 #build normalized array # normalize to dac values m = 16382 / (wave.max() - wave.min()) b = -m * wave.min() dac_values = (m * wave + b) np.around(dac_values, out=dac_values) dac_values = dac_values.astype(np.uint16) # plot (optional) plt.plot(dac_values) plt.show() #Get the this from NI-MAX instrumentdescriptor = 'USB0::0x0699::0x035A::C013392::INSTR' #instrumentdescriptor = 'GPIB0::11::INSTR' print('****************************************') debug = 0 if debug: for item in wave: print(item) #Write the waveform to a text file debug = 0 if debug: fid = open('waveform.txt', 'w') for j in wave: fid.write(str(j) + '\n') fid.close() print('Sending waveform to AFG') #Next sending to the AFG resource_mgr = pyvisa.ResourceManager() AFG = resource_mgr.open_resource(instrumentdescriptor) AFG.read_termination = '\n' AFG.encoding = 'latin_1' def halt_on_msg(): e = int(AFG.query('*esr?')) if e != 0: raise Exception('non-zero esr') print(AFG.query('*IDN?')) #reset and clear the AFG status AFG.write('*rst') AFG.write('*cls') #configure the channel to play arbitrary waveform, burst mode, .2ms timer #on trigger, 0 - 5V output, 1 cycle of waveform per occurance. AFG.write('source1:function ememory') AFG.write('OUTP1:IMP INF') #MAX=10Kohms, INF is >10K, MIN=1ohm AFG.write('source1:frequency ' + str(ARB_SRC_FREQ) ) AFG.write('source1:burst:mode trig') AFG.write('source1:burst:ncycles 1') AFG.write('source1:burst:state on') AFG.write('trigger:sequence:timer 0.005') AFG.write('source1:voltage:high ' + str(wave.max())) AFG.write('source1:voltage:low ' + str(wave.min())) #AFG.write('source1:voltage:offset 2.5') # **************** send the ARB waveform ****************** halt_on_msg() # datatype = "H" means unsigned short format AFG.write_binary_values(':TRAC:DATA EMEM1,', dac_values, datatype='h', is_big_endian=True) halt_on_msg() #finally, turn the output on AFG.write('output1 on')
-
AFG31000 Series - Sample Code for using optional SEQuencer
On the AFG31K models, in the Advanced mode, the SEQ feature is separately licensed.
Trial license can be obtained here: Tek AMS Trial License for AFG
Here is a Python simple demo program to use the SEQ feature from the sample waveform files on the unit P: drive for predefined waveforms.
import pyvisa import time #Get the this from NI-MAX instrumentdescriptor = 'USB0::0x0699::0x035A::C013392::INSTR' debug = 1 # define a couple helper functions def error_check(): e = int(AFG.query('*esr?')) if e != 0: err_msg = AFG.query("SYST:ERR?") print(err_msg) #raise Exception('non-zero esr: ' + err_msg) # some operations need a litte time # and if we send next command too soon, bad things happen. # so use the operation complete query to be kind to AFG. # if operation takes longer than our VISA timeout, that errow will occur def check_if_done(): e = int(AFG.query('*opc?')) if e != 1: print("did we get visa timeout?") # *************** Connect to AFG resource_mgr = pyvisa.ResourceManager() AFG = resource_mgr.open_resource(instrumentdescriptor) AFG.read_termination = '\n' AFG.encoding = 'latin_1' #for any binary data, this is needed AFG.timeout = 10000 #number of msec before timeout error for VISA read print(AFG.query('*IDN?')) print("Do you have the SEQ license?") print(AFG.query("LIC:LIST?")) # make sure you have SEQ license!! #reset and clear the AFG status AFG.write('*RST') AFG.write('*CLS') #put instrument into Advanced/SEQ mode AFG.write("SEQControl:STATe ON") check_if_done() AFG.write("SEQuence:NEW") #this gives us "clean slate" in the SEQ setup check_if_done() AFG.write("SEQControl:RMODe SEQ") # run node = SEQ check_if_done() AFG.write("SEQuence:LENGth 2") #this example will load two index in our SEQ AFG.write("SEQControl:SRATe 5.0E6") AFG.write("SEQControl:SOURce1:SCALe 100") # 1000 is max value = FS of your AFG model AFG.write("SEQControl:SOURce1:OFFSet 0") #offset in volts # load files from predefined location (P:) # this gives our sequence two Waveforms to use AFG.write("WLISt:WAVeform:IMPort \"P:/Pulse1000.tfwx\"") check_if_done() if debug: error_check() AFG.write("WLISt:WAVeform:IMPort \"P:/Sine1000.tfwx\"") check_if_done() if debug: error_check() AFG.write("SEQuence:ELEM1:WAVeform1 \"P:/Pulse1000.tfwx\"") # load first element check_if_done() if debug: error_check() AFG.write("SEQuence:ELEM2:WAVeform1 \"P:/Sine1000.tfwx\"") # load second element check_if_done() if debug: error_check() # set Repeat values for each element AFG.write("SEQuence:ELEM1:LOOP:COUNt 5") # up to 1E6 check_if_done() if debug: error_check() AFG.write("SEQuence:ELEM2:LOOP:COUNt 3") check_if_done() if debug: error_check() # have last element GOTO index 1 element AFG.write("SEQuence:ELEM2:GOTO:STATe 1") # enable GOTO index behavior AFG.write("SEQuence:ELEM2:GOTO:INDEX 1") # have last index GOTO index 1 check_if_done() if debug: error_check() #the SEQ is loaded...now run it AFG.write("OUTPut1:IMPedance INF") # presently connected to Hi-Z scope channel AFG.write("OUTPut1:STATe ON") AFG.write("SEQControl:RUN:IMMediate") time.sleep(5) # let it run for a few seconds AFG.write("SEQControl:STOP:IMMediate") check_if_done() # this is one example where a little time needed AFG.write("OUTPut1:STATe OFF") # if you want the output reliably turned off #clean up our VISA connection AFG.clear() AFG.close() resource_mgr.close() print("*** all done ****")
-
RE: 4200A-SCS command "GD" and "EX" cannot find user library
Here I've managed to attach the document.
As for the warning, I agree with you. Once KXCI using GPIB is invoked, the GPIB interface can no longer be controller in charge.
So if you had a KULT library that controlled an external item over GPIB bus, seems there would be prohibition to execute that KULT code from the UL and EX of KXCI.....if using KXCI over GPIB.
Can you try LAN for KXCI? If you use LAN, be sure to append null ('\0') onto your command strings.
What version of Clarius software is on your 4200A-SCS? -
RE: 4200A-SCS command "GD" and "EX" cannot find user library
Here is an older forum post showing some success, but with different module:
Successful Use of UL and EX with KXCI
Is the external 707x matrix the item you need to control? Or just using it as a sample?
-
RE: Interlock 6517b
Because the 1000V supply poses a shock hazard, it makes use of an interlock signal.
Ideally, you would have a physical barrier/test fixture with a door and door-switch.
When door open, the open switch prohibits the high voltage operation.
When door closed, the closed switch permits the high voltage operation.
Figure 26 in the Reference manual, pg 314, illustrates this simple open vs. closed connection to the interlock connector.
This is similar to how a microwave oven and the door state behaves.
There is no means to turn interlock off.