# NI DAQmx

\quad NI DAQmx 是 National Instruments(NI)公司开发的一款数据采集和控制软件。DAQmx 是 Data Acquisition (DAQ) Measurement eXperience 的缩写。它提供了一套强大而灵活的工具和 API,用于在计算机上进行数据采集、信号生成和控制的应用开发。NI DAQmx 支持多种硬件平台,包括 NI 的数据采集卡和模块、传感器、执行器等。它可以与各种传感器和信号源进行连接,如温度传感器、压力传感器、加速度计、光电开关等,以及模拟输出和数字输出设备。使用 NI DAQmx,开发人员可以通过简单易用的编程接口来配置和控制硬件设备,进行数据采集和信号生成。它提供了丰富的功能,包括多通道同步采集、高速采样、定时触发、硬件校准等。开发人员可以使用各种编程语言(如 LabVIEW、C、C++、Python 等)来编写应用程序,并通过 NI DAQmx 库与硬件设备进行交互。

# NI PXIe-6536 板卡

# PXIe 系统简介

\quad PXIe 具体写为 PXI Express,是一种基于 PCI Express 的仪器互连架构,广泛应用于自动化测试和测量系统中。
\quad PXIe 系统通常由一个控制器控制,该控制器可以是嵌入式的,也可以是连接电脑的。我们实验室就是连接电脑的。连接电脑与 PXIe 机箱的主要方法是使用专用的高速接口连接线缆,一些可以用某些接口的线连接,一些也可以用以太网连接实现远程控制。
\quad 插入到 PXIe 机箱中的各种 PXIe 板卡则可以连接各种仪器来实现各种功能。例如:

  1. 数据采集板卡:用于从外部传感器、设备或信号源中获取数据,并将数据传输到计算机进行分析和处理。这些板卡通常具有多个输入通道和高分辨率的模数转换器(ADC)。
  2. 信号生成板卡:用于生成各种类型的信号,如连续波形、脉冲信号、数字信号等,以用于测试、仿真或通信应用。这些板卡通常具有数字信号处理器(DSP)或波形发生器。
  3. 控制板卡:用于控制外部设备、执行器或系统的操作,例如运动控制、温度控制、电源管理等。这些板卡通常具有数字输入 / 输出(DIO)通道和各种接口。
    ......

不同的 PXIe 板卡可以根据需要组合在一起,以构建符合特定应用要求的完整测试和测量系统。

# NI PXIe-6536 板卡介绍

\quad NI PXIe-6536 板卡的官方介绍:32 通道、25 MHz、100 MB/s PXI 数字 I/O 模块。PXIe‑6536 可以通过 PXI Express 总线连续地传输数据。它是连接和测试图像传感器或显示面板的理想解决方案。该模块也非常适用于其他常用数字应用程序,如:模式 I/O、变化检测、协议仿真或其他自定义数字接口。它具有可选择的电压电平以及数字线路每通道方向控制功能

\quad 在我们的实验室,就是利用 NI PXIe-6536 板卡的 32 路数字输出通道(Digital I/O)连接到不同的仪器实现控制(例如各种激光对应的声光晶体的光电开关中实现光电控制)。

# python 编程时域控制激光

# 编程思路

  1. 设置一个周期的总时间 TT,和采样率 rr
  2. 写入时间信号序列,写入规则为:正数代表高电平的持续时间,负数代表低电平的持续时间。例:总时间设为 100ms,输入序列为:20, -30, 30, -20,对应的就是依次循环产生 20ms 的高电平、30ms 的低电平、30ms 的高电平、20ms 的低电平。(若输入序列的总时长低于设定的总时间,则后续时间会被默认补齐为低电平;若输入序列的总时长高于设定的总时间,则会报错)
  3. 根据每毫秒的采样点来生成采样点序列,将时间信号序列转化为布尔序列,例如在总时间 T=100(ms)T=100(\text{ms}) 采样率 r=106(s1)r=10^6(\text{s}^{-1}) 的条件下,时间序列 [20,50,30][20,-50,30] 将转化为 [True,,True2×104,False,,False5×104,True,,True3×104][\underbrace{\text{True},\cdots,\text{True}}_{2\times10^{4}个},\underbrace{\text{False},\cdots,\text{False}}_{5\times10^{4}个},\underbrace{\text{True},\cdots,\text{True}}_{3\times10^{4}个}] 的布尔序列。注意布尔序列的个数与采样率是匹配的。
  4. 将布尔序列 “写入” 相应的通道,则可以完成对于仪器开关的时域控制。

# 一个编程误区:

\quad 一开始的编程思路并不是采取如上所述的。最初高低电平的持续时间的是打算采用 “延迟” 实现的,即若总时间设置为 T=100(ms)T=100(\text{ms}),时间序列为 [20,30,50][20,-30,50],则在 0ms0 \text{ms} 时刻输出高电平,再将程序延迟 20ms20 \text{ms} 后再输出低电平,之后再延迟 30ms30\text{ms} 后再输出高电平。
\quad 这样的编程思路在只需要用到单个通道时是没太大问题的(除了波形有十分十分微小的抖动之外)。但当我们需要控制多个光开关时,即需要设置多个通道的时间序列时,就会出现一个很严重的问题:窜扰,或通俗称为窜信号
\quad 出现该情况的原因我的想法如下。NI PXIe-6536 板卡的 32 个通道是并行的。并行传输总线是多个数据同步传输的,这就要做到三点:

  1. 传输数据出去之前,需要让数据排排站对齐好;
  2. 传输数据过程中,也需要让数据排排站对齐好;
  3. 到了目的地后,还需要让数据排排站对齐好。

若采取最初的编程思路,就会在 “排排站对齐好” 这一步出错,因为各个通道在一个周期内输出的数据数是不同步的。例如若 AA 通道的时间序列为 [50,50][50,-50],则它的一个周期内只会输出两个数据(在 0ms0\text{ms} 时刻输出代表高电平的数据 11,在 50ms50\text{ms} 时刻输出代表低电平的数据 00);但 BB 通道的时间序列可能为 [20,30,20,30][20,-30,20,-30],则它在一个周期内就会输出四个数据。这两个通道输出数据的量不同,输出的对应时间也不同,自然就做不到 “排排站对齐好”,于是就会出现严重的窜信号!

\quad 如果我们采取正确的编程思路,设置一个采样率(默认的采样率为 1000ms11000 \text{~ms}^{-1}),才用布尔数组作为序列,这样每个通道都会每隔 103ms10^{-3}\text{~ms} 输出一个数据,这就保证了并行所要求的 “排排站对齐好”,于是窜信号的问题得以解决。