基于SR锁存器进行按键消抖的PCB电路设计与验证

前言

理想按键与实际按键对比

抖动如何产生?因为机械固有的物理特性,开关触点在瞬间接触的时候会有力学的回弹,使开关在“通”“断”之间反复横跳,造成 2-10 毫秒内信号不稳定。

在大部分情况下,这种信号抖动持续是没有影响的。但是当一个开关连接到一个足够“快”的电子设备上时,它可以检测到多次抖动并做出响应,那么就会引起问题。

在此,去除抖动的必要性就体现出来了。

原理

两种常见开关的抖动

下图是开关按下时,电平变化的示意图。

有时,电压在电源和地之间跃变;有时,则是在初始值和某个中间电压之间跳动。取决于不同开关的特性,这种跃变的行为也往往具有不确定性。

在拨动 SPST-NO 开关情况下,NO 端可能发生抖动。(图片来源:Max Maxfield)
在拨动 SPDT 开关情况下,NO 和 NC 端子上都可能出现抖动。(图片来源:Max Maxfield)

使用 SR 锁存器进行消抖

使用基于与非门的 SR 锁存器对 SPDT 开关进行消抖十分有效。下图是消抖电路的示意图。

SR 锁存器的“0”状态(图片来源:Max Maxfield)
SR 锁存器的“1”状态(图片来源:Max Maxfield)

以上图的“1”状态的情况为例,我们分析一下工作过程。

注意到,与非门构成的锁存器是低电平输入有效的。当开关未按下时,常闭触点 NO 接地,对于锁存器来说,此时 S 端为低电平,故 Q 被设为高电平。

当我们按下开关,触片就从 NO 断开而接触 NC。在接触 NC 的瞬间,有 S = 1(上拉), R = 0,故 Q 被设为低电平,完成电平转换。

但是前文提到,由于开关的弹性,在触片第一次接触 NC 后,还会弹起微小的距离,使得此时 NC 与触片断开。注意,由于弹起的距离很小,触片不足以碰到 NO,因此这时开关侧的 NO、NC 都处于“悬空状态”,对于锁存器来说,由于上拉电阻的存在,SR=11。

而根据锁存器的特性,当 S、R 同时为高电平时,输出端将保持原来的状态不变。

因此,在触片弹开而使得 NO、NC 悬空的一小段时间内,Q 端的输出并不受到影响,继续保持低电平,抖动就此消除。

方才分析的是触片反弹一次的情况,一般来说,触片在第一次接触 NC 后往往会反弹数次(振幅不断减小,直至于0),但通过刚才的分析,我们知道这无关紧要。在数次“悬空(实际是上拉)-拉低-悬空-拉低”的过程中,SR 锁存器不断“保持-置0-保持-置0”,Q 端的输出不会改变。

要想让 Q 端回到高电平,唯一的可能性就是松手,让触点接触 NO 端,把 S 端拉低。(嘿嘿,触片弹回 NO 的过程中也会反复横跳数次的。)

设计

Schematic

SN74LS279 是一个集成了4个与非门类型锁存器的 IC,低电平输入有效,所以首先都把它们接电阻上拉。

SN74LS279 的电路设计

在设计非自锁开关的电路时,通过改变常闭触点的连接,决定是 R 下拉到地还是 S 下拉到地,就可以获得按键未按下时,输出端不同的默认电平。当然,在焊接的时候也要注意这个常闭触点的方向,否则就白画了。

非自锁开关及排针的电路设计

Layout

画的不怎么样,勉勉强强。

top
bottom

设计文件下载

设计文件可在立创开源平台获取:SR锁存器按键消抖电路板

验证

下单打板焊接……

焊接图

放荡不羁的焊接&接线

波形图

示波器调到 Single Mode,Trigger Level 拉到 2.5V,边沿上升沿/下降沿,上电,随意戳一下板子上的按键……

然后就有了下面两张截图:

上升沿
下降沿

可以看到,边沿还是很平滑很漂亮的,彻底不抖了。

改进

emm,唯一的小遗憾就是,输出电平是5V,可能不太适合直接插到 MCU 的 IO 上面,考虑用个电阻分压?或者是后续换为 CMOS 的器件,降低电平。

另外,画板的时候,没看清楚,选的直插电阻是 0.125W 的小小小电阻,我们常用的电阻对于电路板来说都大了些。

参考

[1] Ultimate Guide to Switch Debounce (Part 2)

这篇文章里边还详细介绍了“按键消抖”的前世今生,以及其它消抖方式,非常推荐一读。