xDevs.com TECKit user's manual

xDevs.com TECKit app

VXI/GPIB Datalogger with temperature control functionality designed for DUT thermal stability measurement experiments.

For latest information and updates:

GitHub repository:


xDevs.com TECKit is a flexible open-source Python application for controlling multiple measurement instruments over GPIB or Ethernet bus.

Its main purpose is to perform controlled thermal chamber sweeps and measure various DUT parameters using external instruments. This is especially well suited for voltage reference, ADC/DAC and electronic component stability and performance evaluation.

Hardware requirements

  • Raspberry Pi or similar SoC/FPGA board running Linux OS
  • I2C access for BME280 sensor support
  • Agilent E5810A for VXI11-GPIB gateway support, if VXI interface is used or,
  • Agilent 82357B USB-GPIB interface dongle for linux-gpib or,
  • NI USB-GPIB-HS interface dongle for linux-gpib

Software requirements

  • Python 2.7.x
  • Installed and configured linux-gpib for GPIB interfacing
  • Installed and configured python-vxi11 for VXI interfacing
  • NumPy – median/standard deviation analysis
  • x256 0.0.3RGB color conversion for UI styling
  • configparser – configuration file parser/manager


Code or any information posted here is provided AS IS. In no event shall the author or any other 3rd party, including xDevs.com project be liable for any special, direct, indirect, or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortuous action, arising out of or in connection with the use or performance of application, code or any relevant information published here.

While reasonable effort put into making this app useful, there are zero assurances that the software will ever work for any user or use case (even documented ones).
You must agree with the above to have any right to use the software.


Once all dependencies met and environment setup configuration done, TECkit can be used to collect measurement data. Follow below step-by-step simplified guide to get started.

Step 1

Make sure your linux system is configured for linux-gpib or python-vxi. Setup guides are available for NI USB-GPIB-HS + linux-gpib or Agilent 82357B). There is simpler guide with Agilent E5810A as well.

For sensitive experiments BME380 environment sensor can be important to monitor environment changes and further data analysis. Connections and setup information available here .

Extract or clone repository on your Pi and configure settings file teckit.conf using text editor (see Configuration section below).

Step 2

Include desired measurement modules for instruments in main.py. It is important to keep one instance per instrument, even if instruments are same model/type. Current release for example enabled 5 instruments for measurement and 1 temperature controller.

if (cfg.get('mode', 'no_thermal', 1) == "false"):
    k2510  = imp.load_source('k2510' , 'devices/k2510.py')              # Load Keithley 2510 support
dmm1   = imp.load_source('hp3458', 'devices/hp3458.py')                 # Load Keysight 3458A support
dmm2   = imp.load_source('hp3458', 'devices/hp3458.py')                 # Load Keysight 3458A support
dmm3   = imp.load_source('k2002' , 'devices/k2002.py')                  # Load Keithley 2002 support
dmm4   = imp.load_source('k2002' , 'devices/k2002.py')                  # Load Keithley 2002 support
dmm5   = imp.load_source('hp3458', 'devices/hp3458.py')                 # Load Keysight 3458A support

Step 3

Initialize and configure instrument-specific settings. To initialize link instance like dmm1 to related module class dmm_meter with parameters (GPIB Bus address, 0, \”**Name for error tracking**\”)

dmm1 = dmm1.dmm_meter (2,0,"3458B")  # GPIB 2
dmm2 = dmm2.dmm_meter (3,0,"3458A")  # GPIB 3
dmm3 = dmm3.scpi_meter(4,0,"2002-4") # GPIB 4
dmm4 = dmm4.scpi_meter(6,0,"2002-6") # GPIB 6
dmm5 = dmm5.dmm_meter (10,0,"3458D") # GPIB 10

Required mode/range setting function from DMM class also called from main.py, such as set_ohmf_range to configure meter in 4-wire resistance measurement mode, and select desired range. See specific function naming/format in devices/hp3458.py to see how that translates into GPIB command sent to the actual equipment. Consult with instrument user’s manual for required command syntax.

dmm1.set_ohmf_range(1e3)                                                # 3458B function/range config
dmm2.set_ohmf_range(1e3)                                                # 3458A function/range config
dmm3.set_ohmf_range(200)                                                # K2002-4 function/range config
dmm4.set_ohmf_range(2000)                                               # K2002-6 function/range config
dmm5.set_ohmf_range(1e3)                                                # 3458D function/range config

Step 4

Each meter triggered and readout in main loop with measurement result is saved into meas_valN variable. If some variables unused, often in case when less than 6 instruments used, assign them to zero instead of removing, to preserve DSV output file formatting for future use. Code related to triggering and data collection from one meter:

dmm1.trigger()                         # Trigger DMM1
meas_val  = dmm1.read_val()[1]         # Collect measurement result
# Add results to array for stats math
sdev_arr1.extend([meas_val])           # Add new value into array for NumPy

Step 5

Run application to perform the measurement sequence:

# python ./main.py

Upon completion application will exit to console automatically. It can be also aborted at any time via usual methods like Ctrl+C. All data is saved after each sample, so even if you abort or kill the TECkit process, it will not cause loss of previously collected samples.


