按钮去抖动问题

某次实验需要使用按钮作为输入的信号,每当按钮按下,则执行一次动作。然而,按钮有抖动的问题,具体表现为按下一次,但实际上输出的信号有两个或更多个上升沿(按钮高电平有效)。虽然实验箱已经做了一些去抖工作,但是输出的信号还是会抖动,因此,需要自行设计去抖电路。对于去抖,有一个直接的想法,就是在按钮输出和地之间并联一个电容。由于材料限制,本次实验没有采用这种方法。

我本次实验采用的思路和方法十分简单,只需要用某一频率\(f_{CLK}\)的采样时钟,连续依次采集n个样本\(s_1, s_2, …, s_n\)(可以用n位移位寄存器实现),然后进行简单的判断即可。如果要检测按钮被按下,那么只需检测\(s_1 = s_2 = … = s_{n-1} = 0\) 且 \(s_n = 1\),成立则说明按钮被按下;如果要检测按钮被松开,类似地,只需检测\(s_1 = s_2 = … = s_{n-1} = 1\) 且 \(s_n = 0\)。

下面选择\(f_{CLK}\)与n的取值。注意到,一段完整采样的时间为\(\frac{n – 1}{f_{CLK}}\),如果按照上面的检测方法,对于按钮按下的响应延迟时间为\(\frac{1}{f_{CLK}}\)。

于是,这需要满足,

$$t_{jitter} \lt \frac{n – 1}{f_{CLK}} \lt t_{human}$$

其中,\(t_{jitter}\)为按钮抖动持续时间,\(t_{human}\)为人连续按两次按钮的时间间隔。根据不明来源的数据,\(t_{jitter} \approx 10ms\) 且\(t_{human} \geq 40ms\),所以我们可以取\(\frac{n – 1}{f_{CLK}} = 15ms\)。为了使得延迟不致太大,我们取n=16且\(f_{CLK} = 1kHz\)。这样,能够满足要求,并且延迟只有1ms。

如果实验箱没有1kHz时钟,也可以简单地1000分频1MHz时钟来得到。实际测试表明,这样消抖的效果相当好,不会抖动,也不会漏检测。

此外,按钮去抖问题,实际上是一个滤波的问题。我们使用低采样率来对信号进行采样,以滤去信号中的高频成分。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/9740QrCode