Open xiongyihui opened 4 years ago
最近在优化键盘防抖的代码,来说说按键防抖 。 机械按键在被按下或释放的时候容易发生抖动,如果用示波器观察,信号可能是这样的
from https://en.wikipedia.org/wiki/Switch#Contact_bounce
这里假设我们每个1毫秒扫描一次矩阵键盘,第t次扫描,k(t) = 1则检测到按键按下,k(t) = 0则未按下。
k(t) = 1
k(t) = 0
稳定优先防抖,采用均值滤波
通过n次扫描的平均值avg(t)判断按键按下或释放,avg(t) = Σk(t)/n t=(t-n, t],如果要求avg(t) >= 1,则要求最近n次测量都为1。
avg(t)
avg(t) = Σk(t)/n t=(t-n, t]
avg(t) >= 1
响应优先防抖
如果第t次扫描的前面的n次扫描都为相同,第t次发生变化,立即判断,k(t) = 1则按键按下,k(t) = 0测按键释放。
参考: https://github.com/thomasfredericks/Bounce2
最近在优化键盘防抖的代码,来说说按键防抖 。 机械按键在被按下或释放的时候容易发生抖动,如果用示波器观察,信号可能是这样的![image](https://user-images.githubusercontent.com/948283/77246969-6d55eb00-6c67-11ea-9b5e-60cb1b2b1a7f.png)
这里假设我们每个1毫秒扫描一次矩阵键盘,第t次扫描,
k(t) = 1
则检测到按键按下,k(t) = 0
则未按下。两种防抖策略:
稳定优先防抖,采用均值滤波
通过n次扫描的平均值
avg(t)
判断按键按下或释放,avg(t) = Σk(t)/n t=(t-n, t]
,如果要求avg(t) >= 1
,则要求最近n次测量都为1。响应优先防抖
如果第t次扫描的前面的n次扫描都为相同,第t次发生变化,立即判断,k(t) = 1则按键按下,k(t) = 0测按键释放。
参考: https://github.com/thomasfredericks/Bounce2