按键消抖

参考博客:

(1)按键消抖之终极解决方案

(2)浅谈按键消抖


上一篇博客解决的是理想状态下对于按键的检测,并没有充分考虑到前沿抖动和后延抖动。如何消抖呢?

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。


1、抖动时间与按键稳定闭合时间

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,大家可以用示波器测试一下。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

2、消抖方法

(1)硬件消抖,在键数较少时可用

A、  下图所示的RS触发器为常用的硬件去抖


分析——图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。

B、采用并联电容法,利用电容的放电延时


这种方法的原理我就看不懂了。

(2)软件消抖(由于此方法用于单片机上这里就不介绍了,具体代码,可参考浅谈按键消抖


-------------------------------------------------FPGA中按键消抖----------------------------------------------------------

按键消抖主要有两种方案:一是延时重采样;二是持续采样。从理论上来说,延时(如10ms)重采样的准确率肯定低于持续采样。

1、延时重采样

延时重采样的意思是,当第一次检测到键值由'1'变为'0'时,再延时一段时间(如10ms),再次采样,确认是否仍是'0';若是'0'则认为此时键值为'0',否则,重新执行检测过程。
这个方案在特权同学的《深入浅出玩转FPGA》的p191有例程;
该方案的缺陷:a、如果延时太短,有可能两次采样时都处于抖动时间,因此可能引起误判;
                            b、如果延时太长,可能检测不出按键变换

2、持续采样

持续采样的原理是,当检测到按键处于某电平(如'0')时,在之后的N个时钟周期内连续检测此按键的电平,如果一直不变,则读出此按键的电平值(如'0')。
持续采样的优点:a、样本足够多,减少误判的可能性。
                                b、对于按键按下('1'->'0'),按键释放('0'->'1')都可以检测。
持续采样的缺点:持续检测的时间太长(大于按键按下和释放的时间差),则可能无法检测按键的变换。

1)单个按键的检测

按键检测的输出有两种方式:
A、电平输出,此时按键功能犹如拨码开关。
B、脉冲输出,此时每按下一次按键,输出一个脉冲信号。


Key_out1的输出与Key_in的变换趋势相同,只是滤除了抖动成分;
Key_out2则是每当按键按下后输出一个高电平脉冲。在大多数的应用中会用到Key_out2所示功能。
代码(可参考 按键消抖之终极解决方案):

  • 输出为电平(用于电平判断事件,类似于开关选择)
  • 输出为脉冲(用于脉冲触发事件)
  • 多个独立按键的扫描(扫描得出键值)功能:a.可以检测出哪些键按下了,甚至哪些键同时按下了。b.键值更新后,输出一个脉冲信号,提升更新完成; c.键值保持到下一次更新完成。




  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值