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

23dcbe499a111d5d73b130ec89935f6f.gif

按键抖动示意图

我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开。抖动时间由按键的机械特性所决定,一般为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

bfb47fbd6a488900c2f96ea25a2c4d49.png

加载按键驱动

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

下面开始测试;

输入 ./key_test_irq

54ca34731e66191501050e33bd9c9374.png

按键测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值