4. 电源管理与功耗设计:LDO vs DCDC、PMIC选型、电源树设计、低功耗模式

电源管理,说白了就是给系统“喂饭”。喂多了烧芯片,喂少了系统死机。我做了十几年嵌入式,见过太多因为电源没处理好而返工的案子。这一章,咱们就把电源选型和低功耗设计的关键点捋清楚。

4.1 LDO vs DCDC:怎么选?

很多新手工程师上来就问:“LDO和DCDC哪个好?”我的回答是:没有好坏,只有合不合适。

对比项 LDO(低压差线性稳压器) DCDC(开关电源)
效率 低,约 (Vout/Vin) × 100% 高,通常 80%~95%
纹波 极低(< 10μV) 较高(10~50mV 典型)
噪声 低,适合模拟电路 有开关噪声,需滤波
体积 小,仅需输入/输出电容 大,需电感、电容、二极管
成本 低 中等
适用场景 小电流(< 500mA)、噪声敏感 大电流、压差大、需高效率
我的选型经验: 给MCU的模拟部分(ADC、PLL)供电,我习惯用LDO。给电机驱动、射频PA供电,必须上DCDC。如果电池供电,主路用DCDC降压到3.3V,再串一个LDO给敏感电路,这样效率和噪声都能兼顾。

4.2 PMIC选型:别只看手册

PMIC(电源管理集成电路)把多个LDO、DCDC、充电管理集成在一起。选型时,我建议你重点关注三个维度:

  1. 上电时序:有些PMIC支持硬件可编程时序,有些需要I2C配置。我踩过坑——某次选了不支持独立时序的PMIC,结果DDR先于Core上电,系统死活起不来。
  2. 静态电流:电池产品必须看Iq。比如TI的TPS62840,静态电流只有60nA,适合常供电场景。
  3. 散热封装:大电流PMIC必须考虑热阻。QFN封装散热好,但焊接难度高;WLCSP体积小,但手工维修几乎不可能。
避坑指南: 我曾经在一个IoT项目里选了某国产PMIC,手册上写支持2A输出,实际1.2A就过热保护了。后来发现是热阻参数虚标。所以,大厂(TI、ADI、Maxim、Richtek)的PMIC虽然贵,但参数可信度高。

4.3 电源树设计:从源头到负载

电源树就是一张“供电地图”。我画电源树时,会按以下步骤来:

  1. 列出所有电压域:比如1.2V(Core)、1.8V(IO)、3.3V(外设)、5V(电机)
  2. 估算每路电流:峰值电流和平均电流都要算
  3. 确定电源拓扑:电池→DCDC(3.3V)→LDO(1.8V)→LDO(1.2V)
  4. 检查压差和效率:LDO压差不要超过0.5V,否则发热严重
  5. 添加去耦电容:每路输出至少10μF+0.1μF组合

下面这张图是我常用的电源树结构,你可以参考:

嵌入式系统电源树结构图 电池 3.7V DCDC 3.3V/2A LDO 1.8V/500mA LDO 1.2V/300mA 直供 3.3V/1A MCU IO / 传感器 MCU Core / PLL 电机 / 射频 / LED 电源树设计要点 1. 每级电源压差不超过0.5V,避免LDO过热 2. 大电流负载尽量靠近DCDC输出,减少IR压降 3. 每路输出加10μF+0.1μF去耦电容,位置靠近芯片引脚

4.4 低功耗模式:Sleep / Stop / Standby

低功耗设计是电池产品的灵魂。不同MCU对低功耗模式的叫法不同,但本质就三种:

模式 典型电流 唤醒时间 保留内容 典型应用
Sleep(睡眠) 1~10 mA 几μs 全部RAM、寄存器 等待中断,快速响应
Stop(停止) 10~100 μA 几十μs RAM保持,外设时钟停 定时唤醒采样
Standby(待机) 0.1~5 μA 几ms 仅备份寄存器 深度休眠,按键唤醒
实战要点: 进入Stop模式前,记得关闭所有外设时钟,把GPIO设为模拟输入或上拉/下拉固定电平。否则浮空引脚会漏电,我见过一个案子,Standby模式理论1μA,实测50μA,最后发现是三个GPIO没配置。

4.5 低功耗软件设计:代码层面的坑

硬件选好了,软件写不对,功耗照样下不来。我总结了几条铁律:

  • 关掉不用的外设时钟:STM32用RCC->AHBENR,GD32用RCU,不用的外设时钟位清零。
  • 使用WFI/WFE指令:WFI(Wait For Interrupt)比空循环省电得多。
  • 降低主频:不需要高速处理时,切到低频内部振荡器(LSI/HSI)。
  • 批量处理数据:不要频繁唤醒,攒够一批数据再处理。
// 示例:STM32L4 进入 Stop 模式
void enter_stop_mode(void) {
    // 1. 关闭所有外设时钟
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_GPIOB_CLK_DISABLE();
    // ... 其他外设
    
    // 2. 配置GPIO为模拟输入(防漏电)
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 3. 进入Stop模式
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    
    // 4. 唤醒后重新配置时钟
    SystemClock_Config();
}
避坑指南: 我曾经在GD32F303上做低功耗,进入Deep Sleep后电流一直下不来。查了两天,发现是RTC闹钟中断没清标志位,导致MCU刚睡下就被唤醒。所以,进低功耗前一定要检查所有中断标志位是否清除。

4.6 功耗测量:用数据说话

理论算得再好,不如实测一次。我建议你准备一个精密电流表(比如Keysight N6781A),或者用串联电阻法测压降。测量时注意:

  • 去掉调试器:JLink/ST-Link会额外供电,影响测量结果。
  • 测量平均电流:用示波器看电流波形,别只看万用表平均值。
  • 关注瞬态尖峰:唤醒瞬间电流可能冲到几十mA,要确保电源能扛住。

嗯,电源管理这块内容不少,但核心就三点:选对器件、画好电源树、写对低功耗代码。你把这些吃透了,电池产品续航翻倍不是梦。