机械按键如何去处理按键抖动的问题

说明

我们在嵌入式开发过程中,按键是必不可少的东西。但是如何使用好按键,这也是一个非常难的事情。对于一个嵌入式工程师来说,想要做好用户体验,按键的响应是非常的考验人的。这里涉及到按键的抖动相关知识,关于如何去抖问题,将会在这篇文章中进行深度分析。

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

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

如图所示,当按键向下按的时候,由于接触的面积和时间问题,并不是立即就会形成一个稳定的信号,大概的波形如下图所示:

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

随着抖动,那么我们可能会产生多个按键中断,那么我们该如何去处理这个问题呢?

02

硬件消抖

要解决抖动问题,我们可以通过对硬件进行一定的修改,设计一个RC积分     电路   进行消抖。

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

由于RC积分电路有延时处理的问题,所以我们可以利用这个特性进行抖动消除。但是,这个方法在实际产品中真的稳定吗?从原理上来说,我们通过调节RC电路延迟,     电阻   越大,延迟越大。同时也过滤掉了前期可能会引起中断的杂波,但是电路设计必须非常合理,同时也需要软件的配合。所以硬件消抖只能从一定程度上解决问题,并不能根本上解决问题。

03

软件去抖

中断消抖

    单片机   中,一般消抖处理可以通过这样的方式进行,第一次产生中断后,然后在中断函数中去读取按键的电平,如果判决确实是按键按下时的电平,然后再过10ms再读一次电平。如果两次读到的值都是一样的,那么认为该电平是按键按下的。

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

这种方式,有一个问题,就是对于实时性要求比较高的场合,显然这就是一个问题了。中断处理函数中,做了过多的事情,这显然是一个不合理的设计方案。

设置状态标志消抖

在上面的设想中,如果用到了     rtos   ,那么我们可以在中断中读引脚电平,并且设置一个状态标志位,将线程资源释放给其他资源,等10ms后再次切换到这个线程,去读取按键的状态,如果状态一致,则认为按键按下,这显然是比第一种直接在中断中去读状态好了许多。

但是,也会存在随机的可能性,比如我们在移动设备的过程中,并不是人为操作的按键,但是恰好两次10ms都读到了触发中断的电平,这是极有可能的,虽然可能性比较小,但是对于产品而已,我们不能抱有侥幸心理,要解决这个问题。

多点采样方案消抖

于是,我们提出了多次取点采样的方案进行设计。

我们知道,机械按键触发了中断,无论是否人为操作,我们都需要去读取电平状态,我们用一个字节表示电平的状态,每一位代表一个采样点,则我们可以抽象出如下的模型:

如果我们每10ms采样一次,将这个采样的信号用一个字节的数据表示。

那么我们每次采样都往这个字节的最低位补充,直到这个数据变成全0或者全1为止。

下面是一个误触造成的抖动过程的抽象模型

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

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

 机械按键如何去处理按键抖动的问题_设计制作_RF/无线

也是一个同理的过程,当我们读到0xFF是,则认为电平稳定有效,此时表按下状态。

从程序上表示如下:

//key_ptr 按键G     PI   O的引脚指针

//s     te   p_     ti   me采样间隔

//  TI meout 超时时间

KeyStatus key_val_get(vola  TI le unsigned long *key_ptr, tu32 step_  TI me, tu32  TI meout)

{

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总结

本文详细描述了一个机械按键如何去处理按键抖动的问题,在以后设计程序的时候,也需要充分的考虑产品的稳定性与合理性,一定需要提高用户体验。嵌入式工程师不仅仅是去解决一个又一个技术上的难题,也要有产品意识以及从用户角度去思考问题,这样做出的东西体验才会更好。

55
99
0
85

相关资讯

  1. 1、摩托罗拉MC9S12DP256单片机结构、功能特点及在汽车领域的应用分析1730
  2. 2、如何正确的选择PCB电路中的磁珠5005
  3. 3、异步电动机的速度控制_异步电动机的速度控制方法3441
  4. 4、击败几大电池巨头孚能科技如何斩获超百亿欧元电池大单3003
  5. 5、人工智能为“十四五”时期现代化建设提供创新动能4393
  6. 6、实时控制技术满足实时工业通信发展的需求——第2部分3637
  7. 7、国产RV减速器的佼佼者,中大力德8大减速精品推荐4172
  8. 8、选iPhone12Pro还是iPhone12ProMax?1163
  9. 9、CP2400极低功耗LCD控制器的特点及应用范围1912
  10. 10、超声波传感器的原理及应用4346
全部评论(0)
我也有话说
0
收藏
点赞
顶部