实验控制与其他
ADwin、NI-FPGA、Red Pitaya 等 FPGA 控制器与辅助设备驱动,覆盖从纳秒级实时时序到通用开关逻辑的全谱实验控制需求。
概述
FPGA 控制器和辅助设备是实验自动化的重要组成——从纳秒级实时时序到继电器开关,Quatm 提供统一的控制接口。目前已支持 ADwin、NI-FPGA、Red Pitaya 等多个品牌。
ADwin
概述
ADwin 是 Jaeger Computergesteuerte Messtechnik 公司的实时控制器系列,基于 FPGA/DSP 架构,独立于 PC 操作系统执行实时任务。
ADwin Gold II / Pro II
| 通信 | PCI / USB |
| 处理器 | DSP + FPGA |
| 时序精度 | 纳秒级 |
| 模拟输入 | 16-bit |
| 数字 I/O | TTL (5V) |
| 内存 | 32 MB DRAM |
驱动模块:
ADwin工作原理
PC (Quatm) ADwin (实时)
┌──────────┐ PCI/USB ┌──────────────┐
│ experiment│ ←──────────→ │ ADbasic 进程 │
│ .py │ Par/Data │ 纳秒时序 + 采集 │
└──────────┘ └──────────────┘
Quatm 实验脚本通过 ADwin 驱动读写参数和数据数组,与 ADwin 上运行的 ADbasic 进程交互。时序关键部分在 ADwin 硬件上执行,Python 侧负责参数设置和结果读取。
初始化
from quatm.drivers.adwin import ADwin
# 连接 ADwin(PCI 总线)
adw = ADwin(device_number=1)
# 加载并启动 ADbasic 进程
adw.load_process("experiment_sequence.TB1")
adw.start_process()
# 设置实验参数
adw.set_par(1, 100_000) # Par_1 = 100 µs 冷却时间
adw.set_par(2, 50) # Par_2 = 50 次循环
adw.set_par(3, 10_000) # Par_3 = 10 ms 探测时间
# 启动一次实验序列(ADbasic 中通过事件触发)
adw.trigger()
# 读取采集数据
photons = adw.get_data(1, data_length=1000) # 从 Data_1 读取光子计数
关键方法
| 方法 | 说明 |
|---|---|
load_process(binary_path) | 加载 ADbasic 编译的二进制进程 |
start_process() | 启动已加载的进程 |
stop_process() | 停止运行中的进程 |
set_par(index, value) | 写入整型参数(1–80) |
set_fpar(index, value) | 写入浮点参数(1–80) |
get_par(index) | 读取整型参数 |
get_data(index, data_length) | 读取数据数组(1–200) |
set_data(index, values) | 写入数据数组 |
trigger() | 发送软件触发事件 |
典型 ADbasic 进程结构
' ADbasic 代码片段 — 实验时序
Init:
Par_1 = 100000 ' 冷却时间 (µs)
Par_2 = 50 ' 循环次数
Event:
For i = 1 To Par_2
P2_DAC(1, 5000) ' 设置 AOM 功率
P2_DAC(2, 800) ' 设置磁场
' ... 等待、采集、切换 ...
Next i
设备配置
"adwin": {
"type": "local",
"module": "quatm.drivers.adwin",
"class": "ADwin",
"arguments": {"device_number": 1},
}
开发调试
开发阶段可使用ADwinDummy 模拟器(无硬件)测试实验逻辑。模拟器提供相同的 API 接口但不执行实际硬件操作,适合在办公电脑上开发和验证实验脚本。Exception:
quatm.drivers.adwin.adwin.AdWinDriverError(message)class quatm.drivers.adwin.adwin.AdWinDriverError(Exception): pass
quatm.drivers.adwin.client module
Class:
quatm.drivers.adwin.client.AdWinClient(experiment, simulating=None)class quatm.drivers.adwin.client.AdWinClient(object): def filter_cmdlist(self, combinetime=1e-08): pass def push(self, time, command, value, combinetime=1e-09): pass def start_realtime(self, processortime=0, repetitions=1): pass def stop(self): pass
quatm.drivers.adwin.units module
NI-FPGA LabVIEW FPGA 模块化仪器
PXIe-78xxR / PCIe-78xxR 系列 NI-FPGA
| 通信 | NI-FPGA Interface Python API |
| FPGA | Xilinx Kintex/Virtex |
| 数字 I/O | 最高 1 Gb/s |
| 模拟 I/O | 最高 3.2 GS/s |
| 编程 | LabVIEW FPGA + Python 运行时控制 |
nifpga Python API 在运行时控制 LabVIEW FPGA 位流。适合需要极高吞吐量和确定性时序的自定义数字信号处理。驱动模块:
ni_fpgafrom quatm.drivers.NI.ni_fpga import NIFPGA
fpga = NIFPGA(resource_name="RIO0", bitfile="custom_logic.lvbitx")
fpga.run()
fpga.write_control("pulse_width", 100) # ns
fpga.write_control("trigger_delay", 50)
fpga.read_indicator("photon_count")
与 ADwin 的对比
| 特性 | ADwin | NI-FPGA |
|---|---|---|
| 编程语言 | ADbasic (类 BASIC) | LabVIEW FPGA (图形化) |
| Python 控制 | 参数/数据数组读写 | 控件/指示器读写 |
| 适用场景 | 纳秒时序、光子计数 | 高速 DSP、自定义协议 |
| 硬件生态 | 独立控制器 | NI PXI 平台集成 |
Conrad 继电器板
Relay Board Conrad
| 通信 | 串口 (19200 baud) |
| 通道 | 8 继电器/板 |
| 支持 | 菊花链扩展 |
驱动模块:
RelayBoardfrom quatm.drivers.Conrad.base import RelayBoard
rb = RelayBoard(conn="/dev/ttyUSB0", start_addr=0)
rb.set_relay(relay=0, state=True)
rb.set_relay(relay=3, state=False)
rb.write_byte(0b10101010)
开发调试
开发阶段可使用ADwinDummy 模拟器测试实验逻辑,无需连接实际硬件。