Posted about a year ago by Kim, Minseo
Hello.

I would like to measure pulse in the 1.5A @20V region on Keithley 2602B. The pulse width is 1ms and the pulse duty is 10%, so it looks OK in the pulse specification. However, when performing a pulse measurement, the error "-5007: Operation would exceed safe operating area of the instrument" appears. To create a pulse, I used a trigger timer and set it to "smua.trigger.endpulse.action = 0" (smua.trigger.endpulse.action = smua.SOURCE_IDLE).

Is there any other way to set up "Pulse" mode?

Attachment file is captured image of "1KW-60906-0_Series_2600BDatasheet_112718.pdf" file's 2602B pulse specification.
Thank you.
Posted about a year ago by C, Andrea
See how this does for you.
In the attachment is scope shot of the 1.5Amp, 1msec pulse into 50mΩ resistor (~75mV response).

TSP code:
  1. ​​​​​​​
  2.  
  3. function Run_test(show_data, PulsePeriod, PulseWidth, MeasDelay)
  4.  
  5.  
  6.    -- when passthrough is true, the timer will "tic" immediately,
  7.    -- which for this application will start as soon as the
  8.    -- trigger model is ARMED.  
  9.    node[1].trigger.timer[1].delay = PulsePeriod
  10.    node[1].trigger.timer[1].stimulus = node[1].smua.trigger.ARMED_EVENT_ID
  11.    node[1].trigger.timer[1].count = 1  --PulseCount - 1
  12.    node[1].trigger.timer[1].passthrough = true
  13.    node[1].trigger.timer[1].clear()
  14.    
  15.    node[1].trigger.timer[2].delay = PulseWidth
  16.    node[1].trigger.timer[2].stimulus = node[1].trigger.timer[1].EVENT_ID
  17.    node[1].trigger.timer[2].count = 1        
  18.    node[1].trigger.timer[2].passthrough = false
  19.    node[1].trigger.timer[2].clear()
  20.    
  21.    node[1].trigger.timer[3].delay = MeasDelay
  22.    node[1].trigger.timer[3].stimulus = node[1].trigger.timer[1].EVENT_ID
  23.    node[1].trigger.timer[3].count = 1        
  24.    node[1].trigger.timer[3].passthrough = false
  25.    node[1].trigger.timer[3].clear()
  26.  
  27.  
  28.     
  29.     -- digital output trigger for external equipment
  30.     -- configure digital IO line 1 to output a active LO/falling edge
  31.     -- pulse at start of each current pulse
  32.     digio.trigger[1].clear()
  33.     digio.trigger[1].mode = digio.TRIG_FALLING  --digio.TRIG_RISINGM
  34.     digio.trigger[1].pulsewidth = 100e-6
  35.     digio.trigger[1].stimulus = node[1].trigger.timer[1].EVENT_ID  -- source stimulus too
  36.     
  37.         
  38.    -- clear the reading buffers
  39.    reset_buffers(node[1].smua)
  40.      
  41.  
  42.  
  43.     -- Turn the outputs on
  44.     smua.source.output                    = smua.OUTPUT_ON
  45.     
  46.     -- after blue light state change, delay a little 
  47.     delay(0.1)  
  48.  
  49.     -- Start the trigger model execution
  50.     smua.trigger.initiate()   -- start this one last as all the other smus follow this leader
  51.     
  52.     -- Wait until the sweep has completed
  53.     waitcomplete()
  54.  
  55. --[[
  56. -- hot switch:
  57. -- to bleed off the trapped charge on PN junction capacitance and non-zero voltage
  58. -- briefly set the voltage compliance to small number
  59. restore_val = smua.source.limitv
  60. smua.source.limitv = 0.01
  61. delay(0.001)
  62. smua.source.limitv = restore_val
  63. ]]
  64.  
  65.     -- before blue light state change, delay a little 
  66.     delay(0.1)
  67.     -- Turn the output off
  68.     smua.source.output                    = smua.OUTPUT_OFF
  69.     
  70.  
  71.     -- IV data for the laser
  72.     if show_data == true then
  73.        -- Print the data back to the Console in tabular format
  74.        print(" Voltage\tCurrent\tResistance")
  75.        for x=1,smua.nvbuffer1.n do
  76.           -- Voltage readings are in nvbuffer2.  Current readings are in nvbuffer1.
  77.           print(smua.nvbuffer2[x], smua.nvbuffer1[x], smua.nvbuffer2[x]/smua.nvbuffer1[x] )
  78.        end
  79.     end
  80.     
  81.  
  82.     
  83. end
  84.  
  85. function reset_buffers(smu)
  86.         -- Prepare the Reading Buffers
  87.     smu.nvbuffer1.clear()
  88.     smu.nvbuffer1.appendmode        = 1
  89.     smu.nvbuffer1.collecttimestamps    = 1
  90.     smu.nvbuffer2.clear()
  91.     smu.nvbuffer2.appendmode        = 1
  92.     smu.nvbuffer2.collecttimestamps    = 1
  93.  
  94. end
  95.  
  96.  
  97. function config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, nplc, remoteSense)
  98.     
  99.     smu.source.func                    = smu.OUTPUT_DCAMPS
  100.     if (remoteSense == true) then
  101.         smu.sense                    = smu.SENSE_REMOTE
  102.     else
  103.         smu.sense                    = smu.SENSE_LOCAL
  104.     end
  105.     smu.source.autorangei            = smu.AUTORANGE_OFF
  106.     smu.source.rangei                = srcRange
  107.     smu.source.leveli                = 0
  108.     smu.source.limitv                = limitV
  109.  
  110.     -- Disabling Auto-Ranging and Auto-Zero ensures accurate and consistent timing
  111.     smu.measure.autozero            = smu.AUTOZERO_ONCE
  112.     smu.measure.autorangev            = smu.AUTORANGE_OFF
  113.     smu.measure.rangev                = limitV
  114.     smu.measure.nplc                = nplc
  115.     -- A timer will be used to set the measure delay and synchronize the measurement
  116.     -- between the SMUs so set the built in delay to 0.
  117.     smu.measure.delay                = 0
  118.     
  119.     -- Configure SMU Trigger Model for Sweep
  120.     --smu.trigger.source.lineari(start, stop, numPoints)
  121.     smu.trigger.source.listi(srclist)
  122.     smu.trigger.source.limitv        = limitV
  123.     smu.trigger.measure.action        = smu.ENABLE
  124.     smu.trigger.measure.iv(smu.nvbuffer1, smu.nvbuffer2)
  125.     smu.trigger.endpulse.action        = smu.SOURCE_IDLE
  126.     smu.trigger.endsweep.action        = smu.SOURCE_IDLE
  127.     smu.trigger.count                = table.getn(srclist)
  128.     smu.trigger.arm.stimulus        = 0
  129.     smu.trigger.source.stimulus        = trigger.timer[1].EVENT_ID
  130.     smu.trigger.measure.stimulus    = trigger.timer[3].EVENT_ID
  131.     smu.trigger.endpulse.stimulus    = trigger.timer[2].EVENT_ID
  132.     smu.trigger.source.action        = smu.ENABLE
  133. end
  134.  
  135.  
  136. --  **************************************  MAIN PROGRAM BELOW *****************
  137.  
  138. reset()
  139. errorqueue.clear()
  140.  
  141. nodesFound = tsplink.reset(1)
  142.  
  143. print("Nodes found = " .. nodesFound)
  144.  
  145. --smua.interlock.enable = smua.DISABLE
  146.  
  147.  
  148. -- use of pulse region 4 of 2602B:  10A at up to 20V
  149. -- max 1.8msec pulse with 1% duty cycle
  150. local PulseWidth = 1.0e-3
  151. local PulsePeriod = PulseWidth / 0.01
  152. local MeasDelay = PulseWidth * 0.8
  153. local nplc = (PulseWidth - MeasDelay - 60e-6) * localnode.linefreq
  154.  
  155.  
  156. print("Computed NPLC value: "..tostring(nplc))
  157.  
  158. if tostring(nplc) < "0.001" then
  159.   nplc = 0.001   -- 16.7usec, minimum value allowed
  160.   MeasDelay = 1e-6
  161. end -- if
  162.  
  163.  
  164. -- voltage ranges on 2602B:  100mV, 1V, 6V, 40V
  165. -- pick a limit value higher than expected I*DUT_R and
  166. -- puts you on appropriate range.
  167. local voltageLimit = 1
  168.  
  169. -- ranges:  decades of 10.....100mA, 1A, 3A, 10A
  170. local mySrcRange = 3  
  171. mysrclist = { 1.5}  -- use this one for a single pulse
  172. --local numPulses = table.getn(mysrclist)
  173.  
  174.  
  175.  
  176.    
  177.     --config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, nplc, remoteSense)
  178.     config_smu_list_sweep(1, node[1].smua, mySrcRange, mysrclist, voltageLimit, nplc, true)
  179.  
  180.  
  181.  
  182.    timer.reset()
  183.    
  184.    
  185.    Run_test(true, PulsePeriod, PulseWidth, MeasDelay) -- pass true to print data back to console
  186.    
  187.    time = timer.measure.t()
  188.    print("Time to run: "..time)
  189.    print("****************************************")
  190.    print("Current Source Range: "..node[1].smua.source.rangei)
  191.  
