1. 项目起因为什么一个单芯片方案最后拆成了双芯供电先说结论如果你手里的处理器对电压精度、上下电时序、功耗模式切换都有硬性要求那么直接用一颗通用DC-DC凑合供电的做法在原型阶段也许还能跑一到量产和低功耗验证阶段就会暴露各种隐患。这个项目最初是一台便携式边缘采集设备主控芯片选了一颗中等性能的应用处理器整机由单节锂电池供电需要从3.2V到4.4V的宽输入范围里稳定输出好几路不同的电源轨。最初我也动过“直接用三颗独立LDO加一颗boost”的念头但算完静态功耗、纹波指标和PCB面积之后果断放弃了。真正促成我改用“PCA9422加R7KA8D2KFLCAC”这个组合的原因有三个。第一处理器侧对VDD_CORE的上电顺序有严格要求内核电压必须比IO电压先起来而且两者之间的延时窗口有硬性指标。用分立LDO实现这种时序控制不是不行但要多加一颗监控芯片和一堆RC延时网络板子调起来非常痛苦。PCA9422这类PMIC本身就是为这种场景设计的多路输出天然带Power Sequence控制。第二设备需要在深度睡眠模式下达微安级静态电流而工作模式又要能瞬间拉高到几百毫安。分立方案的静态电流分散在三颗LDO上怎么优化都压不进目标值。集成PMIC的优势在于可以把未使用的电源轨直接关断只保留维持唤醒逻辑那一小路供电。第三处理器侧有I2C接口可以实时回读电压、电流和状态寄存器这对接入动态调压很有帮助。后续如果要在不同负载场景之间切换电压等级只需要改PMIC寄存器值不用换硬件。所以最后定下来的框架是PCA9422作为前级电源管理单元负责从锂电池取电产生若干路次级电源轨R7KA8D2KFLCAC作为系统主控通过I2C总线对PMIC进行状态读取和动态调压控制。下面我把整个项目的设计过程、关键参数、调试心得和踩坑记录完整写一遍。2. 电源架构设计从电池输入端到处理器每一路电源轨的链路2.1 电源域划分与每一路负载的特征拿到处理器手册后第一步不是画原理图而是把处理器所有电源引脚按负载特性分好类。R7KA8D2KFLCAC这颗芯片的电源域我大致分成四组内核供电域电压范围通常在0.8V到1.1V之间具体值由频率等级决定。这一路电流最大瞬时变化也最剧烈是整个系统里最难伺候的一路。IO供电域也就是通用GPIO、UART、I2C等外设接口的电源常见电压是1.8V或3.3V取决于外部器件的电平要求。模拟供电域给ADC、PLL、温度传感器这类模拟电路供电的域对纹波和噪声最敏感最好单独拿出来处理。常备供电域深度睡眠模式下仍然需要保持的电源用于维持唤醒逻辑、RTC和少量寄存器内容。PCA9422正好支持多路可配置输出我把它分配成了两路降压输出加一路低噪声LDO的组合对应关系如下表电源轨目标电压负载特性PCA9422通道备注VDD_CORE0.85V~1.05V动态大电流Buck1支持动态调压VDD_IO3.3V中等电流Buck2对外设接口供电VDD_ANA2.8V微安级、低噪声LDO模拟电路专用VDD_RTC1.2V极低静态电流LDO或直通模式深度睡眠保持这种划分的核心思路是大电流、频繁变化的负载交给Buck通道处理因为开关电源的转换效率在小电流区间内也远高于LDO而模拟域这种对噪声极其敏感、电流又不大的一路反而适合用LDO利用其低噪声特性保护ADC和PLL的参考电压质量。2.2 输入级设计电池保护、路径选择与滤波电池输入端的处理比很多人想象中更讲究。虽然PCA9422内部已经集成了输入保护逻辑但我仍然在外围加了三级处理第一级是输入反接保护。我用了单颗P-MOS管做极性保护电路而不是传统的串联肖特基二极管。为什么用MOS因为肖特基二极管在2A负载下会产生0.3V到0.4V的压降对于单节锂电池系统来说这个损失直接影响系统可工作时长。P-MOS的方案是让MOS管串联在正极路径上利用体二极管先导通建立回路然后栅极电压拉低使MOS完全导通正常工作时压降在毫伏级别。第二级是π型滤波网络。由一颗22uF陶瓷电容、一颗1uH功率电感、再叠一颗22uF陶瓷电容组成。这个网络的作用是滤除电池引线上的高频噪声尤其是当RF模块和PMIC共用同一根电池线时这种输入滤波能显著降低两者之间的串扰。需要注意的是这里的大容量陶瓷电容要选X5R或X7R介质避免用Y5V这种容量随电压和温度剧烈变化的型号。第三级是TVS管。选了一颗击穿电压略高于电池最高电压的TVS并联在输入端防止热插拔电源或静电放电时把PMIC的输入引脚打坏。放置位置要紧贴PMIC的VIN引脚越近越好。2.3 电感与电容的选型计算这一块是很多第一次用PMIC的人最容易拍脑袋决定的地方。PCA9422的Buck通道对电感值有推荐范围但不能只看着推荐值买。我给出一个完整的计算过程方便你自己举一反三。以VDD_CORE这一路为例设计要求是输入电压3.7V输出电压0.9V最大负载3A开关频率1.5MHz允许的输出纹波不超过10mV。第一步计算电感值。一般经验是让电感纹波电流峰峰值控制在最大负载电流的20%到40%之间。取中间值30%那么纹波电流的峰峰值为ΔI 0.3 × 3A 0.9A电感值的计算公式为L (V_out × (V_in - V_out)) / (f_sw × ΔI × V_in)代入数值L (0.9 × (3.7 - 0.9)) / (1.5e6 × 0.9 × 3.7) (0.9 × 2.8) / (4.995e6) ≈ 0.504uH考虑器件余量我会选1uH作为实际值——为什么不是0.5uH因为计算出来的0.5uH是理想临界值实际工作中电感量会随温度和电流升高而下降选大一倍可以在全温度范围内更稳定地控制纹波。同时输出电容的等效串联电阻ESR才是决定纹波的主要因素。第二步计算输出电容。输出电压纹波主要由电容ESR和充放电引起其中ESR部分占大头。按纹波要求10mV反推需要的ESR上限是ESR_max ΔV_ripple / ΔI 10mV / 0.9A ≈ 11mΩ这也是为什么输出侧一定要选MLCC电容而不是电解电容——普通钽电容或电解电容的ESR普遍在几十到几百毫欧根本满足不了这种低压大电流场景。我最终选了两颗22uF/0805的MLCC并联并联后ESR大约在5mΩ左右能够达到设计指标。第三步是输入电容。输入电容的作用是吸收来自电池端的瞬态能量同时减小PMIC输入端的高频开关纹波。一般按Buck变换器输入纹波电流的经验公式来选我直接用了22uF加0.1uF的组合方式。22uF负责维持输入电压稳定0.1uF负责滤除高频开关噪声两者缺一不可。3. 上电时序与复位逻辑避免“内核电压比IO先起来”的常见事故3.1 为什么时序这么重要很多PCB设计新手不理解同样的供电电压仅仅是上电顺序不同为什么会导致处理器无法启动甚至损坏这里做一个通俗解释。处理器内部的逻辑电路和IO驱动电路相当于两个独立的“村庄”内核域使用超低电压供电以降低功耗IO域使用较高电压与外部器件通信。如果IO域先得电、内核域还没供电那么IO电路就会尝试通过内部ESD保护二极管和逻辑门把电流倒灌进内核域轻则造成逻辑状态混乱重则长期搁置后损伤芯片内部结构。R7KA8D2KFLCAC的数据手册对时序窗口有明确规定我在设计时按以下顺序排列常备供电域VDD_RTC先起来用于给唤醒逻辑和RTC供电。等待VDD_RTC稳定后再过一段延时让VDD_ANA模拟域上电。等待模拟域稳定再打开VDD_IO。最后才是VDD_CORE内核域。这个顺序看起来是“先外围后核心”和很多人直觉里的“核心最重要先给核心供电”正好相反。原因在于IO和模拟域作为外围电路先初始化好内核上电后可以立刻读取有效的外部状态如果反过来让内核先跑起来IO域还没就绪内核在执行初始化时就会读到不确定的电平引发死锁。3.2 用PCA9422实现时序控制的两种方式PCA9422内部集成了可编程的Power Sequence逻辑通过寄存器配置每个通道的上电延时和斜率。我最初用的是默认配置即所有通道同时快速开启。结果实测时处理器经常出现启动失败后来确认就是时序问题。第一种方式是直接使用PMIC内部序列控制。配置寄存器里的SEQ_EN字段、每个通道的DELAY字段和SLEW_RATE字段。这种方式的优点是纯硬件执行不依赖处理器固件上电过程一旦配置好就固定不变。缺点是需要占用I2C初始化时间——如果PMIC出厂状态是默认配置那首次上电时的时序可能并不符合你的要求。第二种方式是GPIO级联控制也是我最后采用的方案。我把VDD_RTC设为常开输出然后将其输出电压作为下一路通道的ENABLE信号输入。这样每条轨道的后一级必须在前面一级电压建立到阈值之后才开始启动天然实现了“逐级上电”。这种方案的可靠性更高即使PMIC内部配置被意外擦除硬件上依然有正确的时序保障。实际设计时我把两种方式结合由GPIO硬件链保证基本时序可靠再由PMIC寄存器细化每一路之间的精确延时。这是我认为最稳妥的组合策略。3.3 复位信号的产生与监控处理器侧的复位信号不能简单地由RC延时电路产生。我之前在一个项目里踩过坑用简单的RC复位电路结果在电源跌落又快速恢复时复位信号根本来不及拉低处理器直接进入未定义状态。正确的做法是用电源监控芯片或PMIC内部的欠压检测功能产生复位信号。PCA9422内部有多路UVLO比较器可以监测每一路输出是否达到阈值。当任意一路关键电压低于阈值时PMIC会拉低复位输出引脚从而强制处理器保持复位状态。我设计时把复位输出接到了R7KA8D2KFLCAC的复位引脚同时加了一颗10kΩ上拉电阻和0.1uF滤波电容。上拉电阻保证复位引脚在正常状态下有确定的逻辑高电平滤波电容则用来吸收快速电压跌落造成的毛刺。调试时我发现一个有意思的现象复位信号的释放时刻比内核电压稳定时刻还要晚大约几毫秒这是正常的也是PMIC故意加的保护窗口。处理器在复位释放前需要等待内部时钟建立稳定如果复位释放太早内部振荡器还在摆动引脚也会出现不确定状态。4. I2C动态调压与状态监控从固定电压到实时响应4.1 为什么需要动态调压固定电压供电的设计虽然简单但对电池续航并不友好。处理器在轻负载场景下的最优工作电压往往比满载时低很多。EDGE AI设备经常处于“大部分时间待机、偶尔爆发计算”的工作模式如果一直以满载电压运行静态功耗浪费严重。动态调压的思路是让固件根据当前CPU频率和负载情况实时调节内核供电电压做到“需要多少性能就给多少电压”。以R7KA8D2KFLCAC为例运行在较低频率时内核电压只需要0.85V但满负荷运行时需要1.05V才能保证时序收敛。如果一直固定按1.05V供电每瓦计算能耗会增加15%左右。在便携设备上这个差距直接表现在电池续航时间上。4.2 I2C寄存器读写协议详解PCA9422内部的I2C从机地址和寄存器映射可以直接在数据手册中查到。这里我说一下读写操作的注意点因为调试过程中我发现很多问题都出在I2C通信细节上。PMIC的I2C接口从机地址是固定的但我调试时发现地址的末位bit受到外部引脚状态影响。如果你的设计里正好有这个引脚并且接错了电平那么I2C设备地址会整体偏移一位导致固件里配置的地址全部无效。我花了半天排查这个问题最终是把所有I2C帧都改成用总线扫描方式确认实际地址才定位到。具体寄存器操作方面调压的核心是找到目标通道的电压选择寄存器。PCA9422一般用8bit寄存器表示电压档位每一档位对应一个电压值。写寄存器时要注意先读后写只修改目标bit位不要覆盖同一寄存器里的通道使能或时序配置位。我写了一个底层驱动函数封装这个逻辑避免在应用层每次都操作完整寄存器值。读取电压和电流状态更加简单通过状态寄存器就能拿到实测值。这里有一个技巧要注意寄存器的数据更新时刻。我实测发现电流回读值并不是实时连续更新的而是以约1ms的周期刷新。如果应用层需要快速响应过流事件不能依赖这个寄存器而应该用PMIC的中断输出引脚来触发处理。4.3 动态调压策略的分层实现我把动态调压分成三个层级由浅入深实现第一层是固定挡位切换。固件里预设三组电压配置分别对应低性能、中性能、高性能模式。切换时直接写寄存器值一次性把内核电压调到对应档位。这个方案最简单可靠适合大多数不需要连续调压的场景。第二层是结合处理器频率的映射。在Linux或RTOS的CPUFreq驱动里挂载一个notifier当调度器改变CPU频率时驱动根据频率表中的映射关系同步调整内核电压。这个方案的关键是频率表里每一档对应电压值都要经过实测验证不能直接用理论值。有些频率档位的理论最低电压在实际芯片上跑不过稳定性测试需要在固件里预埋一圈电压补偿值。第三层是闭环动态调压借助处理器内部的实时电压和温度传感器。固件周期性地读取当前芯片温度和负载水平如果温度过高则主动降低电压和频率限制实现动态热管理。这个方案我在项目后期才启用因为涉及安全边界需要大量实验数据支撑。实测下来最稳定的还是第二层方案结合CPUFreq的映射调压逻辑清晰响应足够快也不会有闭环振荡风险。第三层作为热保护兜底逻辑在长期高负载场景下确实能把芯片温度控制在安全范围内。5. 实测数据与波形分析纹波、效率、瞬态响应和热行为5.1 纹波测量方法与结果测量Buck输出的纹波很多人直接用示波器探头夹在输出电容两端结果看到的是几十毫伏的开关噪声就开始怀疑设计有问题。其实这种测量方式本身就有问题示波器探头的地线夹子会形成一个大环路拾取空间中的电磁噪声。正确做法是使用接地弹簧把探头的地尽量缩短直接落在输出电容的引脚附近。如果示波器支持差分测量用差分探头跨接在输出电容两端更好。实测VDD_CORE这一路在1.05V设定值下输出纹波峰峰值约12mV包含高频开关纹波和极低频的负载变化纹波。这个水平对于内核供电来说完全合格。VDD_ANA这一路用LDO输出后纹波控制在3mV以内直接给ADC供电也没有明显的地噪声问题。5.2 效率曲线与续航估算效率测试我用了电子负载逐步加电流的方式从10mA到2A按对数间隔取点。VDD_CORE这一路在0.1A和0.5A之间效率最高达到92%左右。轻载10mA时效率降到了78%主要原因是固定开关损耗占比上升。VDD_ANA这一路因为使用LDO效率基本等于输出电压除以输入电压在不同电池电压下大约为75%到83%。整体系统效率折算下来在混合负载场景下约为87%。对比同类型产品的实际功耗数据这个水平处于中等偏上。如果后续想进一步提升续航可以考虑让VDD_IO也改为Buck供电而不是沿用默认的LDO模式代价是增加一路噪声源的隔离难度。5.3 瞬态响应从睡眠到全速运行的电压跌落这是整个测试中最值得关注的一组数据。我使用处理器自身执行一个突发计算任务同时用示波器记录VDD_CORE的电压波形。从深度睡眠模式唤醒到满负荷运行的瞬间内核电流从10mA跳变到约2A建立时间约50us。在这段时间里VDD_CORE电压跌落了大约45mV随后在30us内恢复回到设定值。这个跌落幅度在设计指标范围内但要说明的是如果输出电容容量选小了跌落幅度会直接翻倍。当初我测试过只放一颗22uF电容的情况跌落接近110mV处理器在低电压下直接进入了复位状态。后来我把输出电容加大到两颗22uF并联效果立竿见影。这也验证了前面2.3节计算时说的低压大电流场景下输出电容不能省宁可多放两颗也不要卡在最小需求线上。5.4 热行为与散热设计PMIC在满载2A、转换效率91%的情况下自身功耗约为180mW。这个热量分布在PCB上如果不处理芯片表面温度会比环境温度高约20摄氏度。便携设备内部通常没有主动散热风扇所以我在PCB布局时采取了几项措施PMIC底部通过阵列过孔连接到地铜皮扩大散热面积PMIC周边电源走线尽量拓宽用铜箔辅助散热避免在PMIC附近放置陶瓷晶振等对温漂敏感器件。实测在25摄氏度环境温度下持续满载运行30分钟PMIC表面温度稳定在48摄氏度左右。处理器表面温度约61摄氏度主要受限于外壳散热。这个结果在量产验收标准以内。6. 调试过程中踩过的最值得记录的三个坑6.1 I2C从机地址偏移总线扫描救了一命刚才提到过PMIC的从机地址受外部引脚影响。当时我的固件里写死了0x64但无论怎么发送数据PMIC都没有ACK相应。用逻辑分析仪抓了总线波形也没发现异常地址字节看起来是对的。后来写了一个I2C地址扫描程序从0x03到0x77逐一遍历才发现实际响应地址是0x65。原因是在某次改板时不小心把地址配置引脚的扇出接错了电平。这个问题的教训是新板子调试I2C外设时不要自信地认为数据手册里的默认地址一定就是硬件上的实际地址。先跑一遍总线扫描成本极低但能省下大量排查时间。6.2 轻载时的“打嗝模式”导致处理器误复位PCA9422在轻载条件下会自动进入省电模式通过间歇性开通功率管来维持输出。这种模式会带来更大的输出电压纹波。如果处理器对这个纹波敏感有时会误判为电源异常。我第一次做整机测试时设备在待机状态下偶发重启。抓了很长时间波形才发现重启时刻的VDD_CORE电压出现了一个短暂的负向毛刺深度达到约80mV。后来我把该通道的省电模式关闭强制进入强制PWM模式问题随即消失。代价是轻载效率略微下降但稳定性大幅提升。如果你的设备对偶发重启零容忍这是值得做的取舍。6.3 接地环路对ADC采样的干扰模拟域的LDO输出纹波本身很低但整机ADC采样值依然有周期性波动。排查发现PMIC和ADC的参考地之间存在一个数百毫伏级的电位差——原因是PCB单点接地策略没有落实到位大电流从PMIC地回流时经过了一小段窄铜皮产生了几十毫伏的压降ADC的参考地正好接在这段铜皮上。修复方法很直接把PMIC的地和ADC的地在底层分别用大面积铜皮连接只在电池负极汇合同时ADC采样电路的参考地单独打过孔回到主地平面不再经过电流回流路径。修复后ADC采样的重复性从±4LSB改善到了±1LSB以内。地设计这件事在低功耗和高精度同时存在的系统里优先级永远排在功能实现之前。7. 如果能重新做一次我会改掉哪三件事第一个改动是给VDD_CORE再加一个小型负载开关做备用电源路径。虽然PCA9422本身的稳定性已经足够但在某些特殊情况下比如PMIC的寄存器配置被软件错误覆盖如果有一条独立的超低功耗旁路能够让处理器进入安全模式整个系统会更有韧性。第二个改动是PMIC的I2C配置增加看门狗保护。我在调试中发现有些寄存器配置在特定操作后会意外被复位到默认值。如果在固件里加一个定时刷新机制每100ms重新写入关键寄存器就能有效避免这种“配置丢失”导致系统状态漂移的问题。第三个改动是把所有电源轨的测试点都设计成便于焊接的探针形式而不是简单的过孔。调试时频繁接探头会让过孔松动最终我在PCB上额外焊了一排排针作为临时监测点。这件事看着小但在反复调试时节省的时间不可估量。整体来说双芯电源管理方案在这个项目里的表现是远超预期的。PCA9422的硬件时序控制和寄存器配置能力让电源设计变得规整而R7KA8D2KFLCAC侧通过I2C实时监控电源状态也让整机的功耗调优有了数据基础。如果你也在做类似的低功耗便携设备希望这篇文章里关于架构划分、电容选型、时序配置和调试排障的内容能帮你少走一些弯路。
阅读完成 · 觉得有帮助?