Flexibility of the app is managed thru configuration file teckit.conf, located in same directory as main.py app.
Some key settings:

env_sensor     = bme280         ; none for no sensor use, or bme280 for Bosch BME280 Environment sensor (I2C)
interface      = vxi            ; gpib for linux-gpib library to use with NI USB-GPIB-HS or **vxi** for python-vxi11 bidning for LAN-GPIB gateway
vxi_ip         =  ; IP address of LAN-GPIB gateway like Agilent E5810A. Not used if interface set to gpib
data_file      = tcr_res_k46_3458abd_sweep_test12_2019.dsv ; This is filename to store all measurement samples.

Temperature ramp settings are available in [testset] section.

sv_start            = 18.000  ; Chamber start temperature, in C
sv_end              = 18.000  ; Chamber end temperature, in C
peak_temp           = 50.000  ; <b>Top</b> soak temperature, in C
delay_start         = 0       ; Delay before any operation start, seconds
slope_pos           = 9000    ; Seconds for positive slope, seconds
slope_neg           = 9000    ; Seconds for negative slope, seconds
time_start          = 7200    ; Initial hold temperature time, before positive slope starts, seconds
time_hold           = 6000    ; Hold temperature duration time once reached peak_temp, seconds
time_end            = 3600    ; Hold temperature duration once ramp down finished, seconds

Setting delay_start to non-zero value could be useful to start TECkit experiment at later time when equipment will be available.

Start and end chamber temperature configured by first two settings sv_start and sv_end. This is required to allow thermal equilibrium once DUT is placed in chamber and thermal control is turned on. The feedback loop of the thermal control is purely hardware based, depending on used controller, there is no software control in app, other than programming desired temperature set point.

Each ramp sequence has five stages. Speed or duration of each stage configured in seconds, as shown on example listing above. It is recommended to keep hold start and peak_temp stages at least 30 minutes or more, to allow chamber reach thermal equilibrium, or the measurement data may have additional error due to unstable conditions. Ramp up and down stages can have different duration if needed. If these settings are set to very low value, like 2-5 seconds, sequence will be transformed into step response, which can be useful for PID/thermal chamber hardware tuning.

Supported instrumentation

Currently supported measurement/source devices

  • Keithley 2001 precision 7½-digit DMM
  • Keithley 2002 precision 8½-digit DMM
  • HP/Agilent/Keysight 3458A reference 8½-digit DMM
  • HP/Agilent 34401A 6.5-digit DMM
  • HP/Agilent 34420A 7½-digit nanovoltmeter
  • Fluke 8508A reference 8½-digit DMM
  • Fluke 8588A reference 8½-digit DMM
  • Datron 1281 reference 8½-digit DMM
  • Fluke 1590 SuperThermometer
  • Keithley 2182/2182A 7½-digit Nanovoltmeter
  • Keithley 182/182-M Nanovoltmeter
  • Keithley 6517/6517A Electrometer
  • Keithley 6430 SMU
  • Keysight B2985A and B2987A 6½-digit High-resistance/Picoammeter/Electrometer
  • Measurements International 6010B Automated Resistance Bridge (DCC)
  • Fluke 1590 SuperThermometer
  • Fluke 1529 Chub-E4 Thermometer
  • HP/Agilent/Keysight 53131A Frequency counter
  • HP/Agilent/Keysight 53132A Frequency counter
  • Fluke 5790A AC Voltage Standard
  • Wavetek 4920 AC Voltage Standard
  • Wavetek 4920M AC Voltage Standard
  • Agilent 4142B parametric analyzer SMU
  • Chroma 61600 or 61500 series AC/DC power source
  • Delta-measurement for low ohmic resistances with Fluke 57xx MFC+DVM
  • AC-DC transfers for Fluke 792A AC Voltage Standard (with HP3458A or Keithley 2182 or HP34420A)

Currently supported scanner/switches

  • Keithley 708A (7172A 8×12 low-current triax matrix card)
  • Keithley 7001/7002/7168 nanovolt scanner card
  • Dataproof 160/320A
  • Dataproof 160/320B

Temperature controllers

  • Keithley 2510 TEC SMU for temperature chamber control
  • Torrey Pines chambers
  • Arroyo TecPak 585 TEC controller
  • Arroyo 5310 TEC controller
  • ILX 5910B TEC controller for temperature chamber control
  • Fluke 1529 Chub-E4 thermometer

Environment monitoring

Usage examples and test rig design

Simplified compact thermal chamber design can be built with affordable set of parts, such as presented on the illustration. The key components are TEC, precision thermistor or RTD temperature sensor and suitable metal box with thick walls to maintain the temperature stability.

Use of TEC instead of passive power resistor serve dual purpose. If desired chamber temperature above the ambient, it will be used as a heater, and outside heatsink will be cooled. If desired temperature is below current box temperature, then controller will use TEC as cooling element and will regulate current flow to bring temperature down, heating up external radiator.

With some care in construction and good thermal insulation of all metal box surfaces from ambient air relative stability of temperature inside the chamber can be maintained at level +/-0.01 °C over hours long periods.

