# NI DAQmx
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 系统简介
PXIe 具体写为 PXI Express,是一种基于 PCI Express 的仪器互连架构,广泛应用于自动化测试和测量系统中。
PXIe 系统通常由一个控制器控制,该控制器可以是嵌入式的,也可以是连接电脑的。我们实验室就是连接电脑的。连接电脑与 PXIe 机箱的主要方法是使用专用的高速接口连接线缆,一些可以用某些接口的线连接,一些也可以用以太网连接实现远程控制。
插入到 PXIe 机箱中的各种 PXIe 板卡则可以连接各种仪器来实现各种功能。例如:
- 数据采集板卡:用于从外部传感器、设备或信号源中获取数据,并将数据传输到计算机进行分析和处理。这些板卡通常具有多个输入通道和高分辨率的模数转换器(ADC)。
- 信号生成板卡:用于生成各种类型的信号,如连续波形、脉冲信号、数字信号等,以用于测试、仿真或通信应用。这些板卡通常具有数字信号处理器(DSP)或波形发生器。
- 控制板卡:用于控制外部设备、执行器或系统的操作,例如运动控制、温度控制、电源管理等。这些板卡通常具有数字输入 / 输出(DIO)通道和各种接口。
......
不同的 PXIe 板卡可以根据需要组合在一起,以构建符合特定应用要求的完整测试和测量系统。
# NI PXIe-6536 板卡介绍
NI PXIe-6536 板卡的官方介绍:32 通道、25 MHz、100 MB/s PXI 数字 I/O 模块。PXIe‑6536 可以通过 PXI Express 总线连续地传输数据。它是连接和测试图像传感器或显示面板的理想解决方案。该模块也非常适用于其他常用数字应用程序,如:模式 I/O、变化检测、协议仿真或其他自定义数字接口。它具有可选择的电压电平以及数字线路每通道方向控制功能。
在我们的实验室,就是利用 NI PXIe-6536 板卡的 32 路数字输出通道(Digital I/O)连接到不同的仪器实现控制(例如各种激光对应的声光晶体的光电开关中实现光电控制)。
# python 编程时域控制激光
# 编程思路
- 设置一个周期的总时间 ,和采样率 。
- 写入时间信号序列,写入规则为:正数代表高电平的持续时间,负数代表低电平的持续时间。例:总时间设为 100ms,输入序列为:20, -30, 30, -20,对应的就是依次循环产生 20ms 的高电平、30ms 的低电平、30ms 的高电平、20ms 的低电平。(若输入序列的总时长低于设定的总时间,则后续时间会被默认补齐为低电平;若输入序列的总时长高于设定的总时间,则会报错)
- 根据每毫秒的采样点来生成采样点序列,将时间信号序列转化为布尔序列,例如在总时间 采样率 的条件下,时间序列 将转化为 的布尔序列。注意布尔序列的个数与采样率是匹配的。
- 将布尔序列 “写入” 相应的通道,则可以完成对于仪器开关的时域控制。
# 一个编程误区:
一开始的编程思路并不是采取如上所述的。最初高低电平的持续时间的是打算采用 “延迟” 实现的,即若总时间设置为 ,时间序列为 ,则在 时刻输出高电平,再将程序延迟 后再输出低电平,之后再延迟 后再输出高电平。
这样的编程思路在只需要用到单个通道时是没太大问题的(除了波形有十分十分微小的抖动之外)。但当我们需要控制多个光开关时,即需要设置多个通道的时间序列时,就会出现一个很严重的问题:窜扰,或通俗称为窜信号。
出现该情况的原因我的想法如下。NI PXIe-6536 板卡的 32 个通道是并行的。并行传输总线是多个数据同步传输的,这就要做到三点:
- 传输数据出去之前,需要让数据排排站对齐好;
- 传输数据过程中,也需要让数据排排站对齐好;
- 到了目的地后,还需要让数据排排站对齐好。
若采取最初的编程思路,就会在 “排排站对齐好” 这一步出错,因为各个通道在一个周期内输出的数据数是不同步的。例如若 通道的时间序列为 ,则它的一个周期内只会输出两个数据(在 时刻输出代表高电平的数据 ,在 时刻输出代表低电平的数据 );但 通道的时间序列可能为 ,则它在一个周期内就会输出四个数据。这两个通道输出数据的量不同,输出的对应时间也不同,自然就做不到 “排排站对齐好”,于是就会出现严重的窜信号!
如果我们采取正确的编程思路,设置一个采样率(默认的采样率为 ),才用布尔数组作为序列,这样每个通道都会每隔 输出一个数据,这就保证了并行所要求的 “排排站对齐好”,于是窜信号的问题得以解决。