按键输入检测软件抗干扰方法
按键是我们最常见到的人机交互部件之一,在我们工作生活中随处可见,比如我们家里常用的各种家用电器,工作中用的各类仪器仪表,以及各类IT产品,许多都是通过按键来进行操作的。因此,按键输入的处理,也是我们在嵌入式系统设计的时候,经常要遇到的。虽然按键输入的处理看起来非常简单,理想化的按键就相当于一个开关,我们只需检测开关是否导通,就能判断按键是否按下。但是,实际应用中如果这么处理,就会出现各种问题,比如明明只按了一下,处理器却检测到按了好几下;或者有时明明没有按下,处理器却检测到按下了。这是刚接触嵌入式系统的工程师们经常遇到的问题。
这是什么原因呢?我们来做个实验。如图1所示,我们将一个按键的B端接地,A端接电阻R上拉到电源,然后检测A端的电平状态。

图1
那么当按键状态为按下时,我们可以在A端检测到低电平;当按键状态为放开时,我们可以在A端检测到高电平。在理想情况下,我们只需要检测A端电平的上升沿和下降沿,就可以检测到按键的按下和放开瞬间,并进行处理。但是实际情况又是如何呢?我们将A端接到逻辑分析仪,并用8Mbps的采样率进行采样,我们会发现实际情况并不是那么理想,如图2所示,我们会看到,有的时候在按键放开的瞬间,A端电平并不是立即变为高电平,而是高低电平来回变化了几次。

图2
原来,在实际中,按键的按下和放开,并不是理想状态的开和关。在按下和放开的瞬间,有时候会产生抖动,导致状态在瞬间来回变化几次。而在按键状态保持的过程中,也有可能会受到脉冲干扰,导致按键状态瞬间的变化。
因此,在我们为客户定制产品方案中,智研电子开发团队的工程师们都需要加入抗干扰处理,用于消除按键抖动和脉冲干扰。常用的按键抗干扰方法可分为硬件处理和软件处理两种。硬件处理方法需要增加额外的抗干扰电路,我们这里专门来讨论一下软件处理的方法。
常用的按键软件处理方法是:通过设置IO的边沿中断来检测按键的状态变化,在进入中断后,再延时一段时间后,再次对按键状态进行检测,根据检测状态来判断按键是否有效,以此来达到过滤抖动和脉冲干扰的目的。但是这种方法也有弊端,就是如果这个延时的时间过短,则不能很好的滤除干扰,如果这个时间过长,则会造成中断处理的时间过长,造成软件进程的阻塞,甚至造成其它中断信号的丢失。
在这里智研电子软件开发工程师为大家介绍一种新的按键软件抗干扰的方法,既不需要增加额外的硬件成本,又避免了常用软件按键处理的缺点,能够以更小的处理器开销,更灵活有效地滤除按键干扰。该方法实现步骤描述如下:
步骤1:硬件电路如图1所示,我们每隔一个固定的时间间隔T对按键A端进行一次电平检测,并用变量key的最低3bit来记录最近3次的检测结果。bit0为当前次的检测结果,0表示低电平,1表示高电平。每次检测先将变量key左移一位,并将除最低3bit之外的全部bit全部置零,然后用bit0记录下当前检测结果。
步骤2:对检测结果进行处理。根据检测结果key的值可分为一下8种情况:
1key = 0b000时,为检测到按键按下保持状态,可进行累加计时,并根据计时时间进行按键长按判断和处理。
2key = 0b001时,为检测到按键状态由按下变放开瞬间,此时不作处理,以防止干扰。
3key = 0b010时,为检测到按键状态由按下变放开后短时间内(小于T)又变成按下,认为该次按键状态变化无效,作干扰处理,赋值key = 0b000。
4key = 0b011时,为检测到按键状态由按下变放开后,经过时间T后,再次检测到按键放开状态,说明该次按键状态变化有效,并进行按键放开处理。
5key = 0b100时,为检测到按键状态由放开变按下后,经过时间T后,再次检测到按键按下状态,说明该次按键状态变化有效,并进行按键按下处理。
6key = 0b101时,为检测到按键状态由放开变按下后短时间内(小于T)又变成放开,认为该次按键状态变化无效,作干扰处理,赋值key = 0b111。
7key = 0b110时,为检测到按键状态由放开变按下瞬间,此时不作处理,以防止干扰。
8key = 0b111时,为检测到按键放开保持状态,不作处理。
备注:检测时间间隔T值的选取规则为大于按键抖动时间和脉冲干扰时间,小于要求的按键响应时间的二分之一。
由于该方法只需每隔时间T进行一次检测和判断,因此比常用的中断延时检测可以节省中断处理时间的开销,并且因为检测间隔时间T可以灵活设置,并在检测结果处理里将可能遇到的情况都作了处理,因此能更好地滤除干。在我们长期的工程实践应用中,取得了很好的效果。
<<广州智研电子科技有限公司>>电子电路产品开发/结构方案设计/快速生产打样
声明:转载或者引用本文内容请注明来源及原作者;版权归www.gzzydesign.com网站所有;