QCoDeS Example with Tektronix Keithley Digital Multimeter DMM6500¶
Initialization and Connection¶
The Keithley digital multimeter DMM6500 for the measurement of voltage, current, and resistance, amongst others. The driver implements the measurement of DC voltage and current, as well as the measurement of a resistance via 2- or 4-wire measurement.
[1]:
import qcodes as qc
import qcodes_contrib_drivers.drivers.Tektronix.Keithley_6500 as dmm6500
Create the instrument (in this case a DMM6500 connected via USB). If a scanner card is inserted, it will be detected.
[3]:
dmm = dmm6500.Keithley_6500('dmm_1','TCPIP0::192.168.1.12::inst0::INSTR')
Connected to: KEITHLEY INSTRUMENTS DMM6500 (serial:04438044, firmware:1.0.04b) in 0.07s
Scanner card 2000-SCAN detected.
Performing simple measurements¶
The different senses (DC voltage, DC current, 2 wire resistance, 4 wire resistance) are implemented as channels. For measuring the resistance via a two wire measurement enter:
[6]:
dmm.res.measure.get()
[6]:
5799.959
The commands for the different measurable quantities are: - dmm.res.measure.get(): 2 wire resistance - dmm.fres.measure.get(): 4 wire resistance - dmm.volt.measure.get(): DC voltage - dmm.curr.measure.get(): DC current
Alternatively the measurable quantities can be accessd directly via one of the following commands: - dmm.resistance.get(): 2 wire resistance - dmm.resistance_4w.get(): 4 wire resistance - dmm.voltage_dc.get(): DC voltage - dmm.current_dc.get(): DC current For instance, the resistance via a two wire measurement can be measured with the following command:
[7]:
dmm.resistance.get()
[7]:
5793.865
Querying the active terminal¶
The DMM6500 has a front and a rear terminal. The active terminal can only be switched via a knob on the front panel of the multimeter. The currently active terminal can be queried via:
[8]:
dmm.active_terminal.get()
[8]:
'FRON'
If the rear terminal is active, the same command returns:
[9]:
dmm.active_terminal.get()
[9]:
'REAR'
Using the 2000-SCAN scanning card¶
The 2000-SCAN scanning card allows to measure up to 10 channels via the rear terminal. To measure e.g. the resistance via channel 1, use:
[10]:
dmm.ch1.resistance.get()
[10]:
5798.519
Checking the active terminal¶
If the wrong terminal is active, an error is raised:
[11]:
dmm.ch1.resistance.get()
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-11-7c3ed5015dc0> in <module>
----> 1 dmm.ch1.resistance.get()
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\instrument\parameter.py in get_wrapper(*args, **kwargs)
583 except Exception as e:
584 e.args = e.args + ('getting {}'.format(self),)
--> 585 raise e
586
587 return get_wrapper
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\instrument\parameter.py in get_wrapper(*args, **kwargs)
570 try:
571 # There might be cases where a .get also has args/kwargs
--> 572 raw_value = get_function(*args, **kwargs)
573
574 value = self._from_raw_value_to_value(raw_value)
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\utils\command.py in __call__(self, *args)
176 raise TypeError(
177 'command takes exactly {} args'.format(self.arg_count))
--> 178 return self.exec_function(*args)
c:\users\frequency conversion\documents\code\qcodes_contrib_drivers\qcodes_contrib_drivers\drivers\Tektronix\Keithley_2000_Scan.py in _measure(self, quantity)
63 return self.ask("READ?")
64 else:
---> 65 raise RuntimeError("Front terminal is active instead of rear terminal.")
RuntimeError: ('Front terminal is active instead of rear terminal.', 'getting dmm-1_ch1_resistance')
[12]:
dmm.resistance.get()
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-12-84d4b9528614> in <module>
----> 1 dmm.resistance.get()
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\instrument\parameter.py in get_wrapper(*args, **kwargs)
583 except Exception as e:
584 e.args = e.args + ('getting {}'.format(self),)
--> 585 raise e
586
587 return get_wrapper
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\instrument\parameter.py in get_wrapper(*args, **kwargs)
570 try:
571 # There might be cases where a .get also has args/kwargs
--> 572 raw_value = get_function(*args, **kwargs)
573
574 value = self._from_raw_value_to_value(raw_value)
c:\users\frequency conversion\appdata\local\programs\python\python38\lib\site-packages\qcodes\utils\command.py in __call__(self, *args)
176 raise TypeError(
177 'command takes exactly {} args'.format(self.arg_count))
--> 178 return self.exec_function(*args)
c:\users\frequency conversion\documents\code\qcodes_contrib_drivers\qcodes_contrib_drivers\drivers\Tektronix\Keithley_6500.py in _measure(self, quantity)
152 return self.ask(f"MEAS:{quantity}?")
153 else:
--> 154 raise RuntimeError("Rear terminal is active instead of front terminal.")
RuntimeError: ('Rear terminal is active instead of front terminal.', 'getting dmm-1_resistance')