DAQ and power supplies
Data acquisition and electrical measurement drivers: NI DAQ, Rigol/EA power supplies, Keithley/Voltcraft multimeters, oscilloscopes.
Overview
Data acquisition and power equipment form the infrastructure of experiment automation. Quatm provides a unified NI-DAQmx wrapper together with SCPI/Modbus instrument drivers.
Rigol DP1116A programmable DC power supply
DP1116A Rigol DC power supply
| Communication | VISA |
| Output | 16V/10A or 32V/5A |
| Channels | 1 |
| Resolution | 1 mV / 1 mA |
Driver module:
DP1116Afrom quatm.drivers.rigol.power_supply import DP1116A
ps = DP1116A(addr="USB0::0x1AB1::0x0E11::DP1A123456789::INSTR")
ps.set_voltage(12.0) # 12V
dc.set_current(0.5) # 500 mA current limit
ps.enable_output(True)
Rigol DP932 programmable DC power supply
Provides programmable DC power for a wide range of laboratory equipment.
from quatm.drivers.rigol.dp932 import RigolDP932
psu = RigolDP932("USB0::...")
psu.set_voltage(1, 5.0) # Channel 1: 5.0 V
psu.set_current(1, 1.0) # Channel 1: 1.0 A current limit
psu.output_on(1)
NI-SWITCH matrix/multiplexer switches
PXI-25xx / SCXI-11xx series NI-SWITCH
| Communication | NI-SWITCH API |
| Topology | matrix/multiplexer/general-purpose |
| Channels | depends on module |
| Switching speed | ms range |
| Maximum voltage | 300 V (depends on module) |
niswitch Python API. They are suited to signal routing, multiplexed calibration and coil polarity reversal in experiments.Driver module:
ni_switchfrom quatm.drivers.NI.ni_switch import NISwitch
sw = NISwitch(resource_name="PXI1Slot2")
sw.connect(channel1="ch0", channel2="com0")
sw.disconnect(channel1="ch0", channel2="com0")
all_relays = sw.get_relay_count()
NI-Digital digital waveform generator/analyzer
PXIe-657x / PXIe-655x series NI-Digital
| Communication | NI-Digital Pattern API |
| Channels | 32–128 |
| Rate | up to 200 MHz |
| Voltage | 1.2–5.5 V (programmable) |
| Features | pattern generation/acquisition, PMU parametric measurement |
nidigital Python API. They generate and acquire high-speed digital waveforms for custom TTL timing protocols and chip-level digital testing.Driver module:
ni_digitalfrom quatm.drivers.NI.ni_digital import NIDigital
dig = NIDigital(resource_name="PXI1Slot3")
dig.configure_voltage_levels(voltage=3.3)
pattern = [0b10101010] * 100 # 100-cycle digital waveform
dig.burst_pattern(pattern, frequency=10e6)
NI-DAQmx multifunction data acquisition
PCIe-63xx / USB-63xx / PXI series NI DAQ
| Communication | NI-DAQmx |
| Analog input | 16-bit, up to 2 MS/s |
| Analog output | 16-bit |
| Digital I/O | TTL, up to 10 MHz |
| Counters | 2–4 channels |
Driver module:
NIDAQfrom quatm.drivers.NI.daq import NIDAQ
daq = NIDAQ(
dev_name="Dev1",
rate=100_000, # 100 kS/s
buffer_size=10_000,
)
# Analog input (continuous acquisition)
daq.configure_ai(channels=["ai0", "ai1"], voltage_range=(-10, 10))
daq.start_ai()
data = daq.read_ai(samples=1000)
# Analog output
daq.configure_ao(channels=["ao0"], voltage_range=(0, 5))
daq.write_ao(channel="ao0", voltage=3.3)
# Digital I/O
daq.configure_di(lines=["port0/line0"])
daq.configure_do(lines=["port0/line1"])
daq.write_do(line="port0/line1", value=True)
# Counters (photon counting / frequency measurement)
daq.configure_counter(
counter="ctr0",
mode="edge_count",
source="PFI0",
)
counts = daq.read_counter("ctr0")
Conrad relay board controller
Relay Board Conrad
| Communication | serial (19200 baud, binary protocol) |
| Channels | 8 relays per board, daisy-chainable |
| Contacts | AC/DC switching |
Driver module:
RelayBoardfrom quatm.drivers.Conrad.base import RelayBoard
# Single board
rb = RelayBoard(conn="/dev/ttyUSB0", start_addr=0)
rb.set_relay(relay=0, state=True) # Close relay 1
rb.set_relay(relay=3, state=False) # Open relay 4
# Byte write (controls 8 channels at once)
rb.write_byte(0b10101010)
Elektro Automatik PS2000B high-power supply
PS2000B series Elektro Automatik
| Communication | serial (115200 baud) |
| Power | 640 W – 15 kW (depends on model) |
| Voltage | up to 1500 V |
| Current | up to 510 A |
| Modes | constant voltage/current/power |
Driver module:
PS2000Bfrom quatm.drivers.ElektroAutomatik.base import PS2000B
ps = PS2000B(conn="/dev/ttyUSB0", remote_mode=True)
# Constant-current mode — magnetic field coil
ps.set_current(50.0) # 50 A
ps.set_voltage_limit(20.0) # 20 V voltage limit
ps.enable_output(True)
# Read actual values
actual_v = ps.get_voltage()
actual_i = ps.get_current()
Keithley 2110 benchtop digital multimeter
2110 Keithley
| Communication | VISA (USB/LAN) |
| Functions | DCV/ACV/DCI/ACI/resistance/capacitance/frequency/temperature |
| Accuracy | 5½ digits |
| Sampling rate | up to 50 kS/s |
Driver module:
Keithley2110from quatm.drivers.Keithley.multimeter import Keithley2110
dmm = Keithley2110(addr="USB0::0x05E6::0x2110::1234567::INSTR")
# DC voltage measurement
voltage = dmm.measure_voltage(range="10V")
# 4-wire resistance measurement
resistance = dmm.measure_resistance_4wire(range="100Ω")
# Temperature (thermocouple)
temp = dmm.measure_temperature(tc_type="K")
Voltcraft VC7055 two-channel benchtop multimeter
VC7055 Voltcraft
| Communication | serial (115200 baud, SCPI) |
| Channels | 2 |
| Functions | DCV/ACV/DCI/ACI/resistance/frequency/capacitance |
| Bluetooth | optional (VC7055BT) |
Driver module:
VC7055from quatm.drivers.Voltcraft.multimeter import VC7055
dmm = VC7055(addr="/dev/ttyUSB0")
# Simultaneous two-channel measurement
v1 = dmm.measure_voltage(channel=1)
v2 = dmm.measure_voltage(channel=2)
Device configuration
"daq": {
"type": "local",
"module": "drivers.NI.daq",
"class": "NIDAQ",
"arguments": {"dev_name": "Dev1", "rate": 100_000},
},
"coil_ps": {
"type": "local",
"module": "drivers.ElektroAutomatik.base",
"class": "PS2000B",
"arguments": {"conn": "/dev/ttyUSB0", "remote_mode": True},
},
"dmm": {
"type": "local",
"module": "drivers.Keithley.multimeter",
"class": "Keithley2110",
"arguments": {"addr": "USB0::..."},
},