2. 基于DAQmx的模拟电压单点采集

基于DAQmx的模拟电压单点采集 学习卡片

单点采集的任务模型

单点采集(Single-Point Acquisition)是 DAQmx 中最基础的模拟输入模式:每次读取只返回一个采样值,适合低速监测、按钮触发读取或作为连续采集的调试起点。与连续采集不同,它不需要配置采样时钟和缓冲区,DAQmx 在内部按需启动一次转换并立即返回结果。

本例使用 NI-DAQmx API 完成以下链路:创建任务 → 创建模拟输入电压通道 → 配置定时为「单点按需」→ 启动任务 → 读取一个双精度浮点值 → 显示到波形图表 → 停止并清除任务。关键参数包括物理通道名(如 Dev1/ai0)、输入端子配置(RSE/NRSE/差分)、最小/最大值(决定量程与分辨率)以及单位(伏特)。

模拟信号源 0–5 V 直流 (电位器/传感器) 接线端子 AI0 + / AI GND RSE 参考单端 DAQ 数据采集卡 ADC 16-bit 量程 −10 ~ +10 V 通道 Dev1/ai0 单点按需转换 LabVIEW VI(DAQmx API) DAQmx Create Task DAQmx Create AI Voltage Chan DAQmx Read (1 Sample) 波形图表显示电压值 关键配置参数 物理通道:Dev1/ai0 最小/最大:0 / 5 V 端子配置:RSE 读取结果示例 电压值 ≈ 2.500 V 分辨率 ≈ 0.153 mV

前面板与程序框图设计

前面板放置三个控件:一个物理通道字符串输入(默认 Dev1/ai0)、一个波形图表用于显示电压历史、一个停止按钮控制 While 循环。程序框图按数据流顺序连接 DAQmx VI,并在 While 循环内每次迭代读取一个采样值。

核心 DAQmx VI 调用顺序如下:

  1. DAQmx Create Virtual Channel.vi:选择「Analog Input → Voltage」,设置物理通道、最小/最大值、单位(Volts)、端子配置(RSE)。
  2. DAQmx Timing.vi:采样模式选择「1 Sample (On Demand)」,不设置采样率。
  3. DAQmx Start Task.vi:启动任务,使通道进入可读状态。
  4. While 循环内调用 DAQmx Read.vi:多态选择「Analog → Single Channel → Single Sample → DBL」,输出一个双精度浮点值。
  5. 将读取值送入波形图表,同时用 Wait (ms) 控制循环速率(如 100 ms)。
  6. 循环结束后依次调用 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。应根据实际信号范围选择最小可用量程。