今天在一段中断服务子程序中发现这么一句话。
delay_ms(10);//消抖
于是很好奇什么是抖动,以及为什么要消除抖动,还有抖动该怎么消除。
1.先讲一下什么是抖动:
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动。这是我画的丑图,按键一按下时会产生一连串的抖动:
2.为什么要消除抖动:
按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。
3.抖动该怎么消除:
消除抖动有硬件消抖和软件消抖两种方法,其中硬件消抖实用性不强,所以一般采用软件消抖。软件消抖如下代码: