按键弹跳好多次,电阻电容和施密特门为何只输出一次?
本文为教学接线与设计预期,尚无实物测量记录;使用 NUCLEO-F030R8。
问题
手指只按了一次,金属触点却可能接通、弹开、再接通。若把每次高低变化都算一次,计数就乱了。这条不是用程序等二十毫秒,而是在输入脚前放电阻、电容和一颗有双门槛的施密特反相器。
物件动作
小熊拿一只装水的小杯,从右边走到门前;门卫握着高门槛牌和低门槛牌。按钮刚松开又按下时,杯里的水位来不及升过高门槛,门卫不换旗。回到电路,杯是电容,进水管是上拉电阻,两块门槛是反相器的不同翻转电压。
真实连接
开发板三点三伏经四万七千欧电阻接到节点 A;一微法电容从 A 接地。按钮先经过一千欧电阻,再把 A 接地。A 接施密特门第二脚,第四脚输出接开发板 D2 输入;第五脚供电、第三脚接地,C2 紧贴芯片电源脚。
原因与结果
先看松开的一刻:电容经四万七千欧慢慢充电;再看按下:它经一千欧较快放电。两个方向的特征时间大约是四十七毫秒和一毫秒,不是保证的消抖时长。反相器看到输入跨过对应门槛才翻转,而且会把高低颠倒:按下后输出变高,按钮真正松开后输出才变低。
验证
断电先核对两只电容的接线和共地。上电后,计划用示波器同时看按钮触点、节点 A 和输出 Y:触点可能短跳,A 应缓慢变化,Y 预期只切换一次。要分别测试按下与松开;本片没有真实示波器记录,画的只是预期波形。
边界
如果弹跳持续时间长到让 A 重新跨过门槛,仍可能多跳;电阻、电容公差和漏电也会改时序。若要立即响应松开,几十毫秒的回升也可能太慢。应按实物波形重新选值,不能把这一组元件当成所有按钮的万能处方。
这题只解决触点回弹,不是把软件等待换一个名字
轻触开关按下时,两片金属不一定一次贴稳。它们可能经历接触、弹开、再接触,单片机输入脚看见的便可能是短促的高低高低。TI 的 SN74LVC1G14 Rev AA 第7.1节明确把机械弹跳列作按钮误触发的来源,并在图7-1示出 RC 配合施密特触发器的消抖应用。本例重点看外部硬件如何先整理电压,再让 MCU 读入;与‘每隔若干毫秒采样并等待稳定’的软件方法不同。两种方法可以配合,但不能把它们的时序结论混写。
小熊拿一只小杯从按钮边走向门卫。进水细管对应 R1,杯子对应 C1;小熊反复轻敲按钮时,杯子的水位不会立即跟着每次弹跳上下到底。门卫手拿高门槛牌和低门槛牌:只有水位越过当前应该看的那块牌,它才换一次旗。回到电路,水位是节点 A 的电压,两块牌是 U1 不同方向的输入阈值,旗是 U1 的输出 Y。比喻只说明因果,不是声称芯片里真有水杯或两只机械开关。
先锁定器件和每根线的端点
本例用 NUCLEO-F030R8、TI SN74LVC1G14DBVR(DBV 五脚封装)、Panasonic EVQ11D07K 常开按钮、R1=47 kΩ、R2=1 kΩ、C1=1 µF 无极性陶瓷电容、C2=100 nF 去耦。ST UM1724 Rev17 表11确认板卡 CN6 有 3V3/GND,CN9 D2 连 PA10。TI 数据手册图4-1与表4-1确认 DBV 顶视 pin2=A、pin4=Y、pin5=VCC、pin3=GND、pin1=NC;Panasonic 产品页确认 S1 是顶按 SPST 轻触开关。不要把另一封装的俯视或底视引脚图套进来。S1 若带四个焊盘,焊前用通断档识别实际常开的一组,不靠左右位置猜触点。
CN6 3V3 同时接 R1 一端、U1 pin5 与 C2 一端;R1 另一端是节点 A。A 同时接 U1 pin2、C1 一端和 R2 一端;R2 另一端接 S1 的一个有效触点,S1 的另一个触点接 CN6 GND。C1 另一端、C2 另一端、U1 pin3 也接同一 GND。U1 pin4 Y 只接 CN9 D2/PA10 输入;pin1 NC 不作为信号脚。C2 应贴近 U1 的供电脚。断电逐端核对,尤其不可把 3V3 直接短到 GND,或把输出 Y 误接回 A。U1 以板卡 3.3 V 供电,不在本演示中接市电或外部五伏。
一个方向快、一个方向慢,双阈值才有用
S1 松开时,A 经 R1 向 3.3 V 充电;在理想 RC 模型里,特征时间 τ松=R1×C1=47000 Ω×0.000001 F=0.047 s,即 47 ms。按下时,电容经 R2 放电,R1 仍在上拉;理想等效电阻 R1∥R2≈979 Ω,所以 τ按≈0.000979 s。稳态按下时,A 理想电压为 3.3×1000/(47000+1000)≈0.0688 V。这些都是给定阻容的可复算设计值,不是我们量过按钮后得到的弹跳长度,也不能把一个时间常数直接当作保证的消抖延迟。电容公差、开关接触、输入漏电与供电误差会改变实物曲线。
施密特门的输入由低向高变化时看上门槛,反方向则看下门槛;中间存在回差。TI Rev AA 的电气表按供电电压列出 VT+、VT- 的范围,它们不是固定在‘1.65 V’的一对精确常数。触点短弹开若不足以让 A 从低位冲过上门槛,Y 不翻回;真正松开后 A 逐渐升高,越过上门槛后 Y 才翻转。U1 是反相器,A 低时 Y 高,A 高时 Y 低。所以按下稳定后 PA10 应读高,松开稳定后读低;若程序假定‘按下为低’,事件方向就写反了。
仪器怎样区分想象的效果与真实结果
先用板卡规定方式供电,示波器地夹只接 CN6 GND。计划用 CH1 看 S1 按钮触点,CH2 看 A,CH3 看 Y;分别多次按下与松开,保存带时间刻度的原始波形。预期 CH1 可能短跳、CH2 相对平滑、CH3 每次完整按压只切换一次;但这只是设计预期,本项目没有拿到任何示波器原始记录,不能写‘实测无抖动’。若 CH3 仍多跳,应比较每次 CH2 是否真的反复跨过相应门槛,检查电源去耦、接线和按钮的实际弹跳,再改阻容或增加软件确认。只看 MCU 最后计数为一,不足以单独证明硬件滤波波形正确。
哪些情形下不能照抄
47 ms 只是放手时的理想特征时间,应用若要求很快识别松开,必须核算实际阈值穿越时间。极长或多次的机械弹跳仍可能让 A 跨过另一门槛,硬件消抖不是绝对保证。换一个按钮、长线、不同电源或不同封装,寄生电容和干扰都可能改变结果;必须重新查相应厂家数据并用仪器观察。附带 C11 程序只复算 R、C、等效电阻和理想稳态电压,不会控制真实 GPIO,不能烧进板卡就声称完成消抖。
逐线接线清单
- NUCLEO CN6 3V3 → R1 47 kΩ 一端、U1 pin5 VCC、C2 100 nF 一端:本例只用板上 3.3 V,不从信号脚取电
- R1 另一端 → A 节点、C1 1 µF 一端、U1 pin2 A、R2 1 kΩ 一端:R1 向 C1 充电;A 是唯一输入节点
- R2 另一端 → S1 常开触点一端:R2 限制按钮闭合瞬间的 C1 放电电流
- S1 另一端、C1 另一端、C2 另一端、U1 pin3 GND → NUCLEO CN6 GND:按钮按下才经 R2 放电;全部低压共地
- U1 pin4 Y → NUCLEO CN9 D2/PA10:反相器输出到 MCU 输入;按下使 Y 变高,不把 A/Y 短接
- U1 pin1 NC → 不作为信号端使用:DBV 顶视 pin1 为无内部连接,不能误认作输入
- 示波器 CH1/CH2/CH3 与地夹(可选) → S1 触点、A、Y 与 CN6 GND:仅是计划中的核验位置;没有实测读数
计算与实施边界
- TI SN74LVC1G14 datasheet Rev AA 图4-1/表4-1:DBV pin1 NC、pin2 A、pin3 GND、pin4 Y、pin5 VCC;允许 1.65–5.5 V 供电;高输入输出低、低输入输出高
- TI datasheet §7.2 图7-1以 RC 与施密特反相器示范按钮消抖;双门槛可抑制慢变输入附近的往返翻转,但本例 R/C 值为教学选型,不冒充 TI 保证时间
- ST UM1724 Rev17 表11:NUCLEO-F030R8 CN6 3V3/GND、CN9 D2=PA10;板卡 I/O 为 3.3 V 域
- Panasonic EVQ11D07K 产品页:顶按常开 SPST。使用实际器件前断电用通断档确认同组端子,不根据四个外观焊盘猜测
- 可复算特征时间:松开 R1*C1=47000 Ω×0.000001 F=0.047 s;按下 (R1||R2)*C1≈0.000979 s;它们是时间常数,不是实际触点弹跳时长或逻辑翻转时刻
- C2=100 nF 按 TI datasheet §7.3 靠近 U1 VCC/GND;C1 用适合 3.3 V 的无极性陶瓷电容,不能盲接有极性电解电容
- 图中三条波形为设计预期,未提供示波器原始记录;若弹跳持续越过阈值、板上干扰大或放电异常,仍需实测和重新设计
这些参数和数值是本例选择或可复算计算;实际测量前,应先检查电源极性、公共地、元件额定值、仪器探头连接。
完整可运行的核心算例与验收
以下 C11 程序可在电脑上用 C 编译器单独编译运行,用来复算状态或数值;它不是已配置 GPIO、ADC、定时器和驱动的开发板固件。移植到实板时应按前述接线配置外设、检查读取错误,并另做实测。
#include<stdio.h>/* 复算教学 RC 时间常数;不是可烧录的 MCU 程序或实测数据。 */intmain(void){constdoubler_charge=47000.0,r_discharge=1000.0,c_input=1e-6;constdoubletau_release=r_charge*c_input;constdoubletau_press=(r_charge*r_discharge/(r_charge+r_discharge))*c_input;constdoublev_low=3.3*r_discharge/(r_charge+r_discharge);printf("release tau=%.3f s, press tau=%.6f s, press steady A=%.3f V\n",tau_release,tau_press,v_low);returntau_release>0.046&&tau_release<0.048&&tau_press<0.001?0:1;}验收时同时记录输入、关键节点电压或波形、程序输出;若发现传感器通信失败、输入超出允许范围或波形明显异常,应停止并排查。
官方资料
- https://www.ti.com/lit/ds/symlink/sn74lvc1g14.pdf
- https://www.st.com/resource/en/user_manual/um1724-.pdf
- https://na.industrial.panasonic.com/products/switches-encoders-interface-devices/lineup/switches/series/79310/model/79394