To make it even better/faster performing system small liquid cooling closed loop system can be used, like this one instead of fan-sink on external “hot” side of the TEC. It is much easier to insulate whole chamber together with pump and coldplate, instead of fiddling with fansink flow. With such liquid cooler and 40W generic TEC element (+12V 4A rating) temperature range +8C to +70C was easily achievable.

Other alternative is to repurpose small Peltier-based wine coolers in similar manner. This way one can have larger area for bigger DUT devices.

With temperature chamber control

After successful start, app will plot simple pseudo graphics text UI to provide means of monitoring experiment progress:

 │  xDevs.com TEC Experiment kit        -i- Datafile ../teckit/measure_example_jan2019.dsv exists   │
 │    GPIB[25] : Keithley 2510                                           Progress     : 11.96%      │
 │    GPIB[10] : Keysight 3458A                                          Total points : 4806        │
 │    GPIB[ 6] : Keithley 2002                                                                      │
 │    GPIB[17] : Fluke 1529                                                                         │
 │ Sample       :      575               Meter mode   : DCV              Set Temp     :  18.000 °C  │
 │ Next temp    : 18.000 °C              Measured val : 1000.01778900    Process Temp :  18.000 °C  │
 │ Min temp     : 18.000 °C              OCOMP/DELAY  : 1, 0 sec         TEC Current  :  -0.3706 A  │
 │ Peak temp    : 50.000 °C              Fixed range  : Configure        Status       :  Hold start │
 │ Remaining    :  8h 43m 14s            NPLC         :  100.0000        Gain         :  140.0000   │
 │ Elapsed time :  1h 11m 05s            Terminals    :   FRONT          Integral     :    0.1000   │
 │ Sample period: 7.42 sec               REL Value    :      1E-06       Derivative   :    0.9000   │
 │         Median A= 1000.017674000 V              Median K= 1000.010953000 V                       │
 │          Sdev A = 306.714 uV                     Sdev K = 370.634 uV                             │
 │ [   572] S18.000 P18.005 I-0.368  A1.000017904e+03 B1.000010179e+03 C5.000359900e+01 C           │
 │ [   573] S18.000 P17.995 I-0.367  A1.000017625e+03 B1.000011117e+03 C5.000361000e+01 C           │
 │ [   574] S18.000 P18.000 I-0.371  A1.000017789e+03 B1.000011065e+03 C5.000358600e+01 C           │
 │ [   553] S18.000 P18.001 I-0.367  A1.000017302e+03 B1.000011216e+03 C5.000349600e+01 C           │
 │ [   554] S18.000 P18.003 I-0.367  A1.000017566e+03 B1.000010758e+03 C5.000345400e+01 C           │
 │ [   555] S18.000 P17.998 I-0.368  A1.000018004e+03 B1.000010589e+03 C5.000347600e+01 C           │
 │ [   556] S18.000 P17.999 I-0.369  A1.000017153e+03 B1.000011302e+03 C5.000346300e+01 C           │
 │ [   557] S18.000 P18.001 I-0.369  A1.000017474e+03 B1.000010560e+03 C5.000346400e+01 C           │
 │ [   558] S18.000 P17.998 I-0.370  A1.000017124e+03 B1.000010968e+03 C5.000348600e+01 C           │
 │ [   559] S18.000 P17.999 I-0.369  A1.000017873e+03 B1.000010991e+03 C5.000348200e+01 C           │
 │ [   560] S18.000 P17.998 I-0.368  A1.000017390e+03 B1.000010767e+03 C5.000347500e+01 C           │
 │ Median A=    1.017674 V  B=    1.017674 V C=    1.017674 V D=    1.017674 V E=    1.017674 V     │
 │ Sdev   A=    1.017674 V  B=    1.017674 V C=    1.017674 V D=    1.017674 V E=    1.017674 V     │
 │ REF    A=                                                                                        │
 │    REF :       2000              Delta :-499991.106  ppm       │ 25.153°C  66.8%RH  1016.8 hPa   │

That’s it, now test is running

Without temperature control, datalog only

TECKit can be used as simple data logger as well, without running temperature controller part. For this edit teckit.conf configuration file with:

no_thermal     = true

When no_thermal is true, code related to the temperature controller hardware will not be executed, and only measurement instruments will be used for sampling.

All measurement values like instrument readings, ambient temperature data, meter temperatures and TEC chamber telemetry are stored in delimiter separated DSV format text file. This file have header to identify rows, such as:


Example data, obtained from TECkit results

DSV-data file from this run

Four instruments are used : HP 3458A GPIB 2 and 3, Keithley 2002 GPIB 4 and 6.
Temperature control done by Keithley 2510 GPIB 25 with 40W TEC module and Honeywell HEL-705 platinum RTD sensor.

Also latest TECkit also has new “xDevs” temperature curve program:

Environment data is logged in sync with all instruments too, even if TEC control not used.

Adding own measurement instrumentation support

Have instrument not in the supported list?
It is easy to add support of the new instrument, following example of existing hardware modules in /devices directory.

Author: Ilya Tsemenko
Created: Jan. 10, 2019, 4:47 a.m.
Modified: May 14, 2022, 6:25 p.m.