4、电源管理单元(PMU):内核电压调节器,POR/BOR原理,上电时序与掉电检测,我的一个电池供电项目教训
各位好,咱们今天聊聊PMU——电源管理单元。说实话,这玩意儿在低功耗设计里,地位就跟人的心脏差不多。心脏不好,全身都垮。PMU搞砸了,整个系统就别想稳定工作。
我见过太多工程师,花大把精力调MCU代码、优化外设功耗,结果电源部分随便糊弄一下。嗯,最后板子跑起来各种诡异复位、莫名其妙死机。查来查去,根源就在PMU上。今天我把这块掰开揉碎了讲,顺便分享一个我当年做电池项目踩过的坑。
4.1 内核电压调节器:不只是降压那么简单
现在的MCU,尤其是TI的MSP430或者CC系列,内部都集成了电压调节器。它的任务很简单:把外部输入的电压(比如3.3V)转成内核需要的低压(比如1.2V或1.8V)。
但这里有个关键点——调节器的工作模式直接影响功耗。
我习惯把调节器模式分成三类:
- Active模式:全速运行,输出能力强,但静态电流大。适合CPU跑高频的时候。
- Low-Power模式:输出能力弱,但静态电流极低。适合休眠或者低频运行。
- Bypass模式:直接让外部电压通过,内部调节器关断。这个模式用得少,但某些超低功耗场景下很管用。
举个例子,MSP430FR系列的内部LDO,在Active模式下静态电流大概几十微安,切到Low-Power模式能降到几百纳安。你想想看,如果系统大部分时间在休眠,却忘了切换调节器模式,那这几十微安的差距,直接让电池寿命缩水一大截。
关键点:调节器模式切换不是自动的,需要软件干预。很多工程师只关注CPU的睡眠模式,忽略了LDO的状态,结果功耗没降下来。
我在项目中遇到过一件事:一个同事用CC2640做BLE设备,休眠电流测出来总是偏高。查了三天,最后发现是内部DCDC调节器在休眠时没切到Bypass模式。切完之后,电流从12μA降到了1.2μA。你看,一个寄存器位的事,差别就是十倍。
4.2 POR与BOR原理:别让复位变成玄学
POR(上电复位)和BOR(欠压复位)是PMU里两个最容易被忽视的功能。说白了,它们就是系统的「守门员」。
POR:芯片上电时,电压从0慢慢爬升。在电压没稳定之前,芯片内部逻辑状态是混乱的。POR的作用就是让芯片保持复位状态,直到电压稳定到正常工作阈值以上,才释放复位,让程序开始跑。
BOR:系统运行过程中,电池电压可能突然跌落(比如电机启动、射频发射瞬间)。如果电压跌到内核无法正常工作的水平,芯片就会跑飞。BOR检测到电压低于阈值,立刻触发复位,防止数据损坏或逻辑混乱。
这里有个容易踩的坑——BOR阈值的选择。
| 参数 | 典型值 | 说明 |
|---|---|---|
| POR上升阈值 | 1.8V - 2.0V | 上电时电压超过此值,POR释放 |
| BOR下降阈值 | 1.6V - 1.8V | 电压低于此值,触发BOR复位 |
| BOR迟滞 | 50mV - 100mV | 防止电压在阈值附近抖动导致频繁复位 |
我曾经犯过一个错误:在一个电池供电的传感器项目里,我选了BOR阈值1.7V,但电池放电到3.0V时,因为负载突变,电压瞬间跌到1.65V。BOR触发了,系统复位。但复位瞬间负载电流更大,电压进一步跌到1.5V,系统陷入「复位-启动-复位」的死循环。最后电池彻底放空,设备变砖。
教训:BOR阈值不能只看静态电压,要考虑动态跌落。建议留出至少200mV的余量。另外,BOR的滤波时间也很重要——太短容易误触发,太长可能来不及保护。
4.3 上电时序与掉电检测:顺序错了,芯片会「死」
多电压域的系统,上电时序是个大问题。比如一个系统同时有3.3V的I/O域和1.2V的内核域。如果内核先上电、I/O后上电,I/O引脚上的电压可能通过ESD二极管倒灌到内核电源上,导致内核电压异常,甚至烧坏芯片。
TI的文档里明确要求:内核电压必须先于I/O电压建立。掉电时则相反,I/O电压先掉,内核后掉。
我个人的习惯做法:
- 用单独的电源芯片,通过EN引脚控制上电顺序
- 或者用RC延时电路,确保内核先稳定
- 实在不行,用MCU的GPIO控制负载开关
掉电检测也很关键。当系统检测到电源即将断开时,需要做两件事:
- 保存关键数据到非易失存储器
- 将外设置于安全状态(比如关闭电机、关闭射频发射)
怎么做?利用MCU的掉电检测中断(BOR中断或PDR中断)。在中断服务程序里,快速完成保存操作。注意,这个时间窗口通常只有几毫秒到几十毫秒,代码要精简,不能做复杂运算。
// 掉电中断服务例程示例(伪代码)
void BOR_IRQHandler(void) {
// 1. 关闭所有外设
disable_all_peripherals();
// 2. 保存关键变量到FRAM或EEPROM
save_critical_data_to_nvm();
// 3. 设置标志位,下次上电时恢复
set_power_loss_flag();
// 4. 等待复位
while(1);
}
小技巧:如果使用FRAM(铁电存储器),写入速度极快,几乎不需要等待。如果是Flash或EEPROM,写入时间可能长达几毫秒,要确保掉电检测的电容储能足够支撑写入完成。
4.4 我的一个电池供电项目教训
最后讲个真实案例,算是给各位提个醒。
几年前我做了一个便携式环境监测仪,用两节AA电池供电,主控是MSP430FR5994。项目初期一切顺利,功耗测试也达标——休眠电流2μA,工作电流3mA。但到了现场测试,问题来了:设备经常在夜间莫名其妙死机,第二天早上发现数据丢失。
排查过程很痛苦。我先怀疑是软件bug,查了三天没结果。然后怀疑是射频干扰,加屏蔽也没用。最后用示波器抓了电池电压波形,才发现问题所在。
原来,设备夜间会启动一个传感器加热除湿的流程,加热电流高达200mA。两节AA电池内阻大,瞬间电压从3.0V跌到2.2V。MSP430的BOR阈值是1.8V,按理说不会触发复位。但问题出在——加热结束后,电池电压回升,但回升过程中有一个短暂的过冲,导致内部LDO输出不稳定,内核电压出现毛刺,芯片逻辑跑飞了。
解决方案其实很简单:
- 在加热启动前,先让MCU进入Active模式,提高LDO输出能力
- 加热结束后,延迟50ms再切回Low-Power模式
- 在电池端并联一个100μF的钽电容,吸收瞬态跌落
改完之后,问题再没出现过。
总结一下我的教训:
- 不要只看平均功耗,要看瞬态功耗
- 电池内阻和电容ESR会严重影响电压稳定性
- PMU的每个参数(LDO模式、BOR阈值、上电时序)都要结合实际负载特性来设计
- 现场环境(温度、电池老化)会让问题放大,实验室测不出来不代表没问题
好了,PMU这块就聊到这儿。说白了,电源管理不是「接上电就行」那么简单。你想想看,一个系统里最脆弱的就是电源,它一旦出问题,所有努力都白费。下一章咱们聊聊时钟系统——又一个容易被忽视但至关重要的模块。