前言
最近博主在逛哔哩哔哩的时候,偶然看到一个关于按键消抖的讲解,进去一听发现竟然越听越糊涂,后面请教许多大佬才有了一点点理解,现分享出来,如果有不对的地方,大家请多多批评。
为什么要消抖
机械触点在活动时,弹片有可能存在几次连续的抖动,从而产生不必要的脉冲信号,这就可能造成单片机的误判。消抖就是要尽可能的减少这种误判的可能,消抖常见的手段是软件消抖和硬件消抖。
软件消抖
首先是软件代码消抖
通过读取按键值是否发生变化,然后延时一段时间,去跳过机械弹片抖动的时间,然后再次判断,如果确认发生了变化,则证明按键被按下。
软件消抖的好处是不需要多余材料去处理,通过代码延时就可以将抖动时间给跳过,但是延时操作会造成cpu资源的浪费,如果对时间要求比较高的情况下,就不太适用了。
硬件消抖
这是一个最常见的硬件消抖电路,通过一个电阻和一个电容对按键进行消抖,最开始博主只是拿来用,没有去研究过它的工作原理,导致在看别人讲解的时候一团雾水。现在博主就来分析一下这个电路是如何去除按键抖动的。
机械触点的抖动主要在两个部分,按下按键的时候以及松开按键的时候,这里就需要我们分两个部分来考虑。
首先是按下按键的时候
当我们按下按键,由于按键这一条线是没有任何东西的,除了导线自身的电阻能够阻碍电流的变化外,没有其余阻碍,电容自身容值又比较小,存储的电量会很快被释放完毕,这样会使SW1这一点的电平很快被拉低,这个时候,由于按键的抖动,可能会出现按键没有完全闭合的情况,这个时候,在抖动的那一段时间产生的电流又会反过来给电容充电,这种情况下,如果说我们的电阻比较大,电流很小,按键抖动的时间不会很长,这样,就会造成给电容充电不足以将其拉为高电平,所有,SW1处会一直保存低电平的情况。
这就是按下按键的情况,可能有人会说电阻小一点,电容大一点,这样在抖动的时候,给电容充电,也会充电不完全导致不足以拉为高电平,但是这样的话,电容在最开始按下按键的时候,放电时间就长了,可能波形就不陡峭了。所有按键的上拉电阻一般是尽可能的大,电容的话一般选择10nf-100nf左右,这是考虑到不同按键的抖动时间不一致所以电容也可以进行是适当的调整。
其次是松开按键的时候
当我们松开按键,按键这一条线是断开的,这时,电流开始流入电容,对电容进行充电,又是因为上拉电阻足够大,电流很小,充电的时间是比较长的,这个时候,电容充电的时候会和按键松开时抖动的时间进行重合,最终,当电容充电到高电平,按键的抖动时间也基本结束了。