硬件设计引发的死机:电源纹波过大导致MCU复位
做NB-IoT终端开发,电源问题是我见过最隐蔽的坑。你代码写得再好,逻辑再严谨,电源一抖,全白搭。
先说说电源纹波。纹波说白了就是直流电源上叠加的交流成分。理想情况下,3.3V就是3.3V,干干净净。但实际电路里,开关电源的开关动作、负载的瞬态变化,都会在电源线上产生毛刺。
我记得有一次,一个同事调试了三天,设备总是随机复位。用示波器一看,3.3V的纹波峰峰值到了200mV。MCU的数据手册上写的是纹波不超过50mV。嗯,这已经超标4倍了。
为什么会这样?NB-IoT模块在发射时,瞬间电流能飙到300mA甚至更高。如果电源的响应速度跟不上,电压就会掉下去。MCU检测到电压低于复位阈值,啪,复位了。
关键指标:NB-IoT终端设计中,电源纹波通常要求控制在50mV以内。对于BC95、BC26等常用模块,建议纹波不超过30mV。
我个人的习惯是,在模块的电源入口处加一个100μF的电解电容,再并联一个0.1μF的陶瓷电容。电解电容负责低频纹波,陶瓷电容负责高频噪声。这个组合基本能解决90%的纹波问题。
如果还不行,那就得考虑加LC滤波了。一个10μH的电感加上两个电容,效果立竿见影。
避坑指南:我曾经在一个项目中,为了省成本,把滤波电容从100μF降到了47μF。结果设备在低温环境下频繁复位。后来查资料才发现,电解电容在低温下容量会下降30%以上。从那以后,我选电容都会留足余量。
电源上电时序不满足要求
这个坑,新手最容易踩。NB-IoT终端里通常有多个芯片:MCU、NB-IoT模块、传感器、存储芯片。每个芯片都有自己的上电时序要求。
举个例子,BC95模块要求VDD先上电,然后至少等10ms,再给模块的复位引脚一个低脉冲。如果VDD和复位同时上电,模块可能无法正常启动。
我见过最离谱的情况是,一个工程师把MCU和模块的电源直接连在一起,用一个MOS管控制。结果每次上电,MCU先跑起来了,模块还没准备好。MCU发AT指令,模块没反应,程序就卡死了。
为什么会这样?因为MCU的启动时间通常是几毫秒,而NB-IoT模块的启动时间可能需要几百毫秒。时序不对,通信就建立不起来。
解决这个问题,我建议用电源管理芯片。比如TPS63020这类带使能引脚的DCDC,可以控制不同电源轨的上电顺序。或者用RC延时电路,简单粗暴但有效。
注意:不要用软件延时来解决上电时序问题。MCU在启动初期,IO口的状态是不确定的。我曾经见过一个项目,用MCU的GPIO去控制模块的复位,结果MCU启动时GPIO输出了一个高电平脉冲,直接把模块复位了。
上电时序的检查方法也很简单。用示波器的两个通道,同时抓取两个电源轨的波形。看它们上升沿的时间差,是否符合数据手册的要求。
| 芯片型号 | VDD上电到复位释放时间 | VDD上升时间要求 |
|---|---|---|
| BC95 | ≥10ms | ≤1ms |
| BC26 | ≥20ms | ≤2ms |
| M5310 | ≥15ms | ≤1.5ms |
你想想看,如果VDD上升时间太慢,比如花了5ms才升到3.3V,那模块内部的电路可能处于不确定状态。复位信号来了也没用。
地线回路设计不当
地线问题,是硬件设计里最容易被忽视的。很多人觉得地线不就是个参考点嘛,随便连一下就行。但实际不是这样。
地线回路设计不当,会导致两个问题:一是地弹,二是共模干扰。
地弹是什么?当NB-IoT模块发射时,瞬间电流很大。如果地线阻抗高,这个电流在地线上会产生压降。地线的电位就不再是0V了。MCU和模块的地电位不一致,通信就会出错。
我记得有一个项目,设备在实验室跑得好好的,一到现场就死机。后来发现,现场的地线很长,而且和电机的地线共用了。电机一启动,地线上就有几十毫伏的噪声。NB-IoT模块的灵敏度本来就低,这下直接掉线了。
解决地线问题,我总结了三条原则:
- 单点接地:所有电路的地线,最终汇聚到一个点。避免形成地环路。
- 加粗地线:PCB上地线尽量宽,至少1mm以上。大电流回路的地线,建议用铺铜方式。
- 分离地平面:模拟地和数字地要分开,最后通过磁珠或0欧电阻连接。
实战经验:我做过一个NB-IoT水表项目,电池供电,对功耗要求极高。为了省电,地线只用了0.3mm宽。结果设备在发送数据时,地线上产生了0.5V的压降。MCU的ADC采样值全乱了。后来把地线加宽到2mm,问题解决。
还有一个容易被忽略的点:模块的接地焊盘。很多NB-IoT模块底部有一个大面积的接地焊盘,这个焊盘必须良好接地。我见过有人只焊了四周的引脚,中间的接地焊盘悬空。结果模块发热严重,工作不稳定。
嗯,这里要注意。模块的接地焊盘不仅是电气连接,还承担散热功能。如果接地不良,模块温度升高,发射功率会下降,甚至导致死机。
避坑指南:我曾经在PCB布局时,把模块的地线通过一个细长的走线连接到主地。结果模块发射时,地线上产生了明显的压降。后来改成大面积铺铜,直接覆盖模块下方的地平面,问题消失。
总结一下硬件设计引发的死机问题,其实就三个字:电源、时序、地线。这三个方面做好了,80%的硬件死机问题都能避免。
我个人习惯是,每次画完PCB,先检查电源路径的宽度是否足够,再检查上电时序是否满足,最后用地线检查工具跑一遍。虽然麻烦点,但能省去后面调试的无数烦恼。
你想想看,如果因为一个电容没焊好,或者地线没铺好,导致设备在现场频繁死机,那运维成本可就高了去了。所以,硬件设计阶段多花点心思,比后期打补丁强得多。