2. 按键抖动现象:机械抖动与电气抖动、抖动时间参数、抖动对系统的影响
好,咱们接着聊按键抖动。说实话,这玩意儿是嵌入式开发里最基础、也最容易踩坑的问题之一。我刚开始做按摩仪项目那会儿,就吃过这个亏——按键按下去,灯闪了好几下,电机也抽风似的转一下停一下。后来一查,全是抖动惹的祸。
2.1 什么是按键抖动?
按键抖动,说白了就是按键在按下或释放的瞬间,信号不是干净利落地从高变低(或从低变高),而是来回跳变好几次。你想想看,机械触点嘛,两个金属片碰撞的时候,不可能一下子就贴得死死的,总得弹几下才能稳定下来。
这个现象在示波器上看特别明显。我习惯把探头夹在按键两端,然后轻轻按下去——波形就像弹簧一样,上下震荡好几次才稳定。嗯,这就是抖动。
2.2 机械抖动 vs 电气抖动
这里要分清楚两种抖动:
| 类型 | 成因 | 特点 |
|---|---|---|
| 机械抖动 | 金属触点弹性碰撞、反弹 | 持续时间长(5~20ms),幅度大 |
| 电气抖动 | 接触电阻变化、寄生电容充放电 | 持续时间短(<1ms),幅度小 |
我在项目中遇到过一种情况:按键本身质量不错,机械抖动很小,但PCB走线太长,寄生电容导致信号上升沿变缓,结果MCU误判了好几次。这就是典型的电气抖动问题。说白了,两种抖动都可能让你翻车。
2.3 抖动时间参数
每个按键的抖动时间都不一样。我整理了一下常见的数据:
- 普通轻触按键:抖动时间约 5~15ms
- 薄膜按键:抖动时间约 10~20ms
- 机械开关(如微动开关):抖动时间约 1~5ms
- 导电橡胶按键:抖动时间约 10~30ms
这里有个坑——同一个按键,按下和释放的抖动时间可能不一样。我测过一款按摩仪用的硅胶按键,按下抖动12ms,释放抖动却长达25ms。如果你只按按下时的参数做防抖,释放时就会出问题。
经验之谈:设计防抖延时的时候,建议取抖动时间的1.5~2倍。比如按键抖动15ms,防抖延时设30ms比较稳妥。别问我怎么知道的——吃过亏。
2.4 抖动对系统的影响
抖动不处理,后果有多严重?我给你列几个真实案例:
- 误触发:按一次按键,系统检测到3~5次按下。按摩仪的模式切换直接跳飞了。
- 功能紊乱:比如长按加速功能,因为抖动导致信号断断续续,加速效果时有时无。
- 功耗异常:抖动产生的脉冲会让MCU频繁唤醒,电池续航直接打对折。
- 用户体验极差:用户按一下,机器反应两下,谁受得了?
警告:千万别以为用中断检测按键就万事大吉。抖动产生的多个边沿会反复触发中断,轻则程序跑飞,重则堆栈溢出。我曾经在一个项目里用外部中断检测按键,结果抖动导致中断嵌套,系统直接死机——那叫一个惨。
2.5 怎么判断抖动是否严重?
我个人的习惯是:拿示波器抓波形,看从按下到稳定的时间。如果抖动时间超过20ms,或者抖动次数超过5次,那就得认真处理了。
另外,别忘了考虑老化因素。新按键抖动小,用了一两年后,触点氧化、弹性变差,抖动时间可能翻倍。所以设计时留点余量,没坏处。
小技巧:批量生产时,抽检10%的按键,用示波器记录抖动时间。如果发现某个批次抖动异常大,赶紧找供应商换货。别问我为什么知道——有一批货差点让整个项目延期。
2.6 小结
按键抖动这事儿,说大不大,说小不小。但你要是忽略了,它就能让你加班到怀疑人生。机械抖动和电气抖动要分清楚,抖动时间参数要测准,对系统的影响要评估到位。下一节咱们就聊怎么用软件和硬件手段把抖动干掉——嗯,那才是真正的实战内容。