您的位置 首页 制造

机械按键怎么去处理按键颤动的问题

机械按键如何去处理按键抖动的问题-一般的机械式按键的构造是两个金属片和一个复位弹簧,按键按下时,两个金属片便被压在了一起。

阐明

咱们在嵌入式开发进程中,按键是必不可少的东西。可是怎么使用好按键,这也是一个十分难的工作。关于一个嵌入式工程师来说,想要做好用户体会,按键的呼应是十分的检测人的。这儿涉及到按键的颤动相关常识,关于怎么去抖问题,将会在这篇文章中进行深度剖析。

一般的机械式按键的结构是两个金属片和一个复位绷簧,按键按下时,两个金属片便被压在了一同。

机械按键怎么去处理按键颤动的问题

如图所示,当按键向下按的时分,由于触摸的面积和时刻问题,并不是当即就会构成一个安稳的信号,大约的波形如下图所示:

机械按键怎么去处理按键颤动的问题

跟着颤动,那么咱们或许会发生多个按键中止,那么咱们该怎么去处理这个问题呢?

02

硬件消抖

要处理颤动问题,咱们能够经过对硬件进行必定的修正,规划一个RC积分电路进行消抖。

机械按键怎么去处理按键颤动的问题

由于RC积分电路有延时处理的问题,所以咱们能够使用这个特性进行颤动消除。可是,这个办法在实践产品中真的安稳吗?从原理上来说,咱们经过调理RC电路推迟,电阻越大,推迟越大。一起也过滤掉了前期或许会引起中止的杂波,可是电路规划有必要十分合理,一起也需求软件的合作。所以硬件消抖只能从必定程度上处理问题,并不能根本上处理问题。

03

软件去抖

中止消抖

单片机中,一般消抖处理能够经过这样的方法进行,第一次发生中止后,然后在中止函数中去读取按键的电平,假如判定确实是按键按下时的电平,然后再过10ms再读一次电平。假如两次读到的值都是相同的,那么以为该电平是按键按下的。

机械按键怎么去处理按键颤动的问题

这种方法,有一个问题,便是关于实时性要求比较高的场合,明显这便是一个问题了。中止处理函数中,做了过多的工作,这明显是一个不合理的规划计划。

设置状况标志消抖

在上面的想象中,假如用到了rtos,那么咱们能够在中止中读引脚电平,而且设置一个状况标志位,将线程资源释放给其他资源,等10ms后再次切换到这个线程,去读取按键的状况,假如状况共同,则以为按键按下,这明显是比第一种直接在中止中去读状况好了许多。

可是,也会存在随机的或许性,比方咱们在移动设备的进程中,并不是人为操作的按键,可是刚好两次10ms都读到了触发中止的电平,这是极有或许的,尽管或许性比较小,可是关于产品罢了,咱们不能抱有侥幸心理,要处理这个问题。

多点采样计划消抖

所以,咱们提出了屡次取点采样的计划进行规划。

咱们知道,机械按键触发了中止,不管是否人为操作,咱们都需求去读取电平状况,咱们用一个字节表明电平的状况,每一位代表一个采样点,则咱们能够笼统出如下的模型:

假如咱们每10ms采样一次,将这个采样的信号用一个字节的数据表明。

那么咱们每次采样都往这个字节的最低位弥补,直到这个数据变满足0或许全1停止。

下面是一个误触形成的颤动进程的笼统模型

机械按键怎么去处理按键颤动的问题

当进行采样的时分,黑色表明读到的是触发时的电平,白色表明未触发是的电平,当咱们读到接连的都是白色的时分,则咱们以为这次的采样是无效的。同理咱们来看一下正常按下时的操作。

机械按键怎么去处理按键颤动的问题

也是一个同理的进程,当咱们读到0xFF是,则以为电平安稳有用,此刻表按下状况。

从程序上表明如下:

//key_ptr 按键GPIO的引脚指针

//step_time采样距离

//TImeout 超时时刻

KeyStatus key_val_get(volaTIle unsigned long *key_ptr, tu32 step_TIme, tu32 TImeout)

{

static tu8 keybuf = 0xff;

KeyStatus keysta = key_Unstable;

rt_tick_t start_time = rt_tick_get,cost_time;

while(1)

{

cost_time = rt_tick_get – start_time;

if(cost_time 《 timeout)

{

rt_thread_delay(step_time);

keybuf = (( keybuf 《《 1 ) | (*key_ptr)) ;//每次读取按键值

if ( 0x00 == keybuf )

{

keysta = key_Low;

break;

}

else if ( 0xff == keybuf)

{

keysta = key_High;

break;

}

else

{

//电平不安稳,持续采样

}

}

else

{

break; //采样超时

}

}

return keysta; //回来采样值

}

上述便是一个完好的滤波采样进程。

这种方法是在rt-thread体系上规划的,其优点是在检测按键的时分,咱们并没有空等,而是采样rt_thread_delay将资源让出去,屡次采样之后,判定是按键按下仍是松开。由于假如是人为操作,往往这个进程是200ms左右。

04总结

本文详细描述了一个机械按键怎么去处理按键颤动的问题,在今后规划程序的时分,也需求充沛的考虑产品的安稳性与合理性,必定需求进步用户体会。嵌入式工程师不仅仅是去处理一个又一个技术上的难题,也要有产品认识以及从用户视点去思考问题,这样做出的东西体会才会更好。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/94497.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部