飘洋
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 按键只按一次,MCU为何会收到一串跳变?
按键只按一次,MCU为何会收到一串跳变?

机械按键 · GPIO · 硬件软件防抖

按键只按一次,MCU为何会收到一串跳变?

手指完成一次动作,机械触点却可能先接通、弹开、再接通

0.png 

机械触点在闭合或断开的短时间内会反复接触,GPIO看到的是一串高低电平边沿。若中断或扫描程序把每个边沿都当成一次事件,就会出现连击。可靠防抖要先测抖动,再用硬件滞回或软件稳定窗口确认最终状态。

用户只按了一下,菜单却跳过两项;按键中断里明明只写了一次计数,日志却在极短时间里出现多条记录。换了MCU、改了优先级,偶发连击仍然存在。

原因可能不在程序“多执行”,而在输入端确实收到了多个边沿。机械按键不是理想开关,它从松开到稳定闭合要经历一段物理碰撞过程。

一次按压为什么会变成多次边沿

簧片与触点碰撞后会短暂回弹,加上表面状态和机械振动,电气连接可能多次接通与断开。人手感觉不到这段短过程,数字输入却会忠实地把每次跨越阈值记录下来。

2.png 

1  R-S触发器构成的机械开关防抖接口

3.png 

2  一次机械动作对应多次电气边沿

触点老化、氧化、结构公差和按压力度都会改变抖动。样机上一只按键的短波形不能代表整批器件,验证应覆盖多只样本和预期寿命阶段。

按键释放同样会抖。若程序只对按下做延时、松开立即更新状态,用户快速连按时仍可能产生错误事件。按下与释放应各自经过稳定确认。

先在GPIO脚测,不要只看按键两端

上拉、电容、走线、ESD器件和输入门限都会改变MCU脚上的波形。示波器应直接测GPIO附近,并同时记录按键动作前后的电平、边沿数量和抖动持续时间。

· 中断双沿触发:接通和弹开都可能进入中断,计数更容易翻倍。

· 输入悬空或上拉过弱:长线与干扰会把慢边沿进一步变成多次过阈值。

· 采样过快:轮询程序可能把抖动区内的多个状态都当成有效变化。

探头本身也可能影响高阻上拉节点。使用过长地线会引入额外振铃,建议用短地弹簧,并把模拟波形与数字阈值位置一起观察。

硬件防抖要同时处理滤波和阈值

4.png 

3  RC网络与施密特输入组成的防抖路径

RC可以减慢短毛刺,但慢边沿若直接进入没有滞回的数字输入,仍可能在门限附近来回翻转。施密特输入用不同的上、下阈值提供滞回,使慢变化最终只产生一次干净跳变。

R、C取值不能只凭经验。时间常数既要覆盖实测抖动,又不能让响应变得过慢,还要核对输入漏电、门限、ESD钳位和上电默认状态。

MCU输入已经带施密特特性,也要从数据手册确认阈值和滞回范围。不能仅凭引脚叫GPIO就假定它一定有足够滞回。

电容过大还可能让输入长时间停留在门限区,增加动态电流或不确定翻转。采用普通CMOS输入时尤其要谨慎,优先选择明确带滞回的输入或外部施密特器件。

软件防抖要确认稳定状态,而不是盲等

5.png 

4  连续稳定采样后确认一次按键事件

常见做法是检测到变化后进入候选状态,随后按固定周期采样;只有连续若干次结果一致,才更新稳定状态并产生一次事件。释放过程也应独立确认,避免按下正常、松开重复。

1. 先测多只按键在不同按压力度下的抖动范围。

2. 根据响应要求选择采样周期与稳定窗口,不照搬固定毫秒数。

3. 事件只在稳定状态从松开变为按下时产生一次。

4. 若按键接长线或处于强干扰环境,再检查上拉、滤波、屏蔽和ESD路径。

5. 用自动重复按压或长时间日志验证,不以几次手工点击作为结论。

工程判断:按键连击往往是输入端真实出现了多次边沿。可靠防抖不是简单延时,而是先了解触点波形,再用滞回或稳定窗口把一次机械动作还原成一次逻辑事件。

软件窗口还要处理长按、连发和睡眠唤醒。防抖状态机应与业务事件分离,避免唤醒边沿既触发一次动作,又在稳定确认后再次触发。

中断可以用来唤醒或记录候选变化,但不要在每个边沿里直接完成业务计数。让定时采样或状态机确认稳定状态,能把硬件抖动与应用事件隔开。

防抖从一张波形开始

代码里加十几毫秒延时,可能暂时压住问题,也可能掩盖上拉过弱、长线干扰或慢边沿。没有测过GPIO波形,就不知道这个延时覆盖了什么。

先截取一次按下和一次释放的完整波形,再决定硬件与软件如何分工,防抖才从经验变成可验证设计。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论