实验控制与其他

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/OTTL (5V)
内存32 MB DRAM
运行 ADbasic 编译的实时进程,与 Quatm 通过共享内存或寄存器读写通信。典型应用包括激光冷却时序、MOT 磁场开关和光子计数采集。
驱动模块: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},
}

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
FPGAXilinx Kintex/Virtex
数字 I/O最高 1 Gb/s
模拟 I/O最高 3.2 GS/s
编程LabVIEW FPGA + Python 运行时控制
通过 nifpga Python API 在运行时控制 LabVIEW FPGA 位流。适合需要极高吞吐量和确定性时序的自定义数字信号处理。
驱动模块:ni_fpga
from 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")

Conrad 继电器板

⚙️ Relay Board Conrad
通信串口 (19200 baud)
通道8 继电器/板
支持菊花链扩展
经济型多通道继电器控制器,适合磁阱线圈极性切换、设备供电开关和激光快门控制。
驱动模块:RelayBoard
from 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)