关于硬件消抖——开关并联电容的那点小事
关于硬件消抖——开关并电容的那点小事
一年前做过的小脚丫的消抖实验和不消抖实验的区别,开关如果不消抖,产生的毛刺和电平变化确实给开关带来了不良影响,比如按键不灵,需要按暂停或者切换的时候要反复按多次才有随机概率实现需要的功能。所以对消抖的概念和重要性比较深刻。
昨天学习STM32的按键消抖知识,教程提到一点:
本实验板连接的按键带硬件消抖功能,见图 ,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。
突发奇想的想了解一下硬件消抖,毕竟本辣鸡就是学硬件出身的,所以开始研究了一下上述原理图,发现,这个电容的消抖效果从理论上来讲只对松开按键时才起明显作用,而在按下按键时的效果可能就非常差了,那为什么教程里提到这这个电容起到的消抖作用足以让电路不需要做软件消抖呢?(亲测确实可以不做软件消抖而且按键功能良好)
下面还是先从理论分析开始吧~
原理图分析
假设按键没有按下时,电容C62和电阻R64串联在3V3的电源和地之间。按下按键的瞬间,我们知道电容没有电位瞬变的能力,所以开始放电,但是此时电容放电的回路中和R64没有丝毫关系,和R33更是没有半毛钱的关系,此时能放电只是经过了按键开关而已,我们姑且认为按键开关的电阻在 1-10Ω之间,那么时间常数的计算t=RC=1×10^(-7)s,这里特别说明104的电容值指的是100nF。
按键松开时,电容开始充电,充电时3V3的电源经过电阻4.7kΩ进行充电,则时间常数t=RC=0.47ms,这是理论分析得到的大概值。
【声明】如果有大佬觉得分析有误能指出的话,小编会感到非常的感激
实测结果
为了对分析进行验证,听从实验室伙伴的意见,用示波器对我的想法进行验证。得到触发波形如下:图一
图二
分析上图,按键按下时输出为高电平,如图一所示,此时可以看到从低电平到高电平,时间大概时200ns左右,中间伴有少量纹波,图二展示的时按键松开时的波形,从高电平恢复到低电平,时间大概经过了1.7ms左右,从数量级上看,和理论分析的结果相符合,因此可以有充分的理由说明:
上图的硬件消抖原理不能完全起到良好的消抖作用,最起码在按键按下时的消抖效果并不好
但是不知道读者有没有浏览网上的资料,基本认为按键抖动的时间段大概是5-10ms左右,如下图所示:
百度百科上也是这么描述:这里需要说明的一点是,个人认为应该是网上的数据出错了,尽量用自己的实践来证明吧。当然,也许百度百科上的知识是对多少年前的按钮进行测试的,现如今可能按键的机械特性要优化了很多(此处完全是笔者猜测)但也是有可能性的嘛~
通过实际测试可以看到按键的抖动时间已经很短了,但是不排除仍然存在抖动导致按键失灵的情况,具体原因如下:
一年前的小脚丫核心板的按钮,我也特意测试了一下,抖动时间大概是494ns左右(此处不放图,感兴趣的朋友们可以拿手头的按钮测试一下是不是抖动时间其实挺短的),结合小脚丫核心板的时钟频率是24MHz,换算成时间是41ns,此时抖动时间大于采样时间,则抖动对于按键的作用是有足够影响的。为什么?
想一下,在抖动时间494ns中,可能会有高低电平的跳变,如果每隔41ns进行一次采样,则可能是高低电平不断变化,则对于核心板而言,相当于按键出有一股神秘力量对按键不停的按动,那么核心板就会不断做出反应。如果刚好最后电平变换了奇数次,恭喜,按键生效了,但是如果是偶数次呢,那么恭喜你发现问题了,赶紧解决问题吧——软件消抖。
总结结论
- 对于网上普遍认为按键抖动的时间是5-10ms,个人不推翻,对存在质疑,至少对于本人测试的几款按键,不进行电容并联消抖的情况下其抖动时间都是ns级的。
- 对于上述的电容并联消抖的原理,电容放电时的消抖效果即滤波作用不明显,而充电时的滤波作用比较明显,具体改进方法可以在电容旁边串联一个电阻增大时间常数。
- 重中之重,既然消抖效果实测不明显,为什么STM32的教程里还可以直接不采用软件消抖,而且,最终并不影响按键的功能?这是一个人间难题啊?有大佬可以解决这个问题嘛?