4. 数字I/O读写与LED控制
数字I/O任务的核心结构
DAQmx数字I/O与模拟采集的最大区别在于:数字线是按端口(Port)或按线(Line)组织的离散状态量,没有采样率、量程、耦合方式这些模拟参数。一个数字任务只需要明确三件事:通道方向(输入还是输出)、通道名(如 Dev1/port0/line0)、读写时机(软件定时轮询即可)。
本案例使用一块带数字I/O的DAQ设备(如USB-6008/6009或PCIe-6321),把 port0/line0 配置为数字输出驱动外部LED,把 port0/line1 配置为数字输入读取按钮或开关状态。两者可以放在同一个任务中,也可以分成两个独立任务——本案例采用两个独立任务,因为输入和输出方向不同,分开配置更清晰,也便于单独启停。
关键VI与函数选板位置
在LabVIEW中,数字I/O的配置与读写通过以下函数完成(位于测量I/O → NI-DAQmx选板):
DAQmx Create Virtual Channel.vi— 创建数字输入或数字输出通道,需选择Digital Input或Digital Output实例。DAQmx Start Task.vi— 启动任务(数字I/O可省略,但显式启动更规范)。DAQmx Write.vi— 向数字输出通道写入布尔值(1/0),选择Digital Bool 1Line 1Point实例。DAQmx Read.vi— 从数字输入通道读取布尔值,选择Digital Bool 1Line 1Point实例。DAQmx Stop Task.vi与DAQmx Clear Task.vi— 停止并释放任务资源。
程序框图实现要点
整个程序放在一个While循环中,循环周期设为100 ms(用Wait (ms)实现)。每次迭代执行以下动作:
- 读取前面板输出控制按钮的布尔值。
- 调用
DAQmx Write将该布尔值写入Dev1/port0/line0。 - 调用
DAQmx Read从Dev1/port0/line1读取一个布尔值。 - 将读取到的布尔值赋给前面板LED指示灯。
- 检查停止按钮状态,若为真则退出循环。
循环结束后,依次调用DAQmx Stop Task和DAQmx Clear Task释放两个任务。
为什么用两个独立任务? 数字输入和数字输出方向相反,DAQmx不允许在同一个任务中混合输入和输出方向。如果使用同一端口的不同线,也必须分别创建输入任务和输出任务。这是初学者最容易踩的坑。
接线与外部电路
以USB-6008为例,数字端口为P0.0~P0.7(对应Dev1/port0/line0~line7)。接线方式如下:
| 信号 | DAQ端子 | 外部电路 | 电平逻辑 |
|---|---|---|---|
| 数字输出 DO | P0.0 | P0.0 → 330Ω电阻 → LED阳极 → LED阴极 → GND | 输出高电平(3.3V/5V)点亮LED |
| 数字输入 DI | P0.1 | P0.1 → 10kΩ上拉至+5V;P0.1 → 开关 → GND | 开关断开=高电平,闭合=低电平 |
| 公共地 | GND | 与外部电路GND共地 | — |
注意:USB-6008的数字输出为开漏结构,输出高电平时实际由外部上拉电阻决定电压。若直接驱动LED,建议使用低电平点亮方式(输出低电平时LED亮),或外加三极管/MOSFET驱动。本案例为教学演示,采用高电平点亮方式并配合限流电阻,实际电流约5~8 mA,在USB-6008单线驱动能力范围内。
前面板控件与显示配置
- 输出控制按钮:布尔→按钮,机械动作设为“单击时转换”,默认值为假。
- LED指示灯:布尔→圆形LED,默认颜色绿色,用于显示DI读取结果。
- 停止按钮:布尔→停止按钮,机械动作设为“单击时转换”。
- 循环延时:前面板可放置数值控件,默认100 ms,便于调节轮询速度。
验证与排障
运行程序后,按以下步骤验证功能:
- 点击前面板输出控制按钮,观察外部LED是否随之亮灭。若外部LED不亮,用万用表测量P0.0对GND电压:按下按钮时应为高电平(约3.3V或5V),松开为低电平。
- 拨动外部开关,观察前面板LED指示灯是否同步变化。若不同步,检查DI通道名是否正确、上拉电阻是否接好、共地是否可靠。
- 若DAQmx Read报错“通道未配置为输入”,说明输入任务创建时误选了输出方向,需重新配置。
- 若程序无法退出循环,检查停止按钮是否已正确连线到循环条件端子。
核心记忆点:数字I/O任务 = 方向(输入/输出)+ 通道名 + 读写函数。输入和输出必须分任务创建,不能混在同一任务中。软件定时轮询即可满足大多数低速数字I/O场景。