2. PMU硬件基础:PMIC内部框图,LDO/Buck/Boost工作原理,关键寄存器解读

各位好,咱们今天聊聊PMU的硬件基础。说实话,很多做系统层的朋友一看到硬件框图就头疼,觉得那是硬件工程师的事。但我个人经验告诉我——不懂PMIC内部结构,你调功耗就像蒙着眼睛走路。

我记得刚入行那会儿,有个项目待机电流死活降不下来。我折腾了三天,最后发现是某个LDO的驱动能力配错了。从那以后,我养成了一个习惯:拿到新板子,第一件事就是翻PMIC的datasheet,把内部框图看明白。

2.1 PMIC内部框图解析

PMIC(Power Management IC)说白了就是一颗集成了多种电源转换和管理功能的芯片。你想想看,手机里那么多模块——CPU、GPU、内存、射频、传感器——每个需要的电压和电流都不一样。总不能给每个模块都配一个独立的电源芯片吧?PMIC就是干这个的。

一个典型的PMIC内部包含这些模块:

  • 输入电源管理:处理来自电池或USB的输入,通常包含充电管理、过压保护、欠压锁定
  • DC-DC转换器阵列:多个Buck和Boost转换器,提供核心电压、IO电压等
  • LDO阵列:多个低压差线性稳压器,给噪声敏感的模拟电路供电
  • 控制逻辑:I2C/SPI接口、状态机、中断管理
  • 保护电路:过流保护、过温保护、短路保护

关键点:PMIC内部每个电源轨都有独立的使能控制、输出电压设定和电流限制。这些寄存器就是咱们调功耗的抓手。

2.2 LDO工作原理

LDO(Low Dropout Regulator),低压差线性稳压器。它的工作原理其实很简单:通过调整一个可变电阻(功率管)的阻值,把输入电压降到目标输出电压。

为什么叫"低压差"?因为它的输入输出电压差可以很小,比如输入3.3V输出3.0V,压差只有0.3V。这在电池供电的设备里特别重要——电池电压快耗尽时,还能维持输出稳定。

LDO的优缺点很明显:

优点 缺点
输出纹波小,噪声低 效率低(效率≈Vout/Vin)
电路简单,外围元件少 只能降压,不能升压
响应速度快 大电流时发热严重

我的经验:给音频Codec、射频前端这类模拟电路供电,我建议用LDO。虽然效率低点,但噪声小啊。数字电路嘛,能用Buck就用Buck,省电。

2.3 Buck转换器工作原理

Buck转换器,也叫降压型DC-DC。它的核心思想是:先把直流电斩成方波,再通过LC滤波器平滑成直流。通过调节方波的占空比来控制输出电压。

公式很简单:Vout = Vin × D(D是占空比,0~1之间)。

Buck的效率能做到85%~95%,远高于LDO。为什么?因为它的功率管要么完全导通(饱和区),要么完全关断(截止区),损耗主要来自导通电阻和开关损耗。

我在项目中遇到过一个问题:某个Buck转换器在轻载时效率暴跌。查了半天,发现是没开启PFM模式。PFM(脉冲频率调制)在轻载时会降低开关频率,减少开关损耗。嗯,这个坑我踩过,你们注意一下。

// 典型的Buck寄存器配置示例
// 设置输出电压为1.1V
reg_write(PMIC_BUCK1_VSET, 0x1A);  // 0x1A对应1.1V

// 使能PFM模式(轻载高效)
reg_write(PMIC_BUCK1_MODE, 0x02);  // 0x02 = PFM模式

// 设置电流限制
reg_write(PMIC_BUCK1_ILIM, 0x03);  // 0x03 = 2.5A

2.4 Boost转换器工作原理

Boost转换器,升压型DC-DC。它的原理和Buck相反:先把电感储能,再把能量释放到输出端,实现升压。

公式:Vout = Vin / (1 - D),D是占空比。注意,D不能等于1,否则输出会失控。

Boost用得最多的地方是哪里?OLED屏幕供电、USB OTG输出(5V)、还有某些音频功放。我记得有个项目,OLED屏幕闪烁,查了半天是Boost输出纹波太大。后来在输出端加了个22μF的陶瓷电容,问题解决了。

避坑指南:Boost转换器在启动时会有浪涌电流。我曾经因为没注意这个,导致PMIC过流保护触发,系统反复重启。解决办法是软启动——通过寄存器设置启动时间,让输出电压缓慢上升。

2.5 关键寄存器解读

好了,前面讲了那么多原理,最终都要落实到寄存器上。PMIC的寄存器通常通过I2C或SPI访问。我以某款常用PMIC为例,说说几个关键寄存器:

寄存器名称 地址 位域 功能说明
BUCK1_VSET 0x21 [7:0] Buck1输出电压设定,步进12.5mV
BUCK1_CTRL 0x22 [0]使能位
[1]PFM使能
[2]软启动时间
控制Buck1的工作模式
LDO1_VSET 0x31 [7:0] LDO1输出电压设定,步进50mV
LDO1_CTRL 0x32 [0]使能位
[1]快速放电
控制LDO1的开关和放电
PMIC_STATUS 0x01 [0]过温
[1]过流
[2]欠压
读取PMIC状态,调试用

读寄存器的时候,我建议你们养成一个习惯:先读一遍默认值,记录下来。很多PMIC出厂时都有默认配置,你改了之后万一出问题,还能恢复回去。

// 读取并打印Buck1的当前电压设置
uint8_t vset = reg_read(0x21);
float voltage = 0.6 + vset * 0.0125;  // 假设基准电压0.6V,步进12.5mV
printf("Buck1 current voltage: %.3f V\n", voltage);

// 使能LDO1并设置快速放电
reg_write(0x32, 0x03);  // bit0=1使能, bit1=1快速放电

重点:快速放电这个功能,很多人会忽略。当LDO关闭时,如果输出端有电容,电压不会立刻掉到0。快速放电就是提供一个放电通路,让电压快速归零。这在需要快速切换电源轨的场景下特别重要。

好了,这一章的内容就这些。总结一下:PMIC内部框图让你知道电源从哪来到哪去;LDO、Buck、Boost各有各的脾气,选型时要根据负载特性来;寄存器是咱们调功耗的武器,要会用、会读、会写。

下一章咱们聊聊实际调试中怎么用这些知识,到时候我会分享几个真实案例,保证你们听了有收获。