• 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.



     
  • RE: monitoring 6221 and 2182a using labview

    Before using Labview or any other software, try just manual operation by pressing the Delta button on the 6221.
    Reboot both.  Press Delta button and accept the default parameter values.  Press TRIG button when prompted.
    Can that succeed?

    Common pitfalls:
    the RS-232 cable needs to be of type null modem.  That is the type we ship with 6221/2182A.

    On both the 2182A and the 6221, configure the RS-232 settings.
     (19.2k BAUD, Flow is XonXoff, Terminator is CR).

    After setting RS-232 settings on 6221, make GPIB or LAN the active interface.  Otherwise you will see error +809.
     
  • RE: AFG310000 series not switching to sequence run mode

    The SEQ does have separate license to have all features such as repeat, jump, etc.
    Without the license, can load one waveform and continuous mode.

    Obtain Trial License
  • RE: Keithley 2410 turned into 2400 while being used in the production line.

    What is the serial number?

  • RE: How do I get Kickstart for a DAQ6510

  • RE: Error Codes when trying to use TSP and error codes when trying to use python.

    When running the above code, the following output occurs:
    *****
    KEITHLEY INSTRUMENTS INC.,MODEL 2636B,4597212,4.0.4
    
    First status byte polling value: 0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    0 - 0b0
    192 - 0b11000000
    Test time: 3.765706600010162
    Number of actual smua buffer pts: 1.51000e+02
    
    Polling loop done, status byte: 128
    Go get the data.
    After data downloaded, status byte: 128
    Post reset, status byte value: 0
    
    

     
  • RE: Error Codes when trying to use TSP and error codes when trying to use python.

    In Test Script Builder, look for the samples in folders labeled with 2600 such as KE26XXB_Example_Scripts.

    In your post, you are attempting to use commands related to different products/different model numbers which have different command set from what the 2602B understands.

    Here is some Python code for use with 2600B to carry out a voltage sweep and measure current.
    import pyvisa as visa
    import time
    import sys
    import numpy as np
    import matplotlib.pyplot as plt
    
    resource_mgr = visa.ResourceManager()
    
    try:
         #get a session/handle for one resource
         #change the instrument_resource_string for YOUR INSTRUMENT  
         #instrument_resource_string = "USB0::0x05E6::0x2602::4566591::INSTR"
         instrument_resource_string = "USB0::0x05E6::0x2636::4597212::INSTR"
         #instrument_resource_string = "TCPIP0::192.168.1.208::INSTR"
         my_instr = resource_mgr.open_resource(instrument_resource_string)
    except visa.VisaIOError as e:
         #did not connect.....
         print("Whoops, something went wrong")
         #print(e.args)
         #print(resource_mgr.last_status)
         print(resource_mgr.visalib.last_status)
         sys.exit(1)
    
    
    # set some parameters for our session
    my_instr.timeout = 25000   #timeout in msec
    #my_instr.write_termination = '\n'
    my_instr.VI_ATTR_TCPIP_KEEPALIVE = True
        
    my_instr.write("*IDN?\n")
    print("*****")
    print(my_instr.read())
    
    # set commands to setup a trigger model linear sweep
    num_sweep_pts = 151
    cmd_list = ["reset()",
                "errorqueue.clear()",
                "smua.source.func = smua.OUTPUT_DCVOLTS",
                "smua.source.limiti = 100e-3",
                "smua.source.rangev = 2",
                "smua.measure.nplc = 1",
                "smua.measure.delay = smua.DELAY_AUTO",
                "smua.measure.delayfactor = 1.0",
                "smua.measure.lowrangei = 100e-9",
                "smua.nvbuffer1.clear()",
                "smua.nvbuffer1.collecttimestamps = 1",
                "smua.nvbuffer2.clear()",
                "smua.nvbuffer2.collecttimestamps = 1",
                "smua.trigger.source.linearv(-1.0, 1.0, " + str(num_sweep_pts) + ")",
                "smua.trigger.source.limiti = 0.1",
                "smua.trigger.measure.action = smua.ENABLE",
                "smua.trigger.measure.iv(smua.nvbuffer1, smua.nvbuffer2)",
                "smua.trigger.endpulse.action = smua.SOURCE_HOLD",
                "smua.trigger.endsweep.action = smua.SOURCE_IDLE",
                "smua.trigger.count = " + str(num_sweep_pts),
                "smua.trigger.source.action = smua.ENABLE"]    
    
    for cmd in cmd_list:
        my_instr.write(cmd)    
        
    
    #commands to configure SRQ when SWEEPING bit goes 1 to 0 = sweep is finished
    # see Chapter 12 in 2600B Reference Manual
    cmd_list2 = ["status.reset()",
                 "status.operation.enable = status.operation.SWEEPING",
                 "status.operation.sweeping.enable = status.operation.sweeping.SMUA",
                 "status.operation.sweeping.ptr = 0",
                 "status.operation.sweeping.ntr = status.operation.sweeping.SMUA",
                 "status.request_enable = status.OSB"]    
    
    for cmd in cmd_list2:
        my_instr.write(cmd)
    
    
    #turn output on and run the sweep
    my_instr.write("smua.source.output = smua.OUTPUT_ON")
    
    t1 = time.perf_counter()
    
    # important to read stb once before starting trigger model
    print("First status byte polling value: " + str(int(my_instr.read_stb())))   
    
    #start the trigger model operation
    my_instr.write("smua.trigger.initiate()")  
    
    # ********************************************
    # setup a polling loop to detect Sweep is finished
    #repeat until the MSS (SRQ) bit is set
    still_running = True
    status_byte = 0
    debug = 1
    
    # attempts to my_instr.query("print(status.condition)") will be blocked by active trigger model task
    # instead use my_instr.read_stb() to obtain status.condition register
    
    while still_running:
        status_byte = int(my_instr.read_stb())  #read status byte (status.condition register)
        if debug: print(str(status_byte) + ' - ' + str(bin(status_byte)))    
        if (status_byte & 64) == 64:
             still_running = False
        time.sleep(0.25)  #250msec pause before asking again
    
    
    #turn output off
    my_instr.write("smua.source.output = smua.OUTPUT_OFF")
    
    t2 = time.perf_counter()
    print('Test time: {}'.format(t2 - t1))
    print("Number of actual smua buffer pts: " + str(my_instr.query('print(smua.nvbuffer1.n)')))   
    
    print("Polling loop done, status byte: " + str(int(my_instr.read_stb())))     
    
    print('Go get the data.')
    
    # retrieve data and graph it
    
    #ask for voltage and current; buffer2=voltage
    my_instr.write("printbuffer(1, smua.nvbuffer1.n, smua.nvbuffer2.readings,smua.nvbuffer1.readings)")
    raw_data = my_instr.read()            #one long comma delimited string
    
    print("After data downloaded, status byte: " + str(int(my_instr.read_stb())))   
    my_instr.write("status.reset()")
    print("Post reset, status byte value: " + str(int(my_instr.read_stb())))  
    
    # split yields an array of strings alternating voltage, current, voltage, current
    raw_data_array = raw_data.split(",")  
    
    volts = []
    current = []
    abs_current = []
    
    # step through the array of strings, step size 2
    # place the V and I into their own array of floats
    for i in range(0, len(raw_data_array),2):
        volts.append(float(raw_data_array[i]))
        current.append(float(raw_data_array[i+1]))
        abs_current.append(abs(float(raw_data_array[i+1])))   #absolute value of currents for log scale
        
    #plot the absolute value of current vs. voltage    
    plt.plot(volts, abs_current, 'o-g')
    
    x_min = min(volts) * 1.1
    x_max = max(volts) * 1.1
    y_min = abs(min(abs_current)) / 10
    y_max = abs(max(abs_current)) * 10
    plt.axis([x_min,x_max,y_min,y_max])
    plt.yscale('log')
    plt.xscale('linear')
    plt.title('Sweep V, Measure I, 1MOhm')
    plt.margins(x=0.1, y=0.1)
    plt.grid(True)
    
    plt.show()
    
    save_image = 0
    if save_image:
        plt.savefig('alc_plot.png')