-
RE: Linking two 2450 SMU
KickStart does not use tsp-link for communication with the SMU.
KickStart needs a computer connection to each SMU (lan, usb or gpib).
If you additionally have tsp-link between the instruments, KickStart can use that for their triggering/coordination.
-
RE: How to upgrade firmware 3.4.2 to 4.0.3 [2600B]
The 4.x firmware of 2600B series apply only to units shipped from factory with a 4.x level.
If your 2600B has 3.x level, then 3.4.2 from Tek.com would be the most recent version. -
RE: Simultaneous sine waves on SMU 2602 channels A & B
Here is a lightly edited version of your code:local _startV -- Used by script to track the starting voltage local _srcRate = 4000 -- Source Update Rate used by the script Sets the source update rate (pts/sec) used by the script. --Do not set higher than 8,000 if your waveform will have polarity changes 0V crossings) function SetupAWG(startV, rangeV, limitI, wfrmTbl, remoteSense, trigLineIn) -- Do some parameter checks --========================= if startV == nil then startV = 0 end if remoteSense ~= true then remoteSense = false end if type(trigLineIn) == "number" then trigLineIn = math.floor(trigLineIn) if trigLineIn < 0 or trigLineIn > 14 then return true, "Error: Selected trigger line is not valid. trigLineIn must be a number between 0 and 14 or nil." end elseif trigLineIn ~= nil then return true,"Error: Invalid parameter trigLineIn. trigLineIn must be a number between 0 and 14 or nil." end _startV = startV --wfrmTbl = {0.078459,0.156434,0.233445,0.309017,0.382683,0.45399,0.522499,0.587785,0.649448,0.707107,0.760406,0.809017,0.85264,0.891007,0.92388,0.951057,0.97237,0.987688,0.996917,1,0.996917,0.987688,0.97237,0.951057,0.92388,0.891007,0.85264,0.809017,0.760406,0.707107,0.649448,0.587785,0.522499,0.45399,0.382683,0.309017,0.233445,0.156434,0.078459,0,-0.078459,-0.156434,-0.233445,-0.309017,-0.382683,-0.45399,-0.522499,-0.587785,-0.649448,-0.707107,-0.760406,-0.809017,-0.85264,-0.891007,-0.92388,-0.951057,-0.97237,-0.987688,-0.996917,-1,-0.996917,-0.987688,-0.97237,-0.951057,-0.92388,-0.891007,-0.85264,-0.809017,-0.760406,-0.707107,-0.649448,-0.587785,-0.522499,-0.45399,-0.382683,-0.309017,-0.233445,-0.156434,-0.078459,0} -- compute the sine wave pts_per_cycle = 72 wfrmTbl = {} for i=1, pts_per_cycle do wfrmTbl[i] = 1 * math.sin(i * 2 * math.pi/pts_per_cycle) end -- use some phase shift for smub sine wave wfrmTbl_smub = {} for i=1, pts_per_cycle do wfrmTbl_smub[i] = 1 * math.sin(i * 2 * math.pi/pts_per_cycle + math.rad(90)) end -- Setup the SMU for arb waveform output --====================================== reset() smua.reset() smub.reset() -- digital output trigger for external equipment -- configure digital IO line 1 to output a active LO/falling edge -- pulse at start of each current pulse digio.trigger[1].clear() digio.trigger[1].mode = digio.TRIG_FALLING digio.trigger[1].pulsewidth = 10e-6 digio.trigger[1].stimulus = trigger.timer[1].EVENT_ID smua.source.func = smua.OUTPUT_DCVOLTS smub.source.func = smub.OUTPUT_DCVOLTS if remoteSense == true then smua.sense = smua.SENSE_REMOTE smub.sense = smub.SENSE_REMOTE else smua.sense = smua.SENSE_LOCAL smub.sense = smub.SENSE_LOCAL end smua.source.autorangev = smua.AUTORANGE_OFF smua.source.autorangei = smua.AUTORANGE_OFF smua.source.rangev = rangeV smua.source.levelv = startV smua.source.limiti = limitI smua.source.delay = 0 smua.source.settling = smua.SETTLE_FAST_POLARITY smub.source.autorangev = smub.AUTORANGE_OFF smub.source.autorangei = smub.AUTORANGE_OFF smub.source.rangev = rangeV smub.source.levelv = startV smub.source.limiti = limitI smub.source.delay = 0 smub.source.settling = smub.SETTLE_FAST_POLARITY -- Configure the Trigger Model --============================ -- Timer 1 controls the time per point table phase A trigger.timer[1].delay = 1 / _srcRate trigger.timer[1].count = table.getn(wfrmTbl) > 1 and table.getn(wfrmTbl) - 1 or 1 if trigLineIn == nil then -- Immediate trigger.timer[1].stimulus = smua.trigger.ARMED_EVENT_ID elseif trigLineIn == 0 then -- Front panel TRIG button display.trigger.clear() trigger.timer[1].stimulus = display.trigger.EVENT_ID else -- Digio Trigger digio.trigger[trigLineIn].clear() digio.trigger[trigLineIn].mode = digio.TRIG_EITHER trigger.timer[1].stimulus = digio.trigger[trigLineIn].EVENT_ID end trigger.timer[1].passthrough = true -- Configure SMU Trigger Model for arb waveform output smua.trigger.source.listv(wfrmTbl) smua.trigger.source.limiti = limitI smua.trigger.measure.action = smua.DISABLE smua.trigger.endpulse.action = smua.SOURCE_HOLD smua.trigger.endsweep.action = smua.SOURCE_HOLD smua.trigger.count = table.getn(wfrmTbl) smua.trigger.arm.count = 1 smua.trigger.arm.stimulus = 0 smua.trigger.source.stimulus = trigger.timer[1].EVENT_ID smua.trigger.measure.stimulus = 0 smua.trigger.endpulse.stimulus = 0 smua.trigger.source.action = smua.ENABLE smub.trigger.source.listv(wfrmTbl_smub) smub.trigger.source.limiti = limitI smub.trigger.measure.action = smub.DISABLE smub.trigger.endpulse.action = smub.SOURCE_HOLD smub.trigger.endsweep.action = smub.SOURCE_HOLD smub.trigger.count = table.getn(wfrmTbl) smub.trigger.arm.count = 1 smub.trigger.arm.stimulus = 0 smub.trigger.source.stimulus = trigger.timer[1].EVENT_ID -- ALC smub.trigger.measure.stimulus = 0 smub.trigger.endpulse.stimulus = 0 smub.trigger.source.action = smub.ENABLE --============================== -- End Trigger Model Configuration if errorqueue.count > 0 then return true,"Error occured during setup. Please check that your parameters are valid." else return false,"No error." end end function RunAWG(numCycles) if numCycles == nil or numCycles < 0 then numCycles = 1 end -- Set the number of cycles to output smua.trigger.arm.count = numCycles smub.trigger.arm.count = numCycles -- Turn output on smua.source.output = smua.OUTPUT_ON smub.source.output = smub.OUTPUT_ON -- Start the trigger model execution smub.trigger.initiate() -- start this first smua.trigger.initiate() if errorqueue.count > 0 then return true,"Error occurred. See error queue for details." else return false,"No error." end end --[[ Name: StopAWG() Usage: err,msg = StopAWG() Description: This function stops the waveform output and turns the SMU output off. --]] function StopAWG() smua.abort() smua.source.output = 0 smua.source.levelv = _startV smub.abort() smub.source.output = 0 smub.source.levelv = _startV if errorqueue.count > 0 then return true,"Error occured. See error queue for details." else return false,"No error." end end
To run it:--SetupAWG(startV, rangeV, limitI, wfrmTbl, remoteSense, trigLineIn) SetupAWG(0, 20, 0.1, wfrmC, false, nil) --RunAWG(numCycles) RunAWG(8)
See scope shot attached. -
RE: Simultaneous sine waves on SMU 2602 channels A & B
Hello,
You are almost there.
To accomplish the phase shift, were you thinking to use a different timer for each SMU?
Instead, I would use a single timer to provide the smuX.trigger.source.stimulus to each SMU channel.
Rather than providing a list of source levels, I recommend computing them. in the TSP or Lua code.
You can account for the phase shift in the computed source levels.-- compute the sine wave pts_per_cycle = 72 wfrmTbl = {} for i=1, pts_per_cycle do wfrmTbl[i] = 1 * math.sin(i * 2 * math.pi/pts_per_cycle) end -- use some phase shift for smub sine wave wfrmTbl_smub = {} for i=1, pts_per_cycle do wfrmTbl_smub[i] = 1 * math.sin(i * 2 * math.pi/pts_per_cycle + math.rad(90)) end
-
RE: 2636B: V pulse and transient current measurement
You second task can be implemented with the asynchronous trigger model.
Old forum showing the feature:
asynchronous sampling from the source timing - capture transients
I will upload a simple LabVIEW sample for loading scripts/functions and then making use of the functions from VIs.
-
RE: picoammeter 6485 firmware update problem
Hello.
I asked the factory AE to take a look at this.
We suspect you have a serial number that has C01 firmware.
If that is true, the unit cannot be down rev to Bxx firmware.
Please provide screen shot of the *idn? response. -
RE: IV measurements using arb waveform
For PMU, there are three modes:
two level pulsing (base and amplitude)
SegArb
FullArb
The FullArb has no measurements; it is sourcing only.
The KPULSE utility is accessing the FullArb to play sine waves, etc.
If you want IV measurements AND doing sine wave, you'd have to build it up from a piece wise segments in a SegArb sequence/waveform.
Check out the pmu-dut-examples project and the pmu-segarb-complete test.
It is using the PMU_SegArb_ExampleFull user module of PMU_examples_ulib.
So long as you observe the rules for sequence defining, you can enter any SegArb that you desire on this.
I suggest you contact your sales office/local applications engineer to get some detail on PMU.
-
RE: Simultaneous sine waves on SMU 2602 channels A & B
Hello Fabrizio,
Yes, this is very much possible with the 2600B SourceMeter.
Sounds like you have our application note on ARB features of the 2600B SMUs
Github code
ARB Features for testing Ford EMC
Either approach could work for generating sine wave from the SMUs.
Suppose you use a list of 100 points to describe one cycle of the waveform.
If you source those values at 10KHz rate, you’ll have the 100 Hz waveform.
The max source rate is about 12K, so you’re approaching the limits of the speed.
Keeping with the idea of 100 point list sweep:
if trigger count is 100, then one cycle is sourced.
if more than 100, the list is recycled.
If trigger count is 0, then plays until you send abort command.
If you don’t already, download the Test Script Builder application for running TSP code with the instrument.
Then port it out to C# or Python, etc.
Test Script Builder
-
RE: License File Not Working for KickStart
Try this:
- if open, close KickStart application.
- use file explorer to navigate to the C:\ProgramData\Keithley directory
- delete the Keithley directory
- restart KickStart and again navigate to the manage license.
Any host id info now?
If still not, please contact your local sales/support office for assistance. -
RE: Python VISA control of DAQ6510 with 7700 MUX card
There are many, but I typically use the status byte and opc() for operation complete.
Here I setup for 10 scans of 4 thermocouple channels:my_instr.write("status.clear()") my_instr.write("status.request_enable = 32") my_instr.write("status.standard.enable = 1") my_instr.write("myScanList = \"101,110, 115, 120\"") my_instr.write("channel.setdmm(myScanList, dmm.ATTR_MEAS_FUNCTION, dmm.FUNC_TEMPERATURE)") my_instr.write("channel.setdmm(myScanList, dmm.ATTR_MEAS_THERMOCOUPLE, dmm.THERMOCOUPLE_K)") my_instr.write("channel.setdmm(myScanList, dmm.ATTR_MEAS_REF_JUNCTION, dmm.REFJUNCT_INTERNAL)") my_instr.write("channel.setdmm(myScanList, dmm.ATTR_MEAS_OPEN_DETECTOR, dmm.ON)") my_instr.write("channel.setdmm(myScanList, dmm.ATTR_MEAS_NPLC, 1)") my_instr.write("display.watchchannels = myScanList") my_instr.write("scan.scancount = 10") my_instr.write("scan.scaninterval = 1") my_instr.write("scan.create(\"101,110, 115, 120\")")
Then when ready to run the scan:#status poll for opc() my_instr.write("status.clear()") #attach our session to read_stb channel print("First status byte value: " + str(my_instr.read_stb())) #my_instr.read_stb() my_instr.write("trigger.model.initiate()") my_instr.write("opc()") #this signals operation complete #repeat until the SRQ bit is set still_running = True status_byte = 0 debug = 1 while still_running: status_byte = int(my_instr.read_stb()) #if debug: print(status_byte) if debug: print(str(status_byte) + ' - ' + str(bin(status_byte)) + ' - ' + str(hex(status_byte))) if (status_byte and 64) == 64: still_running = False time.sleep(0.5) #500msec pause before asking again print("Last status byte value: " + str(status_byte)) print("Scan is done - go get the data")
Typical output from the Python code:First status byte value: 0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 0 - 0b0 - 0x0 96 - 0b1100000 - 0x60 Last status byte value: 96 Scan is done - go get the data
The attached PDF has a second example for when using TSP functions.