数字线上的去抖动滤波器(Debouncing Filter)
|什么是去抖动?
在数字信号中,尤其是由机械开关或其他不稳定信号源产生的信号,会出现快速的抖动(bounce),即信号在高低电平之间迅速来回波动。这样的信号如果直接作为计数器或触发输入,会引起误触发或错误计数。NI在大多数字IO功能中,提供了去抖动滤波器,它是一个数字滤波机制,可以根据设定的时间窗口来忽略掉那些“太短暂”的脉冲。
这种机制可解决的典型的问题,如:信号中的瞬态脉冲干扰导致了计数测量和位置测量的不准确。
|基本原理
对于NI具备数字IO的采集设备,如PXIe-6368,我们可以在每个数字线上比如PFI、RTSI、PXI_STAR 或 PXIe_DSTAR<A,B> 信号 上启用一个可编程去抖动滤波器(Debouncing Filter)。当滤波器被启用后,设备会在滤波时钟的每个上升沿对输入信号进行采样。该时钟一般是由板载晶振生成。
以下是一个输入信号从低电平到高电平的跳变示例(高到低的跳变工作原理类似):
假设某数字输入端在长时间保持低电平后变为高电平,但在低变高电平的过程中产生了多次毛刺(抖动)。

只有当滤波器时钟连续 N 次采样都检测到高电平时,此跳变/触发才会被“确认”,并传输到采集模块的后续电路进行处理。
这个 N 的值 取决于当前所设置的滤波器级别,如下表所示:
表 1:滤波器设置说明(不同系列请以使用手册为准)
滤波器设置 | 滤波时钟频率 | N(通过信号所需的滤波器时钟数) | 可通过滤波的最短脉宽 | 确保不能通过滤波器的最长脉宽 |
---|---|---|---|---|
None(无) | — | — | — | — |
90 ns(短) | 100 MHz | 9 | 90 ns | 80 ns |
5.12 µs(中) | 100 MHz | 512 | 5.12 µs | 5.11 µs |
2.56 ms(长) | 100 kHz | 256 | 2.56 ms | 2.55 ms |
自定义 | 用户设定 | N | N / 时基 | (N – 1) / 时基 |
每个输入端口的滤波器设置可以独立配置。设备上电时,所有滤波器默认禁用。
下图展示了一个输入信号从低跳变到高,且使用自定义滤波器(N = 5)时的滤波行为示意图。

启用滤波器可能会在输入信号上引入抖动(jitter),其最大值为滤波时钟周期的一个周期。
|编程实现
当数字IO被设置为通过去抖动滤波后,只有在滤波器时钟的两个连续上升沿中间时段,信号的改变保持在一个稳定的状态,这个改变才会被传输。 例如,如果滤波器参数设置为500ns, 所有超过500ns宽的脉冲信号可以通过滤波器,而脉冲宽度小于250ns的信号将被阻隔。
在 LabVIEW 中访问这些属性的方法如下:
1. 在程序框图中放置一个 DAQmx 通道属性节点(DAQmx Channel Property Node)
位置:Functions >> All Functions >> NI Measurements >> DAQmx – Data Acquisition
2. 展开该属性节点,使其包含 4 个属性
设置第一个属性:
选择:Digital Input >> Digital Filter >> Enable
→ 给该属性连接一个 False,表示默认关闭所有线路的滤波器(这样你可以仅对特定线路启用滤波)
3. 设置第二个属性:
选择:Digital Input >> Digital Filter >> Minimum Pulse Width
→ 在这里设置滤波器的最小脉宽(单位为秒)
4. 设置第三个属性:
选择:Active Channels
→ 指定你希望启用滤波器的 具体通道名称(例如 Dev1/port0/line0)
5. 设置第四个属性:
选择:Digital Input >> Digital Filter >> Enable
此时将对你在“Active Channels”中选中的线路启用滤波器。

C语言:
DAQmxSetDIDigFltrEnable(TaskHandle taskHandle, const char channel[], bool32 *data);
DAQmxSetDIDigFltrMinPulseWidth(TaskHandle taskHandle, const char channel[], float64 data);
Python:
Task = nidaqmx.Task() # Create a Task reference
config = Task.di_channels.add_di_chan('Dev1/port0/line0:7') # Add a DI channel
config.di_dig_fltr_enable = True # Enable the digital filter
config.di_dig_fltr_min_pulse_width = minimum_pw_value # Set the min pulse width value
Refernence: