我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

用PCA9422与PIC18F45K42构建低功耗多路电源管理系统

用PCA9422与PIC18F45K42构建低功耗多路电源管理系统 做电源管理这些年有一类困扰我特别久单颗 MCU 内部的稳压电路撑不起一个多路负载系统尤其是电池供电、需要在跑不同负载时随时切电压的场合。以前习惯性用一堆 LDO 去堆结果板子上全是发热点电流一上去效率就往下掉更别提各路的上电时序、电压监测、低功耗休眠这些需求全靠 MCU 的 GPIO 加延迟硬撑根本不叫“管理”顶多算“控制”。这篇想聊聊我最近做的一个方案用 PCA9422 这一颗低功耗 PMIC配合 PIC18F45K42 这颗自带丰富模拟外设的 MCU把一套完整的电源管理链路做下来——从硬件选型、通道规划、外围电路参数到 I2C 配置、状态切换、动态调压再到实测中踩过的那些坑。如果你正在做电池供电产品、可穿戴设备或者想把板子上的线性稳压方案整体升级成开关电源方案这篇文章应该能给你省下不少弯路。1. 为什么我放弃了“LDO 堆料”的老思路说起来有点惭愧前几年我做低功耗设备电源部分从来不想动脑子。单片机 3.3V、传感器 1.8V、射频部分 1.2V那就三个 LDO 各管一路地上一颗颗小芯片排开看着挺规整的。但真到调试的时候问题一个一个往外冒。1.1 效率账算不过来的场景第一个暴露的问题是热。电池供电的设备空间就那么点大LDO 的效率是 (Vout/Vin)输入 4.2V、输出 1.2V 的时候效率只有 28%剩下 72% 全部变成热量。一个 500mA 电流的外设模块LDO 上要耗掉 1.5W 的功率封装小的芯片直接烫手外壳都能感觉到温度上升。换成 PCA9422 这种内置自举开关的 DC-DC 方案之后哪怕我不做太多优化三路降压的效率基本都能做到 90% 上下。同样是 4.2V 输入转 1.2V在 500mA 负载下开关电源损耗大约只有 LDO 的十分之一这优势在电池供电产品上是决定性的。1.2 上电时序真的没法靠 GPIO 了老方案里我会用 MCU 的几个 GPIO 分别控制 LDO 的使能引脚然后在代码里加延时“先给传感器供电100ms 后再给主控供电”。问题在于MCU 自己也是被供电的对象如果 MCU 的供电不在第一路那整个时序就只能靠外部电路硬连线搭出来非常丑而且改动一次就要改板子。PCA9422 这类 PMIC 的优势在于使能逻辑本身就是内置的各路输出之间的延时可以通过寄存器配置出来而且支持通过 I2C 去动态开关每一路。这意味着上电时序可以做到软件可控不改硬件就能调整甚至可以在运行过程中做输出降压再关掉比 GPIO 拉使能引脚那种方案灵活得多。1.3 欠缺的电压/电流回读能力之前最痛苦的是一次故障排查系统在某个特定负载下死机我怎么都不知道是哪一路电压掉了。LDO 方案里每路输出都是一个 “黑盒”电压是不是正常要靠万用表去量量完只能拿到“现在”的值拿不到掉电瞬间的数据。而 PCA9422 提供了状态回读能力每个通道的运行状态、故障状态都能通过 I2C 寄存器读出来。配合 PIC18F45K42 的中断引脚一旦 PMIC 检测到过流、过温或者输出电压跌落MCU 能立刻感知到并进入异常处理流程。这才叫“管理”不然顶多算三路独立供电的拼盘。2. PCA9422 硬件接入通道规划与外围选型的实战考量拿到芯片之后第一步不是看寄存器而是先把硬件连接定下来。PMIC 对外围元件的敏感度比 LDO 高太多了电感选不对、电容放不好效率、纹波、稳定性全部受牵连。2.1 先说我这边的系统拓扑我的应用是一块两节 AA 电池供电的便携采集设备电池电压范围大概在 1.8V~3.3V中间随时可能低于 3.0V 甚至低到 2.0V。所以输入我先加了一级升压把电压稳定在 3.6V再喂给 PCA9422。为什么要通过升压再降压而不是直接让 PMIC 吃电池电压因为 PCA9422 的输入范围虽然能覆盖电池电压区间但它在输入贴近输出的情况下部分通道的压差控制会受限而且电池放电到 1.8V 那种低电压状态下PMIC 内部电路也可能工作不稳定。与其赌边界条件不如老老实实用升压把供电轨抬高让 PMIC 始终工作在最佳区间。代价是升压那一级多 3% 左右的损耗但换来了全生命周期稳定的输出值。2.2 三路输出的分工同样是降压通道负载特性天差地别。我按负载类型做了功能划分而不是按“电压从低到高排排坐”来分。通道输出电压负载对象平均负载峰值负载VOUT13.3V传感器、模拟前端≤80mA150mAVOUT21.8V逻辑电路、电平转换器≤60mA120mAVOUT31.2VMCU 内核供电通过内部LDO再降≤35mA100mA实际使用中 VOUT3 直接给了一颗小 SoC 的内核电压PIC18F45K42 本身是 3.3V 供电它的 IO 逻辑也跑在 3.3V 域我特意要求系统里不能出现 3.3V 的 IO 去向 1.2V 的负载直连的情况都在中间做了电平转换。这里给大家一个建议多路电源系统里电压域的划分一定要跟在原理图阶段就写清楚不要在 PCB 完成后再糊一层电平转换芯片上去那真是拆东墙补西墙。2.3 电感选择核心参数不是电感值而是饱和电流这块要重点说。 PCA9422 这类内部集成开关管的 PMIC外部需要的电感通常在里面已经给出了参考范围但参考值会暗示你用一个很小尺寸的电感很多人就直接按封装尺寸买了。我实际试下来电感选择第一优先的是饱和电流要留足裕量。以我的 VOUT1 为例峰值负载 150mA如果按常规经验选一个 250mA 额定电流的电感在电池快没电、输入电压走低、开关占空比被迫拉宽的临界状态下电感电流纹波会显著增大峰值电流很容易超过电感的额定值一旦接近饱和电感量掉下去输出纹波飙高甚至引起系统重启。后来我把 VOUT1 和 VOUT2 的电感都选择了饱和电流不小于 450mA、DCR 控制在 150mΩ 以内的型号VOUT3 因为功率小选了 300mA 规格的。电感的 DCR 是个很容易让人忽视的参数它直接决定轻载效率。实测我用 DCR 250mΩ 的电感替换掉 120mΩ 的200mA 负载时效率掉了 4%这在小功率系统里已经算是可观损失了。2.4 输入输出电容与 PCB 布局要点PMIC 的输入输出电容不能照抄典型应用电路就完事。PCA9422 的输入侧电容我放了两颗一颗 10μF 的 X5R 陶瓷电容负责高频开关噪声一颗 47μF 的钽电容负责应对负载跳变时的电压跌落。芯片数据手册或许不会明确规定一定要放钽电容但我在实际测试中发现纯陶瓷电容方案在突然接入一个大电流外设时输入电压会瞬间被拉低 150mV 以上这会影响到升压级的环路稳定性。布局方面有一个值得重点说的点反馈走线千万不能从电感底下穿过。我第一批样板上VOUT2 的反馈走线绕过电感下方走回来了结果纹波直接从 12mV 抬升到 46mV示波器中能看到明显的开关尖峰耦合进反馈环路。改版之后把所有反馈走线改成远端采样结构从负载端单独引回从源端直接接回去纹波立刻恢复到正常水平。3. PIC18F45K42 在系统里真正扮演的角色很多人看到“电源管理”第一反应是“哦MCU 就是发号施令的吧初始化一下 PMIC 就完事。”实际上PIC18F45K42 这颗芯片真正出色的地方在于它能够把监测、保护、配置三件事在一颗芯片里全部完成不需要额外再挂一颗 ADC 或比较器。3.1 用 ADCC 做电池电压和关键节点监测PIC18F45K42 内置的 ADC 带计算功能可以做多次采样取平均值、过阈值自动触发中断这在电源管理里的应用价值非常高。我的供电拓扑里电池电压、升压输出、PMIC 的三个输出电压并不是全部都能直接引到 MCU 的 ADC 引脚。所以我在信号接入上做了两个处理电池电压经过电阻分压100kΩ : 33kΩ把最高 3.3V 的信号缩放到 MCU 的可测范围需要在休眠时依然保持电压监测所以分压电阻选了高阻值把静态漏电流压低到 1μA 以下。ADCC 的计算功能我用了两个场景一是对电池电压做 16 次平均滤掉脉冲负载带来的电压瞬时跌落二是设定一个比较阈值当电池电压低于某个值并且持续超过 500ms 时触发中断让 MCU 进入低电量保护时序。这里强调一下阈值比较一定要做去抖不然射频模块一发射电池电压瞬间下跌会立刻触发误判。3.2 用 GPIO 中断来处理 PGOOD 信号的变化PCA9422 的各个输出通道具备独立的电源正常指示我把它们汇总成一棵线与结构再接到 PIC18F45K42 的中断引脚上。这里有个设计细节值得展开PIC18F45K42 的引脚可以配置成电平变化中断IOC模式我在初始化时把这个引脚配置为“仅在下降沿触发中断”而 PGOOD 信号正常保持在高电平。谁会把 PGOOD 拉低那一定是对应通道掉电了MCU 中断服务程序里立刻读回到 PMIC 的状态寄存器把电压异常通道锁定下来打印到日志再按优先级执行关闭外设、保存数据、进入安全模式这一系列动作。要特别提醒的是PGOOD 信号本身的开路输出可能导致边沿不够陡峭MCU 配置成内部上拉后一定要在外部额外加一颗 10kΩ 上拉到对应电压域不然在低电压域切换的瞬间电平变化可能根本触发不了 IOC 中断。3.3 用低功耗模式配合 PMIC 待机这一块是我觉得整套方案最出彩的部分。PIC18F45K42 的休眠电流极低空载时可以做到 1μA 级别但 PMIC 本身即使所有通道关闭静态功耗也并没有完全归零。所以我在设计系统“关机”状态时不仅让 MCU 进入休眠同时把 PCA9422 的每一路输出都通过 I2C 显式关闭并用一个 GPIO 控制外部负载开关把 PMIC 自身带了但当前不用的外围彻底断电。实测下来系统休眠态的整机电流从 PMIC 空载的 12μA 降到 3μA 左右。这个数字对于追求长续航的产品来说差别很大一年待机时间相当于多出了好几个月的容量。4. 软件链路设计从上电到动态调压的完整状态流硬件连接搭好接下来是重头戏从 MCU 复位到系统正常工作这一路上每一拍都是有讲究的。很多人开局就把 PMIC 寄存器配置得满满当当但实际运行起来才发现时序不对、配置被覆盖很狼狈。我花了两个晚上把状态流理清楚这里分享给大家。4.1 上电启动不要“一把梭”式地打开所有输出很多人初始化时会写类似 “一次性把所有通道使能寄存器写 0xFF” 这种代码我看一次就想阻止一次。多路电源一起开输入侧瞬间电流尖峰会非常可怕尤其是输入端如果有一颗大电容在充电尖峰可能触发 PMIC 的过流保护让整个启动流程闪断。正确做法是分三步MCU 先从 3.3V 待机供电启动此刻 PCA9422 的 VOUT1 已经在默认状态下处于开启PMIC 的默认配置应让主控供电轨始终在线MCU 通过 I2C 写入配置把 VOUT2 的电压设定、限流保护值、软启动时间分别配好然后单开 VOUT2等 VOUT2 的 PGOOD 确认后再配置并启动 VOUT3。每条通道之间至少留 5ms 的等待时间。这个间隔不是为了满足 PMIC 的硬性要求而是为了让输入电容有充足的时间补充电荷避免前一级升压电路被过大的瞬态电流拉着走。4.2 寄存器配置的持久性陷阱还有个大坑我差点踩进去PMIC 内的寄存器配置部分在每次上电后都有可能恢复默认值。如果你的电压设定是 1.2V而默认值是 1.0V那你必须在每次 MCU 复位后都重写一遍配置而不能假设“上电配过一次就永久生效”。我在代码里做了一个很简单的 CRC 校验方案把所有需要配置的寄存器值和配置长度打包放进 PIC18F45K42 内部的一片 Flash 模拟 EEPROM 区域。每次主程序启动的第一件事不是去配 PMIC而是先读回校验值如果校验通过就只下发最少需要的寄存器比如输出使能、电压微调如果校验失败就重新下发全部配置。这样做有一个额外的好处后续如果我要在供应链上换成另一批不同默认配置的 PMIC不需要改代码逻辑只需要更新配置表甚至可以通过外部校准指令动态修改配置表。4.3 动态调压按负载状态调整 VOUT2动态电压调节DVFS是这套方案最好玩的部分。 PCA9422 支持通过 I2C 动态调整输出电压那就没理由让系统永远跑在最高电压档位。我给 VOUT2 设置了两档状态高性能模式1.8V运行所有外设低功耗模式1.5V关闭模拟前端仅保留逻辑扫描功能切换逻辑放在 MCU 的 RTCC 定期唤醒里每 200ms 检查一次系统负载状态如果连续 10 次检测都处于低负载就把电压先降下来再进入休眠一旦检测到外部唤醒事件立即恢复到 1.8V 再唤醒外设。关键点是调压不能硬切。我在代码里特意在电压切换命令前插入了一段 100μs 的延时等 PMIC 内部 DAC 稳定后再继续操作。有的芯片支持“无缝切换”但我的实测数据显示没有这段等待时间调压瞬间 VOUT2 会掉 300mV 左右的电压尖峰足以让连接的传感器复位。下面是我调压部分的一个简化实现示例实际寄存器地址需要按你手里的芯片手册为准void set_vout2_voltage(uint8_t vout_code) { // 先确保 I2C 总线空闲 i2c_wait_idle(); // 读取当前电压配置判断是否已经存在目标值 uint8_t cur pmic_read_reg(PMIC_VOUT2_CFG); if (cur vout_code) return; // 设置新的输出电压 pmic_write_reg(PMIC_VOUT2_CFG, vout_code); // 等待 PMIC 内部稳压器稳定 __delay_us(100); // 读回确认带重试机制 uint8_t retry 0; do { uint8_t verify pmic_read_reg(PMIC_VOUT2_CFG); if (verify vout_code) break; retry; __delay_ms(1); } while (retry 5); }4.4 掉电保存利用 PMIC 的故障中断做数据保全电源管理系统的软件最怕的事情不是“电压偏低”而是“电压低了但软件不知道”。所以我在代码里专门设计了一个掉电保护流程PGOOD 中断触发 - 关闭非关键外设 - 把关键参数写入数据 Flash - 等 10ms 让写入完成 - 关闭全部输出 - 进入最低功耗休眠。其中写入数据 Flash 这步最耗时间但也是最不能省的。我实测下来PIC18F45K42 在 3.3V 供电下写入一个字节约需要 2ms写 16 个字节就是 30ms 左右PGOOD 掉电来临的时候你给我 30ms 是够用的。但如果你把大数据块一次性写进去时间不够数据就丢了。所以我会在系统运行期间持续把关键参数缓存在内部 RAM掉电中断里只做最后 10 字节的增量更新把耗时压到 30ms 以内。5. 调试过程中踩过的五个坑好的方案不是设计出来的是拿示波器一点点逼出来的。这套系统从第一批样机到最终定型我大概花了三周时间调试过程中踩的坑都挺典型的挑五个最有代表性的分享。5.1 I2C 总线挂死导致 PMIC 无响应我最早在调试中发现一个诡异问题PMC 的寄存器偶尔读回来全是 0xFF有时又是完全正确的值频率不固定。用逻辑分析仪抓 I2C 波形发现是在某个特定条件下MCU 的 I2C 外设会进入总线卡死状态SCL 停在低电平后续所有通信全部失效。排查过程是这样先怀疑是接线问题测量 SCL/SDA 波形上升沿比较缓判断可能上拉电阻太小。从 2.2kΩ 改到 10kΩ现象依旧。后来用示波器看到波形上有毛刺原来是板子上 PMIC 的开关节点干扰耦合到 I2C 线上。最终解决方式是把 I2C 信号线远离电感并且加了一组 100Ω 串联电阻把边沿振铃压下去。从那之后 I2C 通信再也没出过问题。这个坑的教训是I2C 总线的排查不要只盯着电气参数也可能是 PCB 上电磁干扰引起的电气问题。5.2 软启动时间设置太短导致限流误触发PCA9422 的软启动时间寄存器我一开始为了“让系统快速起来”把三路都设置成了最短档位。实测发现每次上电系统在半秒内必定触发过流保护。后来我用示波器量每一路的电流波形发现问题出在 VOUT2负载端有一颗很大的去耦电容为了滤除传感器供电噪声上电瞬间电容充电电流能达到 1.2A超过了通道限流值。把软启动时间加长到 2ms 之后充电电流峰值降到 400mA 以内系统上电再没过流。这是一个所有 PMIC 方案都很常见的矛盾软启动时间越长浪涌电流控制越好但启动越慢。我的建议是不要把时间设到最小除非你明确知道负载端的容性负载很小。5.3 动态调压瞬间引起的电压跌落上一节提到了我一开始调压没有插那 100μs 延时结果调压瞬间 VOUT2 出现 300mV 的毛刺。这个毛刺的时间极短普通万用表根本看不见只有示波器上的峰值捕捉能抓到。为了确认到底是芯片问题还是我操作问题我换了一把抓波形的姿势触发模式设为下降沿时基调到 200μs/格用短地线探头直接点测 VOUT2 反馈点附近。结果清晰看到切换瞬间先有一个极低电压尖峰随后缓慢回升到新目标。这个尖峰可能来自内部 DAC 在切换瞬间短暂下拉输出电压软件延时解决不了根本问题只能通过“先把目标电压向上微调一点再降到目标值”的方式来规避。5.4 负载阶跃测试发现的输出跌落做负载跳变测试时我用电子负载在 20mA 和 120mA 之间以 1kHz 方波切换发现 VOUT3 输出会出现一次 80mV 的下冲持续大约 200μs。这个幅度对 MCU 内核供电来说是可以接受的但我并不满意因为下冲期间系统可能跑在异常边界。起初怀疑反馈环路补偿不足但我手里这款 PMIC 是内置补偿的网络实际上没有太好的外部相位裕度调节手段。试了两种改法一是加大输出电容从 22μF 加到 47μF二是把远端采样点直接改到负载端而不是留在 PMIC 输出电容旁边。实测下来第二个方法收益更大输出下冲从 80mV 降到 35mV说明问题出在“采样点离负载太远”反馈没有及时感知到负载端真实电压。5.5 休眠态电流虚高漏电流排查系统做完之后测量休眠电流时发现一个很蛋疼的问题标称应该 3μA实际上量到了 23μA。逐项断开外设排查后发现是 PMIC 的一个输出通道在休眠态没有真正关闭——虽然使能寄存器已经写了“关”但外部的电平转换芯片仍然通过内部 ESD 二极管向内反向供电。解决方式是在 PCB 设计阶段就要意识到这个问题凡是外部有源器件直接挂在 PMIC 输出上的场景要么在输出串一个负载开关要么确保外部器件在所有状态下的地平面是干净的。我没有选择改板而是通过配置 PMIC 在待机模式下将对应通道切换到“高阻输出”模式从系统层面把所有漏电路径切断。6. 一些个人体会与后续扩展思路整套方案做下来我对“电源管理”这四个字的理解又深了一层它不是你选一台好的 PMIC也不是单纯写个 I2C 初始化就完事而是一个“硬件拓扑 状态机 异常处理”三者咬合的完整工程。硬件上PMIC 外围元件的选择直接影响系统的可靠性和效率我后期把电感和电容换过一次整机效率提升了约 6%这个收益在电池供电产品上非常可观软件上上电时序、动态调压、掉电保护这三段逻辑需要像处理业务代码一样认真设计我最后把状态机单独拆成了一个模块后续换 MCU 平台时可以直接复用。一个意外的收获是这套 PMIC MCU 的方案并不局限于单一产品。后来我在另一个设备上复用同一套硬件框架只是把三路输出的电压值按新负载重配了一次软件上稍微改了改调压策略就完成了电源部分的移植。所以如果大家手头正在做多路供电的嵌入式项目真的可以考虑用“一颗 PMIC 一颗自带模拟外设的 MCU”的组合来替换掉堆 LDO 的方案前期虽然多花一点学习成本但后续每次改板、每次调参你都会发现这笔投入是划算的。最后的最后如果你也打算这么弄记得先拿示波器好好测一下动态负载下的各路输出波形别急着上系统测试PMIC 这种带开关频率的电路很多隐患在静态测量下是完全看不见的。
返回列表