-
Notifications
You must be signed in to change notification settings - Fork 47
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Including several examples for paralleling SMUs for up to 100A of current, and a script for checking for status model overrruns.
- Loading branch information
Showing
11 changed files
with
4,962 additions
and
0 deletions.
There are no files selected for viewing
553 changes: 553 additions & 0 deletions
553
Instrument_Examples/Series_2600/265xA/2651A_-_IdVd_Sweep_Step_Vg.tsp
Large diffs are not rendered by default.
Oops, something went wrong.
231 changes: 231 additions & 0 deletions
231
Instrument_Examples/Series_2600/265xA/2651A_-_Power_FET_IGBT_IV_Curves.tsp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,231 @@ | ||
--[[ | ||
Title: IV Curves Example Script | ||
Date: 12/23/2010 | ||
Description: This script will perform a series of IV Curves on a | ||
MOSFET or IGBT device and will return the data in a Microsoft Excel | ||
compatible format for graphing and analysis. | ||
TSP-Link Configuration: | ||
Node 1: 2651A | ||
Node 2: 26xxA | ||
Master Node: Node 1 | ||
Revision History: | ||
12/23/2010 - Version 1.01 | ||
David Wyban | ||
• Changed Timer 2 to be triggered from SOURCE_COMPLETE event to avoid | ||
issue with the first pulse in a sweep being shorter than the rest | ||
• Added a line to turn on highc mode on the gate SMU for stability | ||
12/6/2010 - Version 1.0 | ||
David Wyban | ||
Initial Revision | ||
]] | ||
|
||
--[[ | ||
IV_Curves(gstart, gstop, gsteps, dstart, dstop, dsteps, pulseWidth, pulsePeriod, pulseLimit) | ||
Description: This function will perform a series of pulsed sweeps | ||
on a MOSFET or IGBT device to generate a series of IV Curves that | ||
characterize the device. Note: To avoid device oscillations, a | ||
series resistor on the gate terminal of the device may be required. | ||
Parameters: | ||
gstart: The starting voltage of the gate sweep | ||
gstop: The ending voltage of the gate sweep | ||
gsteps: The number of steps in the gate sweep | ||
dstart: The starting voltage of the drain sweep | ||
dstop: The ending voltage of the drain sweep | ||
dsteps: The number of steps in the drain sweep | ||
pulseWidth: The width of the drain pulse in seconds | ||
pulsePeriod:The time in seconds between the start of consecutive drain pulses in the sweep | ||
pulseLimit: The current limit in Amps of the drain pulse | ||
Example Usage: | ||
IV_Curves(5, 9, 5, 0, 10, 21, 300e-6, 30e-3, 50) | ||
--]] | ||
function IV_Curves(gstart, gstop, gsteps, dstart, dstop, dsteps, pulseWidth, pulsePeriod, pulseLimit) | ||
reset() | ||
tsplink.reset() | ||
|
||
-- Configure the Drain SMU(2651A) | ||
--------------------------------- | ||
smua.reset() | ||
smua.source.func = smua.OUTPUT_DCVOLTS | ||
smua.sense = smua.SENSE_REMOTE | ||
|
||
smua.source.rangev = math.max(math.abs(dstart), math.abs(dstop)) | ||
-- Select the source range that is large enough to fit all values of the sweep | ||
smua.source.levelv = 0 -- Sets the drain bias level | ||
smua.source.limiti = 5 | ||
|
||
smua.measure.rangev = smua.source.rangev | ||
smua.measure.rangei = (pulseLimit == "off") and 50 or pulseLimit | ||
-- Select a measure range large enough to fit pulses up to the current limit | ||
|
||
smua.measure.autozero = smua.AUTOZERO_ONCE | ||
smua.measure.nplc = 0.005 | ||
-- NPLC can be increased to improve measurement accuracy. | ||
-- However, it should remain small enough to fit the measurement | ||
-- within the width of the settled part of the pulse. | ||
smua.measure.delay = (pulseWidth - ((1/localnode.linefreq) * smua.measure.nplc)) - 20e-6 | ||
-- Set the measure delay so that the measurement is | ||
-- taken at the end of the pulse before the falling edge | ||
|
||
-- Timer 1 controls the pulse period | ||
trigger.timer[1].count = (dsteps <= 1) and 1 or (dsteps - 1) | ||
-- If dsteps <= 1 then use 1 for the count else use dsteps - 1 | ||
trigger.timer[1].delay = pulsePeriod | ||
trigger.timer[1].passthrough = true | ||
trigger.timer[1].stimulus = tsplink.trigger[1].EVENT_ID | ||
trigger.timer[1].clear() | ||
|
||
-- Timer 2 controls the pulse width | ||
trigger.timer[2].count = 1 | ||
trigger.timer[2].delay = pulseWidth - 3e-6 | ||
trigger.timer[2].passthrough = false | ||
trigger.timer[2].stimulus = smua.trigger.SOURCE_COMPLETE_EVENT_ID | ||
trigger.timer[2].clear() | ||
|
||
-- Configure Drain SMU(2651A) trigger model | ||
smua.trigger.source.linearv(dstart, dstop, dsteps) | ||
smua.trigger.source.limiti = pulseLimit | ||
smua.trigger.measure.action = smua.ENABLE | ||
smua.trigger.measure.iv(smua.nvbuffer1, smua.nvbuffer2) | ||
smua.trigger.endpulse.action = smua.SOURCE_IDLE | ||
smua.trigger.endsweep.action = smua.SOURCE_IDLE | ||
smua.trigger.arm.count = gsteps | ||
smua.trigger.count = dsteps | ||
smua.trigger.arm.stimulus = 0 | ||
smua.trigger.source.stimulus = trigger.timer[1].EVENT_ID | ||
smua.trigger.measure.stimulus = 0 | ||
smua.trigger.endpulse.stimulus = trigger.timer[2].EVENT_ID | ||
smua.trigger.source.action = smua.ENABLE | ||
|
||
-- Configure TSP-Link Triggers | ||
tsplink.trigger[1].clear() | ||
tsplink.trigger[1].mode = tsplink.TRIG_SYNCHRONOUSM | ||
tsplink.trigger[1].stimulus = smua.trigger.ARMED_EVENT_ID | ||
-- TSP-Link Trigger 1 is used by the 2651A to command the 26xxA | ||
-- to step the gate and for the 26xxA to report to the 2651A | ||
-- that it has completed the step. | ||
|
||
tsplink.trigger[2].clear() | ||
tsplink.trigger[2].mode = tsplink.TRIG_FALLING | ||
tsplink.trigger[2].stimulus = smua.trigger.SWEEP_COMPLETE_EVENT_ID | ||
-- TSP-Link Trigger 2 is used by the 2651A to command the 26xxA that | ||
-- it has completed the drain sweep and that the 26xxA continue. | ||
|
||
-- Prepare the Drain SMU (2651A) reading buffers | ||
smua.nvbuffer1.clear() | ||
smua.nvbuffer1.collectsourcevalues = 1 | ||
smua.nvbuffer2.clear() | ||
smua.nvbuffer2.collectsourcevalues = 1 | ||
|
||
|
||
-- Configure the Gate SMU(26xxA) | ||
-------------------------------- | ||
node[2].smua.reset() | ||
node[2].smua.source.func = node[2].smua.OUTPUT_DCVOLTS | ||
node[2].smua.sense = node[2].smua.SENSE_REMOTE | ||
node[2].smua.source.levelv = 0 | ||
node[2].smua.source.limiti = 100e-3 | ||
node[2].smua.measure.delay = 300e-6 -- Give gate 300us to settle | ||
-- Do not need to configure any additional measure settings. | ||
-- Timing is not critical on the gate so autorange will do. | ||
|
||
node[2].smua.source.highc = 0 | ||
-- If you find the gate to be unstable even with a gate resistor in place | ||
-- changing highc to 1 can improve stability. | ||
|
||
-- Configure Gate SMU(26xxA) Trigger Model | ||
node[2].smua.trigger.source.linearv(gstart, gstop, gsteps) | ||
node[2].smua.trigger.source.limiti = 100e-3 | ||
node[2].smua.trigger.measure.action = node[2].smua.ENABLE | ||
node[2].smua.trigger.measure.iv(node[2].smua.nvbuffer1, node[2].smua.nvbuffer2) | ||
node[2].smua.trigger.endpulse.action = smua.SOURCE_HOLD | ||
node[2].smua.trigger.endsweep.action = smua.SOURCE_IDLE | ||
node[2].smua.trigger.count = gsteps | ||
node[2].smua.trigger.arm.stimulus = 0 | ||
node[2].smua.trigger.source.stimulus = node[2].tsplink.trigger[1].EVENT_ID | ||
node[2].smua.trigger.measure.stimulus = 0 | ||
node[2].smua.trigger.endpulse.stimulus = node[2].tsplink.trigger[2].EVENT_ID | ||
node[2].smua.trigger.source.action = smua.ENABLE | ||
|
||
-- Configure Model 26xxA TSP-Link Triggers | ||
node[2].tsplink.trigger[1].clear() | ||
node[2].tsplink.trigger[1].mode = node[2].tsplink.TRIG_SYNCHRONOUSA | ||
node[2].tsplink.trigger[1].stimulus = node[2].smua.trigger.MEASURE_COMPLETE_EVENT_ID | ||
|
||
node[2].tsplink.trigger[2].clear() | ||
node[2].tsplink.trigger[2].mode = node[2].tsplink.TRIG_FALLING | ||
|
||
-- Prepare the Gate SMU (26xxA) reading buffers | ||
node[2].smua.nvbuffer1.clear() | ||
node[2].smua.nvbuffer1.collectsourcevalues = 1 | ||
node[2].smua.nvbuffer2.clear() | ||
node[2].smua.nvbuffer2.collectsourcevalues = 1 | ||
|
||
-- The SMUs are configured and ready to run the test | ||
|
||
-- Outputs on | ||
node[2].smua.source.output = 1 | ||
smua.source.output = 1 | ||
|
||
-- Start the 26xxA's trigger model | ||
node[2].smua.trigger.initiate() | ||
|
||
-- Start the 2651A's trigger model | ||
smua.trigger.initiate() | ||
|
||
waitcomplete() -- Wait until the sweeps are complete | ||
|
||
-- Outputs off | ||
smua.source.output = 0 | ||
node[2].smua.source.output = 0 | ||
|
||
-- Return the data | ||
PrintIVcurveData(gsteps, dsteps) | ||
end | ||
|
||
|
||
--[[ | ||
PrintIVcurveData(gsteps, dsteps) | ||
Description: This function will output the data collected by | ||
the IV_Curves() function in a Microsoft Excel compatible format. | ||
For each step of the gate, this function will output three | ||
columns containing the drain sweep data as well as the gate data | ||
in the first row. | ||
Parameters: | ||
gsteps: The number of steps in the gate sweep | ||
dsteps: The number of steps in the drain sweep | ||
Example Usage: | ||
PrintIVcurveData(5, 21) | ||
--]] | ||
function PrintIVcurveData(gsteps, dsteps) | ||
line1 = "" | ||
line2 = "" | ||
for i = 1,gsteps do | ||
line1 = line1 .. string.format("Vgs = %0.2f\t%g\t%g\t", | ||
node[2].smua.nvbuffer1.sourcevalues[i], | ||
node[2].smua.nvbuffer2[i], | ||
node[2].smua.nvbuffer1[i]) | ||
line2 = line2 .. "Source Value\tVoltage\tCurrent\t" | ||
end | ||
print(line1) | ||
print(line2) | ||
for i = 1, dsteps do | ||
line = "" | ||
for j = 1, gsteps do | ||
line = line .. string.format("%g\t%g\t%g\t", | ||
smua.nvbuffer1.sourcevalues[(j - 1) * dsteps + i], | ||
smua.nvbuffer2[(j - 1) * dsteps + i], | ||
smua.nvbuffer1[(j - 1) * dsteps + i]) | ||
end | ||
print(line) | ||
end | ||
end |
Oops, something went wrong.