1. 按键消抖概述:机械按键的抖动现象、抖动时间参数、硬件消抖与软件消抖对比
大家好,我是你们的FPGA讲师。今天咱们来聊聊按键消抖——这个看似简单,实则坑不少的话题。
说实话,我刚开始做嵌入式那会儿,觉得按键嘛,不就是个开关?按下就通,松开就断。结果第一次调试时,发现按下一次按键,LED灯闪了好几下。我当时就懵了,还以为代码写错了。后来才知道,这就是机械按键的抖动现象。
1.1 机械按键的抖动现象
机械按键内部其实是个金属弹片。你按下时,弹片不是一下子稳定接触的。它会先接触、弹开、再接触、再弹开……这个过程就叫“抖动”。
为什么会这样?说白了就是物理特性。金属弹片有弹性,碰撞时会产生回弹。你想想看,就像你用手拍桌子,手也会弹一下对吧?按键内部也是这个道理。
抖动的波形长什么样?我画个图给你看:
看到没?按下瞬间,信号在高电平和低电平之间来回跳变。这个抖动过程一般持续5到20毫秒。嗯,这里要注意,不同按键的抖动时间不一样,便宜的按键可能抖得更厉害。
1.2 抖动时间参数
我在项目中遇到过各种按键,总结下来,抖动时间参数大致如下:
| 按键类型 | 抖动时间范围 | 典型值 | 备注 |
|---|---|---|---|
| 普通轻触按键 | 5ms ~ 15ms | 10ms | 最常见,开发板用的就是这种 |
| 机械键盘轴体 | 3ms ~ 10ms | 5ms | 品质较好,抖动时间短 |
| 薄膜按键 | 10ms ~ 30ms | 20ms | 老化后抖动更严重 |
| 微动开关 | 2ms ~ 8ms | 4ms | 工业级,抖动较小 |
我个人习惯,做设计时统一按20ms来消抖。为什么?留点余量嘛。万一客户换了个便宜的按键,你消抖时间设太短,那就等着被投诉吧。
1.3 硬件消抖 vs 软件消抖
既然按键会抖动,那怎么解决?两种思路:硬件消抖和软件消抖。
硬件消抖
硬件消抖,说白了就是用电路把抖动滤掉。最常见的就是RC低通滤波器加施密特触发器。
原理很简单:电容充电需要时间,抖动的高频成分被电容吸收,输出就平滑了。施密特触发器再加个迟滞,防止信号在阈值附近来回跳。
电路长这样:
VCC
│
R
│
按键──┼─────── 输出到FPGA
│
C
│
GND
RC时间常数 τ = R × C。一般取 τ = 10ms 左右。比如 R=10kΩ,C=1μF,τ=10ms。
软件消抖
软件消抖,就是用代码来实现。FPGA里最常用的方法是:检测到按键状态变化后,启动一个计数器,等计数器计到一定时间(比如20ms),再读取按键状态。如果状态稳定,就认为是有效按键。
代码思路大概这样:
// 伪代码示例
always @(posedge clk) begin
if (key_in != key_reg) begin
// 按键状态变化,启动计数器
cnt <= 0;
key_reg <= key_in;
end else if (cnt < DELAY_20MS) begin
// 还没到20ms,继续计数
cnt <= cnt + 1;
end else begin
// 20ms到了,输出稳定后的按键值
key_out <= key_reg;
end
end
说白了,就是等20ms再读。简单粗暴,但有效。
两者对比
| 对比项 | 硬件消抖 | 软件消抖 |
|---|---|---|
| 成本 | 需要额外电阻电容 | 零成本,只需代码 |
| 灵活性 | 固定,改参数要换元件 | 灵活,改代码即可 |
| 可靠性 | 高,不受软件bug影响 | 依赖代码质量 |
| 占用资源 | 占用PCB空间 | 占用FPGA逻辑资源 |
| 适用场景 | 对可靠性要求极高的场合 | 大多数嵌入式项目 |
我个人习惯,能用软件消抖就尽量用软件。为什么?省成本啊!一个电阻一个电容,批量生产时也是钱。而且改参数方便,客户说按键反应慢,改个计数器值就行,不用重新打板。
但有些场合必须用硬件消抖。比如工业控制,按键控制的是安全相关功能。这时候软件万一跑飞了怎么办?硬件消抖更可靠。
好了,这一章就讲到这里。按键消抖看似简单,但细节不少。下一章咱们会深入讲FPGA里怎么用状态机来实现消抖,那才是真正体现工程师水平的地方。