按键抖动示意图

我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开。抖动时间由按键的机械特性所决定,一般为5ms~10ms。所以我们在做按键检测时都要加一个消抖的过程。

按键消抖主要有两种方案:

一是延时重采样;

二是持续采样。

从理论上来说,延时(如10ms)重采样的准确率肯定低于持续采样。

按键消抖的方法

(1)延时重采样

延时重采样的意思是,当第一次检测到键值由'1'变为'0'时,再延时一段时间(如10ms),再次采样,确认是否仍是'0';若是'0'则认为此时键值为'0',否则,重新执行检测过程。

该方案的缺陷:a.如果延时太短,有可能两次采样时都处于抖动时间,因此可能引起误判;

b.如果延时太长,可能检测不出按键变换

(2)持续采样

持续采样的原理是,当检测到按键处于某电平(如'0')时,在之后的N个时钟周期内连续检测此按键的电平,如果一直不变,则读出此按键的电平值(如'0')。

持续采样的优点:a.样本足够多,减少误判的可能性。

b.对于按键按下('1'->'0'),按键释放('0'->'1')都可以检测。

持续采样的缺点:持续检测的时间太长(大于按键按下和释放的时间差),则可能无法检测按键的变换。

在这里我们使用的延时采样的方式,即:当某个键被按下后会触发中断,上一个试验中我们进了按键中断之后就唤醒读取函数,这样由于按键抖动可能会短时间内进好几次按键中断;现在我们加入内个定时器,当按键按下出发了按键中断之后,在按键中断里修改定时器触发时间(比如定时10ms)。

原理说完了,下面开始做测试:

还是一共三个文件,1驱动相关:. keyIrq_drv_timer.c  Makefile

2.测试程序 : key_test_irq.c

实验步骤:

驱动和应用程序都编译出来之后,首先加载驱动:

insmod keyIrq_drv_timer.ko

加载按键驱动

如上图所示,加载完驱动之后,按键节点已经自动创建出来了,

下面开始测试;

输入 ./key_test_irq

按键测试

linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落相关推荐

  1. NanoPi NEO Air使用九:使用Linux内核自带的LED驱动

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  2. Linux内核学习-字符设备驱动学习(二)

    在Linux内核学习-字符设备驱动学习(一)中编写字符设备驱动的一种方法,但是需要手动创建设备节点. 有没有能够自动的创建设备节点的呢? 有!使用class_create()和device_creat ...

  3. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  4. i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    一.概述 Linux 内核编译流程如下: 1.配置 Linux 内核. 2.编译 Linux 内核. 说明:进入 Linux 内核源码,使用 make help 参看相关配置. 二.make menu ...

  5. Linux内核USB总线--设备控制器驱动框架分析

    正文 1.概述 如下图所示,USB控制器可以呈现出两种不同的状态.USB控制器作为Host时,称为USB主机控制器,使用USB主机控制器驱动.USB控制器作为Device时,称为USB设备控制器,使用 ...

  6. 一文了解linux内核,一文了解Linux的系统结构

    什么是 Linux ? 如果你以前从未接触过Linux,可能就不清楚为什么会有这么多不同的Linux发行版.在查看Linux软件包时,你肯定被发行版.LiveCD和GNU之类的术语搞晕过.初次进入Li ...

  7. Linux内核入门-如何获取Linux内核源代码、生成配置内核

    如何获取Linux内核源代码 如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包.除 ...

  8. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  9. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

最新文章

  1. Linux脚本传递参数
  2. 深度学习100例 | 第34天:如何进行数据增强?
  3. Matlab与神经网络入门
  4. mongoDB Liunx下安装及配置
  5. RK3399 Mali-T860占用率
  6. 【数字信号调制】基于matlab GUI PCM编码+QAM调制【含Matlab源码 1095期】
  7. 经典CNN之:VGGNet
  8. Windows 内核驱动开发环境 VS2019+WDK11
  9. 第十八章、ActiveX控件
  10. vb6判断操作系统版本-从win95到win7
  11. BZOJ3332:旧试题
  12. ANSYS预紧力螺栓连接结构(—HyperMesh添加预压力单元)
  13. 喧喧 2.5 发布,新增客户端自动升级,优化界面交互性能
  14. 揭秘霸王龙如何捕食三角龙:先斩首后享用(图)
  15. intellij idea 缓存清理,c盘 系统盘清理
  16. jQuery源码分析之$.grep()函数四问
  17. python驱动:ddt用法
  18. 解读明略数据的“猎鹰重型”——2018“行星计划”
  19. 基于MATLAB的条形码二维码识别系统
  20. 河南职高计算机专业考本科要多少分,职高生多少分可以上本科

热门文章

  1. EdgeBERT:极限压缩bert
  2. python2转python3文件
  3. Python的知识点 plt.plot()函数细节
  4. python 列表生成式、lower()和upper()的使用
  5. 聊一聊Spring中的线程安全性
  6. SECTIONS bss段初始化分析
  7. 细粒度语义分割:ICCV2019论文解析
  8. 客快物流大数据项目(五十二):根据数据库表及字段创建公共模块
  9. 虚拟机为cenots配置网络
  10. python 遍历字符串