最近做项目,又踩到一个挺典型的坑。
功能本身不复杂:输入信号是一个方波,周期大约 100ms,也就是 10Hz 左右。单片机需要根据这个信号判断当前是否还有供电。按理说这个频率不高,检测起来应该很轻松。
但一上板调试,问题就出来了:上升沿能稳定识别,下降沿却一直检测不到。
一开始我也把怀疑点放在软件上:
- 是不是采样周期设置得不合适?
- 是不是阈值判断写得太死?
- 是不是状态机没处理好?
排查一圈才发现,真正的问题跟代码没关系,而是硬件上那两颗看着很普通的 MLCC。

这个供电信号并不是直接进单片机的,硬件上先经过两个分压电阻,把电压降到 MCU 可采集的范围,程序再根据采样值判断高电平还是低电平。问题就出在分压采样这条支路上,又并联了两颗 MLCC。
MLCC 大家都不陌生,多层陶瓷电容。平时在电源线上加它,主要是滤波、去耦、抗干扰。但这里有个前提:这根线到底只是电源,还是同时也是“信号判断”的来源?如果只是普通供电,加电容问题不大;可一旦要在这个信号上识别上升沿、下降沿,电容就不再单纯是滤波,而是会直接改变波形。
两个分压电阻本身会形成等效电阻,MLCC 并到采样节点后,就组成了一个很典型的 RC电路。高电平来时,电容充电;低电平来时,电容不会瞬间放光,而是通过电阻路径慢慢放电。于是原本干脆的下降沿,被拖成了一个斜坡。站在单片机程序的角度看,采到的已经不是干净方波,而是一段缓慢变化的电压。

上升阶段,电压能较快跨过判断阈值,所以程序能识别到上升沿;但下降阶段,电容仍在放电,采样电压掉得很慢,可能在相当一段时间内都没低到程序定义的低电平阈值。最终现象就是:上升沿有,下降沿没有,或者下降沿检测延迟很大。
这个坑有意思的地方在于,信号周期只有 100ms,并不算快。很多人会下意识觉得,这么慢的信号,加颗小电容应该没事吧?但这件事不能只看信号频率,还要看 RC 时间常数。如果分压电阻阻值偏大,采样点阻抗较高,再配上不小容量的电容,下降沿被拖慢就很正常。尤其软件里还叠加了判断阈值、防抖时间、连续采样确认等逻辑,波形稍微被拉圆一点,最后就可能变成一个很难解释的问题。
所以这类供电检测电路,我觉得有几点必须注意:
- 不要只在信号源端看波形,一定要看单片机采样点的波形,也就是分压之后、进 MCU 之前的那个节点。
- 不要只看“有没有电压变化”,要看它什么时候跨过高低电平阈值,尤其是下降沿有没有按预期掉下来。
- 分压电阻不能只按电压比例算,还要考虑采样节点阻抗,以及后面并的电容会不会形成明显的低通滤波。
- 如果确实需要滤波,电容值要结合响应时间来算,不能凭感觉随手加。供电检测通常需要抗干扰,但也不能把真正的信号变化滤掉。
这次踩坑后最大的感受是:硬件上的“小优化”,有时候会变成软件里的“大疑难”。两个分压电阻,本来只是为了安全采集电压;两颗 MLCC,本来只是想让信号更稳一点。但组合在一起,就把一个周期 100ms 的方波下降沿拖变形了,最后单片机程序检测不到正确的下降沿。
|