×
单片机 > 单片机程序设计 > 详情

STM32延时消除抖动个人理解

发布时间:2020-08-26 发布时间:
|

今天在一段中断服务子程序中发现这么一句话。


delay_ms(10);//消抖  于是很好奇什么是抖动,以及为什么要消除抖动,还有抖动该怎么消除。


1.先讲一下什么是抖动:


通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动。这是我画的丑图,按键一按下时会产生一连串的抖动:



2.为什么要消除抖动:


按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。


3.抖动该怎么消除:


消除抖动有硬件消抖和软件消抖两种方法,其中硬件消抖实用性不强,所以一般采用软件消抖。软件消抖如下代码:


void EXTI9_5_IRQHandler(void)

{

delay_ms(10);//延时消抖

if(KEY0_GET() == 0){

PAout(8) = ~PAout(8);

}

EXTI->PR = 1<<5;

}


然而这样写的代码太过于暴力,在延时的时候一直占用CPU资源,如果在延时的时候,有其他外部中断或者抢占事件,系统完全没有响应的。这里应该用一个独立的定时装置,来完成这个计时工作,而且需要在计时时间到达时再检测一次按键的电平值。但是还没学到那儿,先暂时这么用着。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码