• RE: Cannot get 2500 readings per second with Keithley 2700

    You can try turning off the display:   :DISPLAY:ENABLE:STAT OFF

    I found an FAQ on tek.com for this topic.  It is indicating that the TRACE buffer is not the fastest one.

    Max Reading Rate from 2700, 2701 or 2750

    Alternate commands:
    1. *RST
    2.  
    3. :SENSE:FUNC 'VOLT:DC'
    4.  
    5. :SENSE:VOLT:NPLC 0.01
    6.  
    7. :SENSE:VOLT:RANGE 10
    8.  
    9. :SENSE:VOLT:AVER:STAT OFF
    10.  
    11. :SAMPLE:COUNT 1000
    12.  
    13. :TRIG:DELAY 0.0
    14.  
    15. :SYSTEM:AZERO:STAT OFF
    16.  
    17. :DISPLAY:ENABLE:STAT OFF
    18.  
    19. :READ?
    20.  
    21. Now read the data...
    22.  
    23. To check for maximum speed apply a 1V RMS at 2Hz to the input. Run the above command sequence.
    24.  
    25. The 1000 readings should show one complete cycle or less. This shows the meter is taking data at least at a rate of 2000 readings per second.
  • RE: Using Keithley 3706A with a python script

    Here is some Python sample code for scanning some channels with model 3706A:
    1. import pyvisa                                              
    2. import time                                                
    3. import matplotlib.pyplot as plt                
    4. import pandas as pd
    5.  
    6.  
    7. def check_error():
    8.     status = my3706A.read_stb()
    9.     if int(status) & 4 == 4 :    #test if the EAV (error available) bit is set
    10.         error_response = my3706A.query("print(errorqueue.next())")
    11.         print(error_response)
    12.     else:
    13.         print("No Errors")
    14.  
    15. def get_scanState():
    16.     my3706A.write("scanState, scanCount, stepCount, lastReading = scan.state()")
    17.     return int(float(my3706A.query("print(tonumber(scanState))")))
    18.    
    19.  
    20. DEBUG = 0
    21. my3706A = pyvisa.ResourceManager().open_resource('TCPIP0::192.168.1.214::INSTR')
    22. #my3706A = pyvisa.ResourceManager().open_resource('USB0::0x05E6::0x3706::04428124::INSTR') # Connect to the keithley and set it to a variable named multimeter.
    23. my3706A.timeout = 10000  #number of msec to wait for VISA command completions
    24. #my3706A.write("")
    25. #put instrument into known state
    26. my3706A.write('reset()')
    27. my3706A.write('status.reset()')
    28. my3706A.write('errorqueue.clear()')
    29. #allocate a buffer for the measurements
    30. my3706A.write('buf=dmm.makebuffer(1000)')
    31. my3706A.write('buf.clear()')
    32. my3706A.write('buf.appendmode=1')
    33. my3706A.write('buf.collectchannels=1')
    34.  
    35. if DEBUG: check_error()
    36. #configure the DMM settings
    37. my3706A.write("dmm.func= dmm.DC_VOLTS")  #   TWO_WIRE_OHMS   DC_VOLTS
    38. my3706A.write("dmm.range=1")
    39. my3706A.write("dmm.autorange=1")
    40. my3706A.write("dmm.nplc= 1")   #0.0005 to 15 for 60Hz power
    41. my3706A.write("dmm.autozero= dmm.ON")
    42. my3706A.write("dmm.autodelay= dmm.ON")
    43.  
    44. if DEBUG: check_error()
    45. #associate these dmm settings with a configuration name
    46. # do not use a factory preset name, e.g., 'dcvolts'
    47. # custom settings = requires custom name
    48. my3706A.write('dmm.configure.set("my_dcvolts")')
    49.  
    50. if DEBUG: check_error()
    51. #associate the dmm config with channels
    52. my3706A.write('dmm.setconfig("1001:1008", "my_dcvolts")')
    53.  
    54.  
    55. #define a scan
    56. my3706A.write('scan.measurecount=1')  # one reading per scan
    57. my3706A.write("scan.create('1001:1008')")
    58. my3706A.write("scan.scancount = 10")     # 10 scans
    59. # now that scan is setup, run the scan
    60. my3706A.write("buf.clear()")   # just in case, clear the buffer of any content
    61. #my3706A.write("scan.execute(buf)")  # this one does not return until scan completes
    62. my3706A.write("scan.background(buf)")  # this one returns;  Python needs to coordinate with done.
    63.  
    64. # setup a while loop to exit when scan state goes to 6 = scan.SUCCESS = done
    65. script_running = True
    66. DEBUG_LOOP = 0
    67. while script_running:
    68.     present_state = get_scanState()
    69.     if DEBUG_LOOP: print("Scan State: " + str(present_state))
    70.     if present_state == 6:
    71.         script_running = False
    72.     time.sleep(0.5) #delay before asking again
    73.  
    74. #ask for the data
    75. my3706A.write("printbuffer(1, buf.n, buf.relativetimestamps, buf.readings)")
    76. raw_data = my3706A.read()
    77. # raw data will be comman delimited string:
    78. # time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time...
    79. # parse the data
    80. raw_data_array = raw_data.split(",")
    81. timestamps = []
    82. chan1001 = []
    83. chan1002 = []
    84. chan1003 = []
    85. chan1008 = []
    86. num_channels = 8
    87. num_elements = num_channels * 2  #time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time....
    88. for element in range(0, len(raw_data_array), num_elements):
    89.     timestamps.append(float(raw_data_array[element]))
    90.     chan1001.append(float(raw_data_array[element+1]))
    91.     chan1002.append(float(raw_data_array[element+3]))
    92.     chan1003.append(float(raw_data_array[element+5]))
    93.     chan1008.append(float(raw_data_array[element+15]))
    94. #create dataframe
    95. data = {'Timestamp': timestamps, 'Channel 1': chan1001, 'Channel 2': chan1002, 'Channel 3': chan1003, 'Channel 8': chan1008}
    96. df = pd.DataFrame(data)
    97.  
    98. # Set 'Timestamp' as the index
    99. df.set_index('Timestamp', inplace=True)
    100. # Print the DataFrame
    101. print(df)
    102. # ********************  Simple Graph ******************
    103. plt.figure()
    104. plt.subplot(3, 1, 1) # nrows=3, ncols=1, index=1
    105. plt.plot(timestamps, chan1001, 'o-b')
    106. plt.subplot(312)
    107. plt.plot(timestamps, chan1002, 'x-r')
    108. plt.subplot(313)
    109. plt.plot(timestamps, chan1003, '.-g')
    110. plt.show()
    111.  
    112.  
    113. my3706A.clear()
    114. my3706A.close()
  • RE: 2450 Cyclic Voltametry

    The electrochemistry scripts for use with 2450, 2460 or 2461 are not open source.

    The scripts can be obtained on model number EC-UPGRADE

    EC-UPGRADE Kit Quick Start Guide
  • RE: DAQ6510 OverflowHz/V Issue

    In attached document, is more info and a sample TSP script.

  • RE: Questions about 3706

    On each of the DB78 connectors on the 3720 card, there are the +ILK and -ILK pins.
    Make sure to jumper these two pins together to enable the closure of the backplane relay.

    NOTE:  when using the 3720-ST wiring accessory, these jumpers are made for you.
  • RE: Count number of time a relay on a scanner card switches

    The IVI driver did not define a means to query that information from the card.
    The IVI driver does however have WriteString and ReadString as part of the DirectIO interface.
    1. //ask for closure counts from a channel list 
    2. driver.System.DirectIO.WriteString("print(channel.getcount(\"1001,1911\"))");
    3.                
    4. resultsListBox.Items.Add(driver.System.DirectIO.ReadString());

     
  • RE: Multiple 2602b SMU LabVIEW (GPIB)

    Hello,
    Please elaborate on the sweep until it finds a drop in current.  Is the sweep implemented as a loop controlled from LabVIEW?  And the LV code is where the evaluation about current drop occurs?
     
  • RE: AFG (as gate)+2602B SMU (as source and drain) measure the device I-t curve

    In the KickStart, for SMU1 where you force 0V, the current limit is set to 1uA.
    If you expect more Ids current than this, please increase.  

    You mention the AFG is driving the gate.  AFG typically uses BNC.  Is the outer shell of this connected to the common LO of the SMU channels?

    I expect each SMU connects their HI to the Source or Drain.  The LO of these two SMU are connected together for a common reference point.
    You also need the LO of the Vgs from the AFG to share this common reference point.
  • RE: 2636A: Basic TSP Commands Cause Runtime Errors

    Are you sure it is an A version?  There was an earlier version without any letter suffix (2636 vs 2636A vs. 2636B).
    The original 2636 level would not recognize the smua.trigger..... like what you experience.

    When you query the *IDN? command, what is the returned model number in the response?
  • RE: How to make a DC current measurement with the Keithley 3706A & 3730 matrix card

    On 3730, if able to read a voltage or ohms, you are probably closing backplane relay #1 to route a closed matrix crosspoint on row 1 to the internal voltage meter of 3706A.
    Amps measure input terminals on a multimeter are different from terminals for the VDC or Ohms.

    If you want to route a closed channel to the Amps meassure, make use of backplane relay 3 and do the measurments on that row.
    But you need to get the Amp meter connected to backplane relay 3.
    On the rear panel of 3706A is the DB15 connector which offers you connections to the DMM terminals and the backplane relays,
    Jumper the Amps HI and LO to backplane relay HI and LO on the DB15.
    Now when you close a matrix cross point and the backplane, the amp meter will be in series.

    NOTE:  when not routed through the amp meter, the circuit will be open and no current will flow.
    If that is a problem, consider placing a current completion shorting jumper on backplane relay 4 and close your current carry channels on that row.
    But keep in mind max current on the switch if multiple channels will be closed to this one jumper.