2. 基于DAQmx的模拟电压单点采集
单点采集的任务模型
单点采集(Single-Point Acquisition)是 DAQmx 中最基础的模拟输入模式:每次读取只返回一个采样值,适合低速监测、按钮触发读取或作为连续采集的调试起点。与连续采集不同,它不需要配置采样时钟和缓冲区,DAQmx 在内部按需启动一次转换并立即返回结果。
本例使用 NI-DAQmx API 完成以下链路:创建任务 → 创建模拟输入电压通道 → 配置定时为「单点按需」→ 启动任务 → 读取一个双精度浮点值 → 显示到波形图表 → 停止并清除任务。关键参数包括物理通道名(如 Dev1/ai0)、输入端子配置(RSE/NRSE/差分)、最小/最大值(决定量程与分辨率)以及单位(伏特)。
前面板与程序框图设计
前面板放置三个控件:一个物理通道字符串输入(默认 Dev1/ai0)、一个波形图表用于显示电压历史、一个停止按钮控制 While 循环。程序框图按数据流顺序连接 DAQmx VI,并在 While 循环内每次迭代读取一个采样值。
核心 DAQmx VI 调用顺序如下:
DAQmx Create Virtual Channel.vi:选择「Analog Input → Voltage」,设置物理通道、最小/最大值、单位(Volts)、端子配置(RSE)。DAQmx Timing.vi:采样模式选择「1 Sample (On Demand)」,不设置采样率。DAQmx Start Task.vi:启动任务,使通道进入可读状态。- While 循环内调用
DAQmx Read.vi:多态选择「Analog → Single Channel → Single Sample → DBL」,输出一个双精度浮点值。 - 将读取值送入波形图表,同时用
Wait (ms)控制循环速率(如 100 ms)。 - 循环结束后依次调用
DAQmx Stop Task.vi和DAQmx Clear Task.vi释放资源。
单点采集不需要配置采样时钟和缓冲区,DAQmx Read 每次调用触发一次 ADC 转换。若循环速率过快,读取值可能来不及更新,建议在循环内加入 50–200 ms 的等待。
关键代码实现
以下为程序框图中 DAQmx 调用的核心逻辑(以 G 代码对应的文本描述形式给出,便于对照实现):
// 1. 创建任务
taskHandle = DAQmxCreateTask("", &error);
// 2. 创建模拟输入电压通道
DAQmxCreateAIVoltageChan(taskHandle,
"Dev1/ai0", // 物理通道
"", // 通道名(空则用物理通道名)
DAQmx_Val_RSE, // 端子配置:参考单端
0.0, // 最小电压
5.0, // 最大电压
DAQmx_Val_Volts, // 单位
NULL); // 自定义缩放
// 3. 配置定时为单点按需
DAQmxCfgSampClkTiming(taskHandle, "", 0.0,
DAQmx_Val_OnDemand, 1, DAQmx_Val_FiniteSamps);
// 4. 启动任务
DAQmxStartTask(taskHandle);
// 5. While 循环内读取单点
while (!stop) {
double voltage = 0.0;
DAQmxReadAnalogF64(taskHandle,
1, // 读取 1 个采样
10.0, // 超时 10 秒
DAQmx_Val_GroupByChannel,
&voltage, 1, NULL, NULL);
// 将 voltage 送入波形图表
Wait_ms(100);
}
// 6. 停止并清除
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
运行验证与结果判读
运行 VI 后,波形图表应显示一条随输入电压变化的曲线。用万用表测量信号源输出,与前面板显示值对比,偏差应在量程精度范围内。若读数为 0 或恒定不变,依次检查:物理通道名是否正确、端子配置是否与接线方式匹配(RSE 对应单端接地)、信号源是否实际输出电压、DAQmx 是否返回错误码。
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 读数为 0 V | 通道名错误或未接线 | 用 MAX 测试面板确认通道可读 |
| 读数饱和在 5 V | 量程设置过小或信号超限 | 检查最小/最大值是否覆盖实际信号范围 |
| 读数跳动大 | 端子配置不匹配或未接地 | 确认 RSE/NRSE/差分与接线一致 |
| DAQmx 报错 −200077 | 定时模式不支持 | 确认使用 On Demand 而非采样时钟 |
单点采集的精度受量程设置影响:量程越小,ADC 分辨率越高。例如 16 位 ADC 在 0–5 V 量程下分辨率约为 5/65536 ≈ 0.076 mV,而在 −10~+10 V 量程下约为 0.305 mV。应根据实际信号范围选择最小可用量程。