Posted about a year ago by C, Andrea
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:
  1. function Run_test(show_data, PulsePeriod, PulseWidth, MeasDelay)
  2.  
  3.  
  4.    -- when passthrough is true, the timer will "tic" immediately,
  5.    -- which for this application will start as soon as the
  6.    -- trigger model is ARMED.  
  7.    node[1].trigger.timer[1].delay = PulsePeriod
  8.    node[1].trigger.timer[1].stimulus = node[1].smua.trigger.ARMED_EVENT_ID
  9.    node[1].trigger.timer[1].count = 1  --PulseCount - 1
  10.    node[1].trigger.timer[1].passthrough = true
  11.    node[1].trigger.timer[1].clear()
  12.    
  13.    node[1].trigger.timer[2].delay = PulseWidth
  14.    node[1].trigger.timer[2].stimulus = node[1].trigger.timer[1].EVENT_ID
  15.    node[1].trigger.timer[2].count = 1        
  16.    node[1].trigger.timer[2].passthrough = false
  17.    node[1].trigger.timer[2].clear()
  18.    
  19.    node[1].trigger.timer[3].delay = MeasDelay
  20.    node[1].trigger.timer[3].stimulus = node[1].trigger.timer[1].EVENT_ID
  21.    node[1].trigger.timer[3].count = 1        
  22.    node[1].trigger.timer[3].passthrough = false
  23.    node[1].trigger.timer[3].clear()
  24.  
  25.  
  26.     
  27.     -- digital output trigger for external equipment
  28.     -- configure digital IO line 1 to output a active LO/falling edge
  29.     -- pulse at start of each current pulse
  30.     digio.trigger[1].clear()
  31.     digio.trigger[1].mode = digio.TRIG_FALLING  --digio.TRIG_RISINGM
  32.     digio.trigger[1].pulsewidth = 100e-6
  33.     digio.trigger[1].stimulus = node[1].trigger.timer[1].EVENT_ID  -- source stimulus too
  34.     
  35.         
  36.    -- clear the reading buffers
  37.    reset_buffers(node[1].smua)
  38.      
  39.  
  40.  
  41.     -- Turn the outputs on
  42.     smua.source.output                    = smua.OUTPUT_ON
  43.     
  44.     -- after blue light state change, delay a little 
  45.     delay(0.1)  
  46.  
  47.     -- Start the trigger model execution
  48.     smua.trigger.initiate()   -- start this one last as all the other smus follow this leader
  49.     
  50.     -- Wait until the sweep has completed
  51.     waitcomplete()
  52.  
  53. --[[
  54. -- hot switch:
  55. -- to bleed off the trapped charge on PN junction capacitance and non-zero voltage
  56. -- briefly set the voltage compliance to small number
  57. restore_val = smua.source.limitv
  58. smua.source.limitv = 0.01
  59. delay(0.001)
  60. smua.source.limitv = restore_val
  61. ]]
  62.  
  63.     -- before blue light state change, delay a little 
  64.     delay(0.1)
  65.     -- Turn the output off
  66.     smua.source.output                    = smua.OUTPUT_OFF
  67.     
  68.  
  69.     -- IV data for the laser
  70.     if show_data == true then
  71.        -- Print the data back to the Console in tabular format
  72.        print(" Voltage\tCurrent\tResistance")
  73.        for x=1,smua.nvbuffer1.n do
  74.           -- Voltage readings are in nvbuffer2.  Current readings are in nvbuffer1.
  75.           print(smua.nvbuffer2[x], smua.nvbuffer1[x], smua.nvbuffer2[x]/smua.nvbuffer1[x] )
  76.        end
  77.     end
  78.     
  79.  
  80.     
  81. end
  82.  
  83. function reset_buffers(smu)
  84.         -- Prepare the Reading Buffers
  85.     smu.nvbuffer1.clear()
  86.     smu.nvbuffer1.appendmode        = 1
  87.     smu.nvbuffer1.collecttimestamps    = 1
  88.     smu.nvbuffer2.clear()
  89.     smu.nvbuffer2.appendmode        = 1
  90.     smu.nvbuffer2.collecttimestamps    = 1
  91.  
  92. end
  93.  
  94.  
  95. function config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
  96.     
  97.     smu.source.func                    = smu.OUTPUT_DCAMPS
  98.     if (remoteSense == true) then
  99.         smu.sense                    = smu.SENSE_REMOTE
  100.     else
  101.         smu.sense                    = smu.SENSE_LOCAL
  102.     end
  103.     smu.source.autorangei            = smu.AUTORANGE_OFF
  104.     smu.source.rangei                = srcRange
  105.     smu.source.leveli                = 0
  106.     smu.source.limitv                = limitV
  107.  
  108.     -- Disabling Auto-Ranging and Auto-Zero ensures accurate and consistent timing
  109.     smu.measure.autozero            = smu.AUTOZERO_ONCE
  110.     smu.measure.autorangev            = smu.AUTORANGE_OFF
  111.     smu.measure.rangev                = EOA_limit
  112.     smu.measure.nplc                = nplc
  113.     -- A timer will be used to set the measure delay and synchronize the measurement
  114.     -- between the SMUs so set the built in delay to 0.
  115.     smu.measure.delay                = 0
  116.     
  117.     -- Configure SMU Trigger Model for Sweep
  118.     --smu.trigger.source.lineari(start, stop, numPoints)
  119.     smu.trigger.source.listi(srclist)
  120.     smu.trigger.source.limitv        = EOA_limit
  121.     smu.trigger.measure.action        = smu.ENABLE
  122.     smu.trigger.measure.iv(smu.nvbuffer1, smu.nvbuffer2)
  123.     smu.trigger.endpulse.action        = smu.SOURCE_IDLE
  124.     smu.trigger.endsweep.action        = smu.SOURCE_IDLE
  125.     smu.trigger.count                = table.getn(srclist)
  126.     smu.trigger.arm.stimulus        = 0
  127.     smu.trigger.source.stimulus        = trigger.timer[1].EVENT_ID
  128.     smu.trigger.measure.stimulus    = trigger.timer[3].EVENT_ID
  129.     smu.trigger.endpulse.stimulus    = trigger.timer[2].EVENT_ID
  130.     smu.trigger.source.action        = smu.ENABLE
  131. end
  132.  
  133.  
  134. --  **************************************  MAIN PROGRAM BELOW *****************
  135.  
  136. reset()
  137. errorqueue.clear()
  138.  
  139. nodesFound = tsplink.reset(1)
  140.  
  141. print("Nodes found = " .. nodesFound)
  142.  
  143. --smua.interlock.enable = smua.DISABLE
  144.  
  145.  
  146. -- use of pulse region 4 of 2602B:  10A at up to 20V
  147. -- max 1.8msec pulse with 1% duty cycle
  148. local PulseWidth = 1.0e-3
  149. local PulsePeriod = PulseWidth / 0.01
  150. local MeasDelay = PulseWidth * 0.8
  151. local nplc = (PulseWidth - MeasDelay - 60e-6) * localnode.linefreq
  152.  
  153.  
  154. print("Computed NPLC value: "..tostring(nplc))
  155.  
  156. if tostring(nplc) < "0.001" then
  157.   nplc = 0.001   -- 16.7usec, minimum value allowed
  158.   MeasDelay = 1e-6
  159. end -- if
  160.  
  161.  
  162. -- voltage ranges on 2602B:  100mV, 1V, 6V, 40V
  163. -- pick a limit value higher than expected I*DUT_R and
  164. -- puts you on appropriate range.
  165. local voltageLimit = 1
  166. local duringPulse_voltageLimit = 20
  167.  
  168. -- ranges:  decades of 10.....100mA, 1A, 3A, 10A
  169. local mySrcRange = 3  
  170. mysrclist = { 1.5}  -- use this one for a single pulse
  171. --local numPulses = table.getn(mysrclist)
  172.  
  173.  
  174.  
  175.    
  176.     --config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
  177.     config_smu_list_sweep(1, node[1].smua, mySrcRange, mysrclist, voltageLimit, duringPulse_voltageLimit, nplc, true)
  178.  
  179.  
  180.  
  181.    timer.reset()
  182.    
  183.    
  184.    Run_test(true, PulsePeriod, PulseWidth, MeasDelay) -- pass true to print data back to console
  185.    
  186.    time = timer.measure.t()
  187.    print("Time to run: "..time)
  188.    print("****************************************")
  189.    print("Current Source Range: "..node[1].smua.source.rangei)

​​​​​​​
Posted about a year ago by Kim, Minseo
Hello.
2nd script about EOA region is what I needed.
Thank you for your help.!

You must be signed in to post in this forum.