Needs an update:
The code posted above will not take you into pulse region 4.
These high watt pulse regions are in our Extended Operating Area and have firmware imposed max PW and Duty Cycle limits.
To access the EOA regions, supply a higher voltage value for the trigger.source.limitv which will be applied only during the high watt pulse.
When not sourcing the pulse level, the lower value set for the smuX.source.limitv applies. The combo of smuX.source.leveli and smuX.source.limitv needs to be within the DC operating area of the SMU.
These three lines in particular for accessing EOA region:
smuX.measure.rangev = EOA_limit
smuX.source.limitv = limitV
smuX.trigger.source.limitv = EOA_limit
I'll upload scope shot of 1.5A into 10Ω.
Revised code:
function Run_test(show_data, PulsePeriod, PulseWidth, MeasDelay)
-- when passthrough is true, the timer will "tic" immediately,
-- which for this application will start as soon as the
-- trigger model is ARMED.
node[1].trigger.timer[1].delay = PulsePeriod
node[1].trigger.timer[1].stimulus = node[1].smua.trigger.ARMED_EVENT_ID
node[1].trigger.timer[1].count = 1 --PulseCount - 1
node[1].trigger.timer[1].passthrough = true
node[1].trigger.timer[1].clear()
node[1].trigger.timer[2].delay = PulseWidth
node[1].trigger.timer[2].stimulus = node[1].trigger.timer[1].EVENT_ID
node[1].trigger.timer[2].count = 1
node[1].trigger.timer[2].passthrough = false
node[1].trigger.timer[2].clear()
node[1].trigger.timer[3].delay = MeasDelay
node[1].trigger.timer[3].stimulus = node[1].trigger.timer[1].EVENT_ID
node[1].trigger.timer[3].count = 1
node[1].trigger.timer[3].passthrough = false
node[1].trigger.timer[3].clear()
-- 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.TRIG_RISINGM
digio.trigger[1].pulsewidth = 100e-6
digio.trigger[1].stimulus = node[1].trigger.timer[1].EVENT_ID -- source stimulus too
-- clear the reading buffers
reset_buffers(node[1].smua)
-- Turn the outputs on
smua.source.output = smua.OUTPUT_ON
-- after blue light state change, delay a little
delay(0.1)
-- Start the trigger model execution
smua.trigger.initiate() -- start this one last as all the other smus follow this leader
-- Wait until the sweep has completed
waitcomplete()
--[[
-- hot switch:
-- to bleed off the trapped charge on PN junction capacitance and non-zero voltage
-- briefly set the voltage compliance to small number
restore_val = smua.source.limitv
smua.source.limitv = 0.01
delay(0.001)
smua.source.limitv = restore_val
]]
-- before blue light state change, delay a little
delay(0.1)
-- Turn the output off
smua.source.output = smua.OUTPUT_OFF
-- IV data for the laser
if show_data == true then
-- Print the data back to the Console in tabular format
print(" Voltage\tCurrent\tResistance")
for x=1,smua.nvbuffer1.n do
-- Voltage readings are in nvbuffer2. Current readings are in nvbuffer1.
print(smua.nvbuffer2[x], smua.nvbuffer1[x], smua.nvbuffer2[x]/smua.nvbuffer1[x] )
end
end
end
function reset_buffers(smu)
-- Prepare the Reading Buffers
smu.nvbuffer1.clear()
smu.nvbuffer1.appendmode = 1
smu.nvbuffer1.collecttimestamps = 1
smu.nvbuffer2.clear()
smu.nvbuffer2.appendmode = 1
smu.nvbuffer2.collecttimestamps = 1
end
function config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
smu.source.func = smu.OUTPUT_DCAMPS
if (remoteSense == true) then
smu.sense = smu.SENSE_REMOTE
else
smu.sense = smu.SENSE_LOCAL
end
smu.source.autorangei = smu.AUTORANGE_OFF
smu.source.rangei = srcRange
smu.source.leveli = 0
smu.source.limitv = limitV
-- Disabling Auto-Ranging and Auto-Zero ensures accurate and consistent timing
smu.measure.autozero = smu.AUTOZERO_ONCE
smu.measure.autorangev = smu.AUTORANGE_OFF
smu.measure.rangev = EOA_limit
smu.measure.nplc = nplc
-- A timer will be used to set the measure delay and synchronize the measurement
-- between the SMUs so set the built in delay to 0.
smu.measure.delay = 0
-- Configure SMU Trigger Model for Sweep
--smu.trigger.source.lineari(start, stop, numPoints)
smu.trigger.source.listi(srclist)
smu.trigger.source.limitv = EOA_limit
smu.trigger.measure.action = smu.ENABLE
smu.trigger.measure.iv(smu.nvbuffer1, smu.nvbuffer2)
smu.trigger.endpulse.action = smu.SOURCE_IDLE
smu.trigger.endsweep.action = smu.SOURCE_IDLE
smu.trigger.count = table.getn(srclist)
smu.trigger.arm.stimulus = 0
smu.trigger.source.stimulus = trigger.timer[1].EVENT_ID
smu.trigger.measure.stimulus = trigger.timer[3].EVENT_ID
smu.trigger.endpulse.stimulus = trigger.timer[2].EVENT_ID
smu.trigger.source.action = smu.ENABLE
end
-- ************************************** MAIN PROGRAM BELOW *****************
reset()
errorqueue.clear()
nodesFound = tsplink.reset(1)
print("Nodes found = " .. nodesFound)
--smua.interlock.enable = smua.DISABLE
-- use of pulse region 4 of 2602B: 10A at up to 20V
-- max 1.8msec pulse with 1% duty cycle
local PulseWidth = 1.0e-3
local PulsePeriod = PulseWidth / 0.01
local MeasDelay = PulseWidth * 0.8
local nplc = (PulseWidth - MeasDelay - 60e-6) * localnode.linefreq
print("Computed NPLC value: "..tostring(nplc))
if tostring(nplc) < "0.001" then
nplc = 0.001 -- 16.7usec, minimum value allowed
MeasDelay = 1e-6
end -- if
-- voltage ranges on 2602B: 100mV, 1V, 6V, 40V
-- pick a limit value higher than expected I*DUT_R and
-- puts you on appropriate range.
local voltageLimit = 1
local duringPulse_voltageLimit = 20
-- ranges: decades of 10.....100mA, 1A, 3A, 10A
local mySrcRange = 3
mysrclist = { 1.5} -- use this one for a single pulse
--local numPulses = table.getn(mysrclist)
--config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
config_smu_list_sweep(1, node[1].smua, mySrcRange, mysrclist, voltageLimit, duringPulse_voltageLimit, nplc, true)
timer.reset()
Run_test(true, PulsePeriod, PulseWidth, MeasDelay) -- pass true to print data back to console
time = timer.measure.t()
print("Time to run: "..time)
print("****************************************")
print("Current Source Range: "..node[1].smua.source.rangei)