某次实验需要使用按钮作为输入的信号,每当按钮按下,则执行一次动作。然而,按钮有抖动的问题,具体表现为按下一次,但实际上输出的信号有两个或更多个上升沿(按钮高电平有效)。虽然实验箱已经做了一些去抖工作,但是输出的信号还是会抖动,因此,需要自行设计去抖电路。对于去抖,有一个直接的想法,就是在按钮输出和地之间并联一个电容。由于材料限制,本次实验没有采用这种方法。
我本次实验采用的思路和方法十分简单,只需要用某一频率\(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时钟来得到。实际测试表明,这样消抖的效果相当好,不会抖动,也不会漏检测。
此外,按钮去抖问题,实际上是一个滤波的问题。我们使用低采样率来对信号进行采样,以滤去信号中的高频成分。
发表评论