首页 / 资讯中心 / 文章详情

PCA9422 PMIC + PIC18F65K40 MCU 便携设备电源管理方案详解

PCA9422 PMIC + PIC18F65K40 MCU 便携设备电源管理方案详解 ★ FEATURED ARTICLE
做项目最怕的不是功能做不出来而是做完了电量一天都撑不住。最近刚把一套便携式采集设备的主电源管理搭完核心就两片东西PCA9422 这颗 PMIC 负责充电、多路供电和监控PIC18F65K40 这颗 MCU 负责管策略、跑逻辑。整个方案做下来从充电到放电、从开机到休眠、从正常到异常算是把电源管理闭环完整打通了。这篇就把选型逻辑、电源树设计、寄存器配置、固件状态机和调试踩坑全过一遍正在做可穿戴、手持仪表、电池供电 IoT 设备的朋友可以拿来当参考。这套组合不复杂但细节非常多我尽量把容易忽略的地方都指出来。1. 方案怎么定下来的PCA9422 与 PIC18F65K40 的角色分工1.1 PCA9422 到底管哪些事开门见山PCA9422 是一颗面向便携设备的小封装 PMIC集成的功能很对路线性充电、电源路径管理、多路 DC-DC 输出、ADC 采样和 I2C 配置。对一块锂电池供电的板子来说它一个人就顶掉了充电管理芯片加独立 Buck/LDO 加采样前端这一堆东西。具体到这颗芯片常用功能块大致是一个充电通路支持 USB 5V 输入充电电流可配两路降压 Buck 输出输出电压可以通过 DVS 动态调节一路 LDO一个负载开关再加上片内的 10 位 ADC可以采输入电压、电池电压、充电电流和芯片温度。还要注意它有一组出厂默认电压配置也就是说 MCU 还没跑代码的时候板子已经能上电了。这个特性对外设初始化顺序有帮助但也意味着你得提前确认默认电压是否符合负载需求不然上电瞬间就可能把某个 1.8V 器件怼到 3.3V 上。选这颗 PMIC 而不是用分立器件搭最大的原因就是省心。自己用 MOS 管、采样电阻、运放做电池路径管理光调试就要花掉两周而且低温漂、低功耗很难同时满足。PCA9422 把误差放大、比较器、状态机都做进了片子内部软件只需要写寄存器出了问题也好定位。1.2 PIC18F65K40 为什么够用PIC18F65K40 是 8 位 MCU 里性价比偏高的一颗。做电源管理需要什么稳定的 I2C 主机、低功耗休眠、快的启动、够多的 IO 去控制负载开关和接收故障信号。这几样它都占了。它的 I2C 模块是硬件 MSSP可以工作在主机模式读写 PMIC 寄存器基本不费 CPU内部振荡器上电就能跑几十毫秒内完成配置休眠电流也低配合看门狗可以定期唤醒做一次电量巡检。这颗 MCU 还带硬件滤波和计算功能的 ADCADCC以及可配置逻辑单元CLC。我后面把电池电压分压信号接在 ADC 上让它在硬件层做平均和阈值比较超过阈值再触发中断唤醒 CPU。这样 CPU 平时不用持续采样真正做到了“只在有事的时候醒”。另外这颗 MCU 自带一段数据 EEPROM我用来存电量校准系数和故障日志。掉电恢复后系统可以快速回到上次的电量状态而不是每次都要重新学习一遍电池行为。这个功能在量产维护时特别好用。1.3 整体电源树怎么设计这套系统的负载大致分成三类MCU 本体、无线模组、传感器和显示屏。三类负载对电源需求差异很明显负载类型电压需求特点MCU 和低功耗传感器3.3V 常供电流小但要求纹波低无线模组1.8V 逻辑电发射瞬间电流大需要低阻抗通路显示 / 背光3.3V可整体关断不带电时彻底断电所以电源树设计成USB 5V 进来之后直接进 PCA9422由 PCA9422 输出三路——Buck1 给 3.3V 常电Buck2 给 1.8V 的逻辑电LDO 给模拟前端负载开关单独控制显示供电。PIC18F65K40 自己挂在 3.3V 常电上同时用一个 GPIO 接 PMIC 的中断输出再用一根 I2C 总线读取 PMIC 的状态寄存器。这个结构的好处是所有电源路径都在 PMIC 内部MCU 只需要通过寄存器操作就能切换状态不用一大堆 MOS 管搭离散电路。坏处也明显一旦 PMIC 的寄存器配置出错整个板子就跟“死”了一样。所以后面我会重点讲初始化时序和保护逻辑这部分是把这套方案用稳的关键。2. 核心细节每一路电源怎么搭、怎么配2.1 输入与充电通路输入部分最要注意的是 USB 插入和拔出的瞬态。PCA9422 内部是线性充电优点是省掉了功率电感缺点是充电电流越大发热越大。我们板子的充电电流设在 450mA 左右实测充电时 PMIC 表面温度在可接受范围。如果你想把充电电流提得更高一定要评估 PCB 铺铜散热不然热折返会把电流悄悄降下来实际充电时间会远长于预期。充电通路还有一个重要的点系统供电可以直接走输入而不是先充进电池再放出来。这样即使电池没电只要 USB 插着系统也能启动。这个特性对升级固件特别关键——不然电池亏电时板子根本开不了机。充电过程本质上是先恒流、再恒压、最后截止电流判断PCA9422 内部已经把这些阶段处理好了我们需要关心的就是设置合规的充电电流和截止电压。关于充电参数建议至少配这几个充电截止电压按电池规格书常见 4.2V 或者 4.35V别设错。充电电流兼顾发热和充电时间我习惯先在室温下评估散热再定。输入电流限制如果前端是电脑 USB 口别超过 500mA否则会触发源端保护。这里有一个容易忽略的细节电池温度检测。PCA9422 支持温度采样如果电池没有自带 NTC温度功能要屏蔽掉否则芯片会误认为电池过温把充电电流压到很低甚至停止充电。我遇到过一台设备插上充电器完全没电流排查到最后就是温度检测脚悬空导致的。2.2 Buck/LDO 输出分配与动态调压Buck 输出的每个电压点都需要在寄存器里指定。我习惯先把需求列一张表再去配寄存器负载电压需求分配模块备注MCU / 数字传感器3.3VBuck1常电纹波要求高无线模组 / 存储1.8VBuck2大电流瞬态模拟前端 / 参考电压3.0VLDO低噪声显示 / 背光3.3V负载开关可关断Buck 输出电压一般不是直接填目标电压而是写对应的电压选择寄存器位组合。这里面最容易踩的坑是改动某个 Buck 输出后要确认另一路 Buck 是不是被联动影响了有些 PMIC 为了省引脚电压配置位是共用或者有交叉依赖的。我的做法是每次改配置后立刻回读寄存器用回读值和期望值比对配置校验不过就重试三次。还有一个很实用的功能是 DVS 动态调压。无线模组在接收态和工作态对电压要求不一样我让 Buck2 在待机时切到低电压档发射时再切回额定电压。这个动作只需要写寄存器切换速度足够快关键是切换时序要避开发射瞬间不然电压还没稳住模组已经开始拉大电流就会造成跌落。2.3 I2C 寄存器配置顺序PMIC 上电默认状态能跑但要把系统跑好必须按顺序改写寄存器。我总结了一套顺序先配 Buck/LDO 电压再配充电参数再开 ADC 和中断最后才让系统进入正常运行。为什么是这个顺序因为如果还没设好电压就先把大负载通路打开Buck 可能带着默认电压给负载供电瞬间电流会把输出拉垮甚至触发 PMIC 的过流保护锁定。反过来如果先把中断全开了再配电压配置过程中产生的假故障中断会干扰主流程。顺序这件事配置类芯片都一样先建立稳定的“环境”再处理“事件”。还有一个细节I2C 读写封装要做得稳因为 PMIC 并不总是准备好。MCU 刚上电时 PMIC 可能在忙内部初始化这时候去读写会拿到无应答。我在每次开机配置前都会先读一次状态寄存器确认 PMIC 的握手位正确了才往下走。I2C 总线上拉电阻也要算好上拉太弱在快速模式会出错太强会增大功耗我一般选 2.2kΩ 到 4.7kΩ 之间具体看两边器件的总线电容和通信速率。2.4 PCB 布局与器件选型Buck 的电感最不能省。不是随便拿个电感就完事饱和电流要留足裕量尤其无线模组发射瞬间电流可达几百毫安电感一旦饱和输出电压会直接垮掉。电感 DCR 影响效率在追求续航的设备里尽量选低 DCR、封装大一点的型号。PMIC 的散热焊盘一定要铺接地铜箔并打过孔线性充电的损耗就是靠这个散热。去耦电容要靠近芯片引脚放不要隔了老远接一根细线否则高频开关电流会在走线寄生电感上产生压降纹波直接超标。分压电阻采样电池电压时建议选用 1% 甚至 0.5% 精度。电池电压采样误差一个百分点对容量估算影响很大后面电量显示会不准软件再怎么校准都救不回来。布局上还要注意反馈走线。Buck 输出到负载的走线要短粗反馈采样点要单独从输出电容端拉回来不要经过大电流回路否则采样到的电压会被负载电流的压降污染。我见过一块板子输出电容放得很远反馈线绕了大半圈结果负载一上去电压就掉 200mV系统不断复位。3. 实操过程固件怎么把整套系统跑起来3.1 初始化流程与 I2C 封装先看 I2C 读写封装的思路。PIC18F65K40 的 MSSP 模块在主机模式下读寄存器的流程是“先写寄存器地址再重新发起起始条件读数据”。我写成两个基础函数#define PMIC_I2C_ADDR 0x66 // 括号实际地址以芯片手册为准 uint8_t pca9422_read_reg(uint8_t reg) { uint8_t val 0; // 1. 发送起始写从机地址W等待地址应答 // 2. 发送寄存器地址等待应答 // 3. 重新发起起始写从机地址R // 4. 读一字节主设备发NACK后停止 // 5. 返回 val return val; } void pca9422_write_reg(uint8_t reg, uint8_t val) { // 1. 发送起始写从机地址W // 2. 发送寄存器地址 // 3. 发送 val // 4. 停止 // 5. 每步都检查应答位失败则置错误标志 }这个封装要带的细节是每次读写后检查总线状态寄存器如果出现 NACK 要主动发停止位避免总线卡死。如果换了 I2C 速率要重新计算波特率寄存器我实测 400kHz 快速模式在短走线上很稳定但线长或者总线上有其他负载时降到 100kHz 更省心稳定性比速度重要。初始化函数按“先电压、再充电、后保护”的顺序执行void pmic_init(void) { if (!wait_pmic_ready()) { // 连续读不到握手位进入错误处理 return; } pmic_set_buck1(3300); // 3.3V pmic_set_buck2(1800); // 1.8V pmic_set_ldo(3000); // 3.0V pmic_set_charge_current(450); pmic_set_charge_voltage(4200); pmic_enable_adc(); pmic_enable_interrupts(); // 回读全部关键寄存器做校验 if (!pmic_verify_config()) { system_alert(FAULT_PMIC_CFG); } }回读校验这一段千万别省。寄存器写入偶尔会因为总线干扰失败如果没有回读MCU 以为设置成功了实际 PMIC 还跑在默认电压上后期问题排查会异常痛苦。3.2 电源状态机设计整个系统的电源状态我划分成五态上电复位、正常运行、轻负载待机、深度睡眠、异常保护。每个状态对应一组 PCA9422 的输出配置状态Buck1Buck2LDO负载开关MCU正常运行3.3V1.8V3.0V开全速运行轻负载待机3.3V低电压档3.0V关降频深度睡眠3.3V 低功耗关3.0V关休眠异常保护按故障类型关断关保留关记录故障状态切换要防“抖动”电池电压在边界来回波动时不要让系统在睡眠和运行之间疯狂切换。我加了迟滞判断低于 3.0V 进入睡眠要回到 3.2V 才允许唤醒运行。这个迟滞窗口大小不是拍脑袋定的要参考电池放电曲线的平台区既不能太宽导致正常用户等太久也不能太窄导致振荡。状态机里还要处理“唤醒源优先级”。比如插上 USB 充电器、按键、电量阈值、看门狗定时器都可能唤醒 MCU。唤醒后首先要判断当前电池电压和充电状态如果充电器已插入就算电量低也可以进入正常运行因为系统供电走的是输入通路不会把电池抽干。3.3 电量采集与保护逻辑电量监控我用了两条路PCA9422 内部 ADC 采电池电压和充电电流PIC18F65K40 自己的 ADC 采外部电池分压。两条路互相印证发现差值超过 100mV 就报异常。如果内部采样和外部分压差距过大说明分压网络或 PCB 走线有问题早发现比后期数据漂移好处理。软件计电量我用的不是纯电压法而是“电压法加库仑累计修正”的折中方案。因为 PCA9422 能读到充电电流我在充电时精确累计充入电量放电时用电压曲线估算剩余容量每次充满电以后把累计值清零重新学习。这样比单纯查表准又不至于为了做电量计单独加一颗芯片。过放保护是软件加硬件的组合。PCA9422 有电压比较和中断输出我把它配置成电池电压低于阈值时拉中断MCU 收到中断后在主循环里做最后的保存并进入低功耗。注意不要在中断服务里做太多事我见过同事在 ISR 里写 Flash结果写一半电压就没了数据也废了。正确做法是 ISR 只设置标志保存数据这类耗时操作放到主循环统一处理。3.4 低功耗协同设计设备不工作时整机电流要做到 uA 级光靠 MCU 进休眠不够必须让 PMIC 大部分模块也停掉。深度睡眠状态下我把两路 Buck 全关只留一路低功耗 LDO 给 MCU 供电MCU 休眠时定期通过看门狗唤醒醒来用一次 I2C 快速读一遍 PMIC 状态没有事件再睡回去。这里有个坑I2C 在 MCU 和 PMIC 都进入低功耗后如果总线被拉低会导致两边都产生漏电流路径。我实测在深度睡眠前把 I2C 引脚全部配置成高阻输入并释放总线才把待机电流压下去。否则整机电流总是比理论值高几十微安别小看这几十微安对一块几百毫安时的电池来说长期待机差距非常可观。还有一点是关于看门狗周期的选择。唤醒巡检本身也要耗电每次唤醒、I2C 通信、再睡回去这个过程会消耗几百微安乘以几毫秒的能量。如果周期太短巡检耗电会超过待机省下的电周期太长又可能错过 PMIC 的故障中断。我最后取的是 2 秒周期实测巡检功耗占比可以忽略同时故障响应时间也在可接受范围。4. 常见问题与排查技巧实录4.1 上电读不到 PMIC 寄存器症状程序跑起来I2C 读寄存器一直返回 0xFF或者地址无应答。可能原因和排查思路总线没上拉或者上拉只加在了一侧。检查两个引脚是否都有上拉电阻阻值是否合理。从机地址配错PMIC 的地址引脚被拉错了电平。仔细看手册里地址引脚和 I2C 地址的映射关系。PMIC 还没完成上电复位MCU 读得太急。在初始化里先加一个准备等待流程。PIC 引脚默认往往是模拟输入要先在初始化里清掉对应 ANSEL 位配置成数字 IO 和 I2C 功能。排查时先用逻辑分析仪抓 I2C 波形确认起始条件、地址位和 NACK 位置。如果波形根本没有就去查引脚复用配置。这个顺序能快速把问题定位到“总线物理问题”还是“地址/时序问题”。4.2 输出电压偏低或纹波偏大症状系统跑起来偶发复位示波器看 Buck 输出在负载切换时有明显跌落。原因多半是电感饱和、输出电容不够、反馈分压回路走线太长。我遇到过一次是给无线模组供电的 Buck2 靠近电感的地方铺了一层地的隔离槽导致回流路径变长纹波变大。把地铜补齐、电容靠近引脚后波形立刻改善。还有一种情况是 PMIC 内部在轻载模式下会进入省电模式纹波本来就比重载大。如果负载处于临界区间可以在寄存器里强制固定 PWM 模式代价是轻载效率下降。实际取舍要看设备整天是跑在重载还是轻载不能一概而论。4.3 充电电流“缩水”症状配置 450mA 充电实测只有 300mA而且板子发热明显。这不是配置错了而是热折返保护介入。线性充电本质上就是个线性稳压器输入 5V、电池 4.2V压差 0.8V450mA 下损耗就有 360mW全部集中在 PMIC 封装上。温度上来之后芯片会主动降电流。解决方向加大铺铜、降低环境温度、或者接受慢充。对长时间户外设备我会把充电电流降到 350mA牺牲一点速度换稳定。这个现象在夏天户外测试时特别容易复现所以选充电电流时要按最高工作环境温度来评估而不是按室温。4.4 低功耗电流测不准低功耗电流用万用表电流档直接串进去很容易测不准因为表的输入端压降会改变电路状态。我习惯用“电池端串采样电阻加示波器看压降”的方式在电池正极串一个 10Ω 精密电阻用示波器测它两端压降换算成电流。不过这个方法要小心测量期间 MCU 周期性唤醒电流会在 10Ω 电阻上产生明显压降可能导致系统复位。所以做低功耗调试时先把电阻换成 0.1Ω确认功能正常再换回大电阻测基线电流。实测下来用这个方法能看到完整的唤醒周期波形比万用表上的平均读数直观得多。4.5 电压跌落导致配置丢失症状电池拆了再装上PMIC 的寄存器回到默认值MCU 里记着的输出电压和实际对不上。这类 PMIC 寄存器掉电后不保留需要 MCU 每次启动都重新配置这是设计上必须接受的。关键是“重新配置”的时机如果 MCU 跑得快、配置写完了但电池电压已经撑不住写入过程中掉电会让寄存器处于半配置状态系统行为无法预测。建议把关键配置做成“写入-回读-确认”流程并在配置完成前不要开大负载。另外配置完成后要把当前有效配置的校验值存到 MCU 的 EEPROM 里下次上电先比对一下能快速判断 PMIC 是不是跑在预期状态。4.6 问题速查表现象大概率原因优先排查动作I2C 无应答上拉缺失 / 地址错误 / 引脚复用错抓 I2C 波形查 ANSEL输出电压跌落电感饱和 / 输出电容不足 / 反馈走线长看瞬态波形检查布局充电电流偏小热折返 / 温度检测悬空测温度查 NTC 配置待机电流偏大I2C 总线拉低 / 巡检周期太短测漏电流路径调唤醒周期掉电后配置丢失寄存器易失 / 写入半途掉电加回读校验延迟保存时序最后再说一点个人体会。电源管理这类活代码其实不是大头难的是把各个模块之间的时间关系理顺PMIC 的复位时序、MCU 的启动时序、I2C 的握手时序、负载的电流瞬态哪一环乱套整个系统就像多米诺骨牌一样倒下。调试阶段我强烈建议把所有关键电源轨和 I2C 信号同时接到示波器或逻辑分析仪上把上电、休眠、唤醒、充电插入拔出这些事件一个个录下来。踩过几次坑之后你会发现绝大多数“诡异现象”最后都能在时序波形里找到答案。把时序吃透了这套方案后续做产品化基本就稳了。
阅读完成 · 觉得有帮助?
咨询建站