4、电源管理单元(PMU)详解:内部LDO vs DC-DC,电压调节(Voltage Scaling),电源域划分(PDN)

好,咱们今天聊点硬核的——电源管理单元,也就是PMU。很多刚入行的朋友觉得PMU不就是个供电的嘛,有啥好讲的?其实不然。我做了这么多年低功耗设计,可以负责任地告诉你:PMU玩得好不好,直接决定了你的产品能不能过车规,电池能撑多久。

4.1 内部LDO vs DC-DC:选型背后的门道

先说说LDO和DC-DC。这两个东西,说白了都是给MCU内部模块供电的。但它们的脾气秉性完全不同。

4.1.1 内部LDO:简单但“浪费”

LDO,低压差线性稳压器。它的原理很简单——把多余的电压以热量形式消耗掉。比如你电池电压是5V,内核需要1.2V,那剩下的3.8V就变成热量散掉了。

优点:

  • 纹波小,输出干净。我做过一个AD采样项目,用LDO供电,采样值稳定得一批
  • 响应快,负载突变时电压跌落小
  • 外围电路简单,一个输入电容、一个输出电容就搞定

缺点:

  • 效率低。效率 = Vout / Vin,5V转1.2V,效率只有24%!
  • 电流大了发热严重。我见过一个同事,LDO选了太小封装的,板子一上电烫得能煎鸡蛋

关键点:LDO适合小电流、对噪声敏感的模拟电路。比如ADC参考电压、PLL供电,我一般都用LDO。

4.1.2 DC-DC:高效但“麻烦”

DC-DC转换器,用的是开关方式。通过电感储能、电容滤波,实现电压转换。效率能做到85%以上,甚至95%。

优点:

  • 效率高,省电。5V转1.2V,效率85%以上,比LDO省了3倍多的电
  • 可以升压也可以降压,灵活

缺点:

  • 纹波大,有开关噪声。频率一般在几百kHz到几MHz
  • 外围电路复杂,需要电感、二极管、多个电容
  • 布局布线要求高,搞不好就自激振荡

我的经验:DC-DC适合给数字核心供电,比如CPU、RAM这些。但给模拟电路供电时,我建议加一级LDO做后级滤波。曾经有个项目,ADC采集值一直跳,查了三天发现是DC-DC的开关噪声串进去了。加了个LDO后,问题解决。

4.1.3 选型对比表

参数 LDO DC-DC
效率 低(20%-60%) 高(80%-95%)
纹波 低(<10mV) 高(10-100mV)
外围元件 少(2个电容) 多(电感+电容+二极管)
适合场景 模拟电路、小电流 数字核心、大电流
成本 中高

4.2 电压调节(Voltage Scaling):动态调压的艺术

电压调节,也叫动态电压调节(DVS)。说白了就是:芯片干活少的时候,给它降点电压;干活多的时候,再升回来。

为什么会这样?因为功耗和电压的平方成正比。P ∝ V² × f。电压降一半,功耗降到四分之一。这个账,算得过来。

4.2.1 电压调节的三种模式

我习惯把电压调节分成三个层次:

  1. 静态电压调节:出厂就定死了。比如1.2V内核电压,永远不变。简单,但浪费电
  2. 动态电压调节:根据负载动态调整。比如跑CAN通信时用1.0V,跑算法时用1.2V
  3. 自适应电压调节:芯片自己感知工艺、温度,自动找最低工作电压。这个最省电,但也最难做

避坑指南:我曾经在一个项目里,把电压调得太低,结果芯片在低温-40℃时直接死机。为什么?因为低温下晶体管阈值电压升高,原来能工作的电压现在不够了。从那以后,我每次做电压调节都会留5%-10%的余量。

4.2.2 实际调压流程

以NXP的S32K系列为例,调压流程大概是这样的:

// 伪代码示例:动态电压调节
void DVS_SetVoltage(uint16_t target_mV) {
    // 1. 设置目标电压
    PMU->VREG_CTRL = (target_mV & 0x3FF) << 16;
    
    // 2. 等待电压稳定
    while(!(PMU->STATUS & PMU_STATUS_VREG_OK));
    
    // 3. 调整工作频率(电压降了,频率也要降)
    SCU->CLK_DIV = CalculateMaxFreq(target_mV);
    
    // 4. 确认系统稳定
    if(PMU->STATUS & PMU_STATUS_UNDER_VOLTAGE) {
        // 电压跌过头了,赶紧恢复
        DVS_SetVoltage(previous_mV);
    }
}

嗯,这里要注意:电压调节不是单纯改个寄存器就完事了。你得考虑负载变化、温度漂移、甚至PCB走线的压降。我一般会在板子上留一个测试点,用示波器实测一下电压波形。

4.3 电源域划分(PDN):把电分给该用的人

电源域划分,英文叫Power Domain Network。说白了就是把芯片内部不同的功能模块,接到不同的电源网络上。想关哪个关哪个,互不影响。

4.3.1 为什么要划分电源域?

你想想看,一个车载MCU里,有CAN控制器、ADC、定时器、CPU、RAM、Flash...如果所有模块都用一个电源,那你想让CAN模块工作、CPU休眠,根本做不到。因为电源一关,全都没了。

所以,我们要把电源域划分开:

  • Always-On域:永远不断电。比如唤醒逻辑、RTC、备份寄存器
  • Sleep域:可以关掉。比如CPU、大部分外设
  • Deep Sleep域:深度休眠时关掉。比如ADC、DAC这些模拟模块
  • Off域:完全断电。比如某些不用的外设

我的习惯:画PCB时,我会用不同颜色标注不同电源域。Always-On域用红色,Sleep域用蓝色,Deep Sleep域用绿色。这样一眼就能看出哪些线不能共用,哪些模块可以独立关断。

4.3.2 电源域划分的实战要点

做电源域划分时,有几个坑我踩过,分享给你:

  1. 电平转换:不同电源域之间通信,一定要加电平转换器。我曾经偷懒没加,结果IO口漏电,休眠电流多了50uA
  2. 隔离单元:关断的电源域,输出信号要隔离。不然会通过IO口倒灌电流到其他域
  3. 上电顺序:不同域上电要有先后。比如先给Always-On域上电,再给Sleep域上电。否则可能出现latch-up
  4. 去耦电容:每个电源域入口都要放去耦电容。我一般放一个10uF+100nF的组合

警告:电源域划分不是越多越好。域太多,隔离单元、电平转换器会占用面积和功耗。我见过一个设计,分了8个电源域,结果隔离电路本身消耗了20%的功耗。得不偿失。一般3-4个域就够用了。

4.3.3 一个典型的电源域划分案例

以我做过的一个车身控制模块为例:

电源域 包含模块 电压 休眠策略
VDD_ALWAYS RTC、唤醒逻辑、备份寄存器 1.8V 永不关断
VDD_CORE CPU、RAM、Flash 1.2V(可调) Sleep时关断
VDD_IO GPIO、CAN、LIN 3.3V Deep Sleep时关断
VDD_ANA ADC、DAC、比较器 3.3V(LDO供电) Standby时关断

这个划分方案,我用了好几年。休眠电流能做到10uA以下,唤醒时间小于100us。嗯,还算满意。

4.4 小结

电源管理这块,说白了就是三个字:省、稳、快。省电、稳定、快速响应。LDO和DC-DC各有千秋,电压调节要留余量,电源域划分要适度。我做了这么多年,最大的体会就是:别贪多,别偷懒,该加的隔离加,该留的余量留。

下一章,咱们聊聊时钟管理。时钟这玩意儿,比电源还容易出幺蛾子。到时候见。