说明

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

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

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

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

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

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

计算机按键去抖动的方式,机械按键如何去处理按键抖动的问题相关推荐

  1. 计算机按键去抖动的方式,键盘去抖动原则和方法

    常用的去抖动方法有两种,即硬件方法和软件方法,两种方式的去抖效果相近,硬件去抖动的方法很多,主要用触发器或单稳态电路构成消抖电路.另外,由于软件去抖比较方便,不用增加额外的硬件开销,所以一般场合都采用 ...

  2. Tiny4412裸机程序,按键检测(轮询方式)

    由于前几天出差,博客没有更新,今天看了看Tiny4412的原理图,把按键扫描程序写了一下,用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯 ...

  3. linux按键检测程序,Tiny4412 Linux驱动之按键(使用查询方式) | 技术部落

    前几天在TIny4412开发板上做了LED点灯的Linux驱动,其实挺简单,GPIO驱动,今天再看一下按键的驱动,毕竟按键用的还是比较广泛的,本文使用查询的方式获取按键值,后面会有文章使用中断的方式进 ...

  4. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式

    Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式 actionNone : 回车键,按下后光标到下一行 actionGo : Go, actionSearch : 放大镜 a ...

  5. 计算机专业的会修电脑吗,常被错误理解的三大专业,计算机专业会修电脑,机械工程很是离谱...

    常被错误理解的三大专业,计算机专业会修电脑,机械工程很是离谱 在大学里有一些专业是经常被人误解,在生活中也是闹出了很多笑话,大学生对此也是很无奈,只能是和别人一遍又一遍去解释,你有没有遇到过类似的情况 ...

  6. 【按键你不知道的那些事】简单几句话实现按键按下下、长按、抬起、单击、双击动作

      闲来没事整理一下文档.这一篇我们来讲一讲按键的各种触发事件.   下面我给大家简单介绍一下有哪些按键检测的方式. 方式1 阻塞式检测按键 void KeyScan(void) {if(HAL_GP ...

  7. 7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令?

    7.某计算机的控制器采用微程序控制方式,微指令中的操作控制字段的16位采用混合表示法,其中用11位采用直接表示法,另外5位分为3位和2位的编码表示法,则此格式的微指令最多可表示多少个微指令? 解: - ...

  8. 电子科大计算机组成原理ppt,电子科技大学,计算机组成原理3计算机组成原理-3-5-组合逻辑控制方式.ppt...

    文档介绍: 3.5组合逻辑控制虽谆煤疟胜尉张型佳腐瞪咕涝递咱砒融外尉绕粥宰墒剥俐拉摆斯绵峪掉海电子科技大学,计算机组成原理3计算机组成原理-3-5-组合逻辑控制方式电子科技大学,计算机组成原理3计算机 ...

  9. 计算机音乐创作是什么,2021计算机音乐创作的作曲方式探究论文

    <2021计算机音乐创作的作曲方式探究论文>由会员分享,可在线阅读,更多相关<2021计算机音乐创作的作曲方式探究论文(5页珍藏版)>请在人人文库网上搜索. 1.计算机音乐创作 ...

  10. 计算机系统自动撮合成交的原则,如何进行计算机撮合成交?计算机撮合成交有哪些方式?...

    计算机撮合成交竞价是竞价方式的一种,也是现在的主流竞价方式,是建立在公开喊价基础之上,是根据交易市场上交易双方的提交的交易指令的自动化交易方式.下面给大家分享,如何进行计算机撮合成交?计算机撮合成交有 ...

最新文章

  1. 使用Command模式实现撤销机制 (Code Project 精选翻译)
  2. Xianfeng轻量级Java中间件平台:用户管理
  3. 河海大学物联网计算机考研,河海大学:物联网工程学院2020年硕士研究生建议录取名单出炉...
  4. linux文件读写实例,[Linux文件]使用read函数从文件读取数据的实例
  5. 使用scanf()函数接收带空格的字符串
  6. java 1kb_[代码全屏查看]-java输入输出流及文件操作
  7. 量子计算101:浅谈其需求、前景和现实
  8. .NET Core 工具中的新内容
  9. JAVA如何取得空list成员类型_String 类型的List作为一个成员变量保存,保存成功后取对象时报空指针...
  10. 一个企图用代码偷懒计算测量学闭合导线各项数据的屑是否有错
  11. python自动填表程序_Python的PAMIE IE自动化测试填表提交工具
  12. 网络工程师/技术支持工程师面试题(1)
  13. 组合导航GPS+IMU
  14. 康师傅被“水和面”糊住了眼睛?
  15. 一文看懂推荐系统:排序11:Deep Cross Network(DCN)
  16. 电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道
  17. Scratch软件编程等级考试三级——20200913
  18. 月薪15k的php工程师,平均月薪15k,2019年,前端工程师薪资为什么越来越高?
  19. 计算机基础-工控机、上位机、下位机、stm32、单片机
  20. MediaPlayer+SurfaceView实现视频播放器

热门文章

  1. smart3d4.4.5_在Android 5.0中使用Smart Lock,再也不必在家中解锁手机
  2. Mac使用技巧:M1芯片的电脑恢复模式如何开启
  3. 更改MyEclipse/Eclipse的工作空间名字(workspace)
  4. com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced begin/end text operators.
  5. 古代物流是如何进行的?
  6. day14_html和css
  7. s饥荒服务器物品id,流年饥荒控制台指令大全+物品大全+服务器管理命令大全.docx...
  8. JavaScript全栈开发-工具篇
  9. MongoSocketOpenException: Exception opening socket
  10. ubuntu 刷新频率 如何查看_调整Ubuntu系统的分辨率和屏幕刷新率的方法