资讯动态

PCA9422与PIC18LF45K42的完整电源管理方案解析

发布时间:2026/10/24 1:35:15 来源:尧图企业网站定制
使用 PCA9422 和 PIC18LF45K42 实现完整电源管理最近一个项目里我需要给一块电池供电的便携设备做完整的电源管理。主控是 Microchip 的 PIC18LF45K42电源前端选了 NXP 的 PCA9422。折腾了大半个月从看数据手册到画板子再到调电踩了不少坑但最终把整套电源链路跑通了电池充电、路径管理、输出电压监控、低电量报警、掉电保存数据全部都由这两颗芯片配合完成。这篇文章就是把我整个设计思路、关键参数计算、实际操作步骤和排查经验整理出来希望能帮到正在做类似低功耗便携设备的朋友。先说下整体方案PCA9422 是一颗集成了充电管理、电源路径管理和多路 LDO 输出的 PMICPIC18LF45K42 是带 Core Independent PeripheralsCIP的低功耗 MCU。两者通过 I2C 通信MCU 负责读取 PCA9422 的状态寄存器、配置充电电流和电压阈值、根据电池电量控制外设供电。整套系统做下来最大的感受是芯片选型只是一半真正的难点在于怎么让 PMIC 和 MCU 的初始化时序配合好以及怎么把省电策略落到代码里。1. 项目概述与整体设计思路1.1 核心需求拆解这个项目源自一个手持式数据采集器使用单节锂电池供电系统电压标称 3.7V满电 4.2V放电截止 3.0V。需求的完整电源管理功能包括锂电池充电管理充电电流可配置要求支持预充、恒流、恒压三段式充电。电源路径管理适配器插入时系统优先由适配器供电同时给电池充电适配器拔出时无缝切换到电池供电。多路输出电压需要 3.3V 给 MCU 和传感器1.8V 给存储芯片还有一路可调的 2.5V 给模拟前端。电池电压监测和低电量预警MCU 能实时读取电池电压在低电量时触发报警并保存关键数据。低功耗设备大部分时间处于休眠状态MCU 休眠时整机电流必须控制在 10uA 以内。之所以选中 PCA9422是因为它把充电、路径管理和三路 LDO 全部集成在了一颗芯片里体积只有 4mm×4mm 的 QFN 封装对于紧凑型手持设备来说非常合适。而 PIC18LF45K42 则是因为它内部有可配置的逻辑单元CLC和多个通信模块可以用很少的外部元件完成电源状态判断、休眠唤醒等逻辑。1.2 为什么选择 PCA9422 PIC18LF45K42 的组合选型的时候也考虑过分离方案用一颗独立的充电管理芯片比如单节锂电充电 IC加上几颗 LDO再用分立 ADC 采集电池电压。但那样做的缺点很明显PCB 面积大、元件多、故障率高而且充电管理芯片和 LDO 之间的配合要靠硬件逻辑来实现。PCA9422 的优势在于它是 PMIC把所有电源功能都集成了和 MCU 之间只需要一组 I2C 引脚状态查询和配置全部走软件。PIC18LF45K42 则是这个级别的 MCU 里性价比很高的一款。它工作在 1.8V 至 3.6V 电压范围内部有 32KB Flash、2KB RAM支持多路 PWM 和 ADC最关键是它的休眠电流可以做到 1uA 以下非常适合电池设备。它还带着硬件触发的可配置逻辑单元可以用来做电源时序控制减少 MCU 的唤醒次数。有人可能会问为什么不直接用带无线功能的 SoC 来做电源管理其实这取决于产品定位。如果设备比较复杂需要和云平台交互那确实可以用高集成度的 SoC。但这个数据采集器重点是本地数据采集和存储不需要实时联网所以用一颗传统 MCU 加 PMIC 的组合反而更稳定也更容易过认证。1.3 系统框图与硬件构成整个系统的核心链路是这样的适配器5V/1A或者 USB 口作为外部输入。PCA9422 检测外部输入电压实现电源路径切换。PCA9422 内部集成的充电管理模块按照设定参数对电池充电。PCA9422 的三路 LDO 分别输出 3.3V、1.8V、2.5V。PIC18LF45K42 通过 I2C 读取 PCA9422 的状态控制外设电源的开关采集电池分压电压并处理中断和唤醒信号。硬件上最重要的几个外围元件电池连接到 PCA9422 的 BAT 引脚适配器连接到 VBUS 引脚三路 LDO 输出分别接入负载。PCA9422 还有一个开漏输出的中断引脚连接到 PIC18LF45K42 的 INT 引脚当充电完成或者电池电压低于阈值时PCA9422 会拉低中断引脚把 MCU 从休眠中唤醒。整体设计思路是让 PCA9422 承担所有模拟电源管理的工作MCU 只负责策略和状态处理。这样即使 MCU 跑飞了电源链路也不会立即崩溃充电管理依旧可以独立运行这在产品量产中是很重要的容错考虑。2. 核心配置与参数计算过程2.1 充电参数计算PCA9422 的充电电流是通过一个外部电阻 R_ISET 来设定的数据手册里给的公式是充电电流 (V_REF / R_ISET) × K其中 V_REF 是内部基准电压典型值为 0.8VK 是芯片内部的电流镜像系数。对于 PCA9422K 的典型值是 1000。因此如果我想设置 500mA 充电电流那么 R_ISET 0.8V / 0.5A × 1000 1600Ω。实际选型时我用了 1.6kΩ 的 1% 精度电阻实测充电电流在 495mA 到 505mA 之间精度满足要求。充电电压恒压阶段电压是通过 I2C 寄存器设置的PCA9422 支持从 3.6V 到 4.6V 的电池电压配置步进通常为 50mV。对于单节锂离子电池标准恒压充电电压为 4.2V我设置为 4.2V但这里有个工程细节如果电池是高压锂电池满电 4.35V 或 4.4V需要对应调整寄存器值否则会欠充或者过充。预充电流和截止电流也在寄存器里配置。预充电流一般设置为恒流充电电流的 10%即 50mA。截止电流设置为恒流充电电流的 10%即 50mA。当充电电流降到 50mA 时充电过程结束PCA9422 会置位充电完成标志同时拉低中断引脚。充电温度范围可以通过 NTC 电阻监测PCA9422 内部有电池温度监测功能。我在电池上贴了一个 10kΩ 的 NTC配置为 0°C 至 45°C 充电允许范围。低于 0°C 或高于 45°C 时充电模块暂停避免电池损坏。2.2 输出电压配置与 LDO 选型PCA9422 内部集成三路 LDO每路的输出电压都可以通过 I2C 寄存器调节。LDO1 我配置为 3.3V 给 MCU、传感器和数字电路LDO2 配置为 1.8V 给外部 SPI Flash 和 EEPROMLDO3 配置为 2.5V 给模拟前端放大器。配置输出电压时要注意 LDO 的输入电压和压差。PCA9422 的 LDO 输入一般来自系统电压 VOUT_SYS电池或适配器在低电池电压时系统电压最低可能到 3.0V。LDO2 的输出是 1.8V压差约 1.2V在输出电流小于 200mA 时完全没问题。LDO3 输出 2.5V压差只需要 0.5V即使电池在 3.0V 时也能勉强维持。但 LDO1 输出 3.3V 就有点尴尬如果电池电压只有 3.3VLDO 就会进入 dropout 状态输出电压会随电池下降而下降。因此对于 3.3V 输出我实际上使用的是 PCA9422 内部的 VOUT_SYS 路径而不是 LDO1或者把 LDO1 配置为旁路模式。这里需要注意数据手册里的详细说明部分芯片可以通过寄存器把某个 LDO 设置为直通模式。在我的设计中MCU 实际上由 VOUT_SYS 直接供电而不是通过 LDO。VOUT_SYS 是 PCA9422 内部电源路径切换后的系统输出在适配器插入时等于适配器电压减去内部开关压降在拔掉适配器时等于电池电压。由于 PIC18LF45K42 的工作电压范围是 1.8V 至 3.6V直接用电池供电3.0V 至 4.2V完全可行这样还省掉了一路 LDO 的功耗。LDO1 则用来给对电压纹波敏感的传感器供电通过寄存器输出稳定的 3.3V但要注意当电池电压低于 3.5V 时LDO1 的输出会开始下降因此我让 MCU 在检测到电池电压低于 3.5V 时关闭传感器电源从而避免传感器工作在不正常电压下。2.3 I2C 通信与寄存器映射PCA9422 的 I2C 从设备地址是 0x107 位地址支持标准模式100kHz和快速模式400kHz。我用的是 400kHz注意上拉电阻选用 2.2kΩ因为总线速率较高。PCA9422 的寄存器主要分为几类系统状态寄存器电源路径状态、充电状态、中断标志。充电控制寄存器充电使能、恒压电压、充电电流倍率、截止电流。LDO 控制寄存器输出电压选择、使能、软启动时间。中断掩码寄存器控制哪些中断源会触发 INT 引脚。PIC18LF45K42 的 MSSP 模块配置为 I2C 主模式波特率发生器设置为 400kHz。这里有一个容易踩的坑PIC18LF45K42 默认的时钟源是内部 HFINTOSC1MHz但需要把系统时钟调到 16MHz 以上才能精确产生 400kHz I2C 时序。我最后把 FOSC 配置为 16MHzI2C 时钟寄存器计算为 BRG((FOSC/4)/FCLK)-1 ((16M/4)/400k)-1 9实际写入 9通信稳定。读取电池电压时PCA9422 内部有 10 位 ADC监测电池分压后的电压。寄存器读取结果需要乘以一个比例系数转换成实际电压。我在驱动代码里定义了一个函数read_battery_mv()返回毫伏整数方便上层逻辑使用。2.4 低功耗策略的削减方案在低功耗产品里功耗预算必须具体到每个元器件。PCA9422 本身在静态模式下的功耗大约是 20uA因具体配置而异三路 LDO 即使空载也存在静态电流这对于休眠状态来说偏大。所以我的休眠策略是在休眠时关闭 LDO2 和 LDO3只保留 LDO1 或者 VOUT_SYS 给 MCU 供电。将 PCA9422 置于低功耗模式如果芯片支持或者通过配置关闭非必要功能。MCU 休眠前将 I2C 引脚设置为高阻输入并关闭内部上拉避免漏电。使用外部中断唤醒PCA9422 的中断引脚在电池电压低于设定阈值或者充电状态变化时产生下降沿MCU 通过 INT 引脚唤醒。实测在 VOUT_SYS 直接给 MCU 供电、两路 LDO 关闭的情况下休眠电流大约为 6uA含 PCA9422 静态电流和 MCU 休眠电流满足设计要求。如果要求更低的功耗可以选择在休眠时彻底切断 PCA9422 的输入用一个 MOSFET 开关控制 PMIC 电源但这样做的代价是充电管理也会停止不太适合需要长期充电的场景所以我保留了现在的方案。3. 实操过程与关键代码实现3.1 硬件连接与 PCB 设计注意事项先说明硬件布局。PCA9422 是 QFN 封装底部有散热焊盘必须焊接良好这个焊盘我接到了 PCB 的地平面。PCB 走线的关键点是电池正极到 BAT 引脚的走线尽量宽至少 1mm避免充电电流引起的压降。适配器输入 VBUS 和 VBUS_SENSE 走线也要宽并且要加 10uF 和 0.1uF 去耦电容。三路 LDO 输出端各自放置 1uF 陶瓷电容并联 0.1uF 电容陶瓷电容选 X7R 材质温度特性好。去耦电容要靠近对应引脚放置否则高频噪声没法滤除。PCA9422 的电源路径切换非常简单芯片自动检测 VBUS 电压如果 VBUS 高于电池电压则优先使用 VBUS 给系统供电同时给电池充电如果 VBUS 低于电池或者消失则自动切换到电池。这个过程在芯片内部完成不需要 MCU 参与。但有一点需要注意从 VBUS 切换到 VBAT 的过程中VOUT_SYS 上可能产生一个短暂的下冲。我们实测大约有 50us 的掉压幅度约 300mV。如果负载对电压中断很敏感比如 MCU 的供电就需要在 VOUT_SYS 附近加大电容。我在实际电路里放了 100uF 钽电容并联 0.1uF 陶瓷电容掉压幅度降到了 80mV 以内完全不影响 MCU 运行。PIC18LF45K42 的复位电路用内部的 Power-up TimerPWRT和 BORBrown-out Reset就足够了。BOR 电压设置为 1.8V这样即使电池电压瞬间跌落只要没有跌破 1.8VMCU 不会复位防止数据丢失。3.2 MCU 初始化流程PIC18LF45K42 的初始化流程一定要明确顺序尤其是电源管理系统的初始化顺序错了可能导致充电状态误判或者 I2C 通信失败。我总结的推荐顺序切换系统时钟到 16MHz启动内部振荡器稳定。配置 I2C 引脚RC3/SCL、RC4/SDA为开漏输出开启 2.2kΩ 外部上拉。初始化 I2C 主机模块设置波特率。复位 PCA9422首先往 PCA9422 的系统控制寄存器写入软件复位命令让 PMIC 恢复默认配置防止二次上电时出现残留状态。读取 PCA9422 的芯片 ID 寄存器确认通信成功。配置充电参数设置恒压电压为 4.2V恒流电流倍率、预充电流和截止电流。使能充电模块。配置 LDO 输出电压并使能。配置中断掩码使能电池电压低阈值中断、充电完成中断、电源路径切换中断。清空中断标志然后进入主循环。初始化过程中最需要注意的是复位操作。PCA9422 在上电后默认是关断状态还是特定状态必须参考数据手册。我这个型号上电后默认输出是关断的因此如果不做任何配置MCU 将无法获得电源。所以我把 PCA9422 的默认输出配置为 VOUT_SYS 始终使能这样即使 MCU 还没有来得及配置系统也能先跑起来。具体做法是在 PCA9422 的电源配置寄存器里设置一个默认的优先级这部分需要仔细看寄存器说明但大方向是对的。3.3 驱动代码框架示例我这里写一个简化的 I2C 读写和配置流程用的 PIC18LF45K42 的 MSSP 标准库函数不是具体的编译工程主要展示逻辑结构方便移植到你熟悉的 HAL 层。// 写 PCA9422 寄存器 void PCA9422_WriteReg(uint8_t reg, uint8_t val) { I2C_Start(); I2C_Write(0x10 1 | 0); // 写地址 I2C_Write(reg); I2C_Write(val); I2C_Stop(); } // 读 PCA9422 寄存器 uint8_t PCA9422_ReadReg(uint8_t reg) { uint8_t val; I2C_Start(); I2C_Write(0x10 1 | 0); // 写地址 I2C_Write(reg); I2C_Start(); // 重复起始 I2C_Write(0x10 1 | 1); // 读地址 val I2C_Read(); I2C_Stop(); return val; } void Power_Init(void) { PCA9422_WriteReg(0x01, 0x80); // 软件复位 Delay_ms(10); PCA9422_WriteReg(0x02, 0x00); // 清除中断标志 PCA9422_WriteReg(0x10, 0x32); // 配置充电恒压4.2V, step 50mV PCA9422_WriteReg(0x11, 0x0A); // 配置充电电流 500mA PCA9422_WriteReg(0x12, 0x05); // 配置预充电流 50mA PCA9422_WriteReg(0x13, 0x05); // 配置截止电流 50mA PCA9422_WriteReg(0x20, 0x0F); // LDO1 3.3V, enable PCA9422_WriteReg(0x21, 0x0C); // LDO2 1.8V, enable PCA9422_WriteReg(0x22, 0x0E); // LDO3 2.5V, enable PCA9422_WriteReg(0x30, 0x03); // 使能充电, 使能电源路径 PCA9422_WriteReg(0x31, 0x1C); // 中断掩码 }实际使用时每个寄存器的地址和位定义必须根据芯片数据手册核对不同批次可能会有细微差别。我这里只是为了解释流程直接搬用可能不可用。3.4 电池电压读取与低电量判断电池电压读取的硬件结构是PCA9422 内部通过 ADC 采样 BAT 引脚电压并把结果放在两个寄存器中。MCU 通过 I2C 读取这两个寄存器组合成一个 16 位数据。然后根据芯片手册给出的比例公式转换为实际电压。示例转换代码uint16_t read_battery_mv(void) { uint8_t msb PCA9422_ReadReg(0x40); uint8_t lsb PCA9422_ReadReg(0x41); uint16_t raw ((msb 0x03) 8) | lsb; // 10-bit // 假设参考电压为 VREF比例系数为 K // 需要根据 PCA9422 具体特性校准下面是我实际用的线性公式 uint32_t mv ((uint32_t)raw * 4700) / 1023; // 示例参数 return (uint16_t)mv; }注意 ADC 参考电压和分压比例必须校准。实际产品在产线测试时我会用精密电源给电池端子加已知电压然后调整比例系数保存到 MCU 的 EEPROM 或 Flash 中。在没有校准的情况下ADC 读数可能会和实际电压偏差几十毫伏这对低电量判断来说可能不够精确。我的经验是先用万用表测出电池在不同电量下的静态电压然后在程序里建立一张粗略的电量-电压对照表比如 4.2V/100%、3.7V/50%、3.5V/20%、3.3V/5% 等并用滞后区间比如 3.6V 触发低电量3.8V 恢复消除低压来滤除抖动。低电量处理机制的实现是PCA9422 的电池电压阈值寄存器可以设定两个阈值一个高阈值一个低阈值。当电池电压低于低阈值时PCA9422 会置位相应中断标志并拉低 INT 引脚。MCU 在休眠中通过 INT 唤醒然后进入低电量处理流程把当前采集的数据写入非易失存储关闭非必要外设然后进入深度休眠直到检测到适配器插入事件再唤醒。3.5 掉电保护与数据保存在设计数据采集器时掉电瞬间的数据保存是刚需。我的实现方案分两级第一级硬件级掉电检测。利用 PCA9422 的 VBUS 状态中断当外部适配器拔掉时PCA9422 会检测到 VBUS 电压下降并产生中断。这个中断比电池电压跌落早了大概几十毫秒可以给 MCU 足够的时间去保存数据。第二级软件级掉电处理。在 MCU 收到掉电中断后立即停止采集将 FIFO 中的数据写入外部 SPI Flash然后等待电压稳定或者进入休眠。由于写入 SPI Flash 的时间大约 100ms而系统大电容可以支撑 300ms 以上的运行时间整机平均电流 30mA 时100uF 电容算下来并不足所以我加了超级电容具体电容值后面给所以掉电保存是完全可行的。我实际使用的掉电后备电容是 1F 的超级电容并联在 VOUT_SYS 和 GND 之间在整机负载 50mA 情况下从 4.2V 降到 3.0V 需要的时间大约为 t C × ΔU / I 1F × 1.2V / 0.05A 24 秒足够保存多次数据。这个超级电容同时也让电池在切换瞬间更平稳。如果你的设备不需要长时间保存也可以用 200mF 左右的电容缩小体积。4. 常见问题排查与避坑指南4.1 调试 I2C 通信的实战技巧I2C 通信问题是我这次调试过程中最先遇到的。一开始 PCA9422 怎么都不应答后来发现是 PCA9422 的地址设置引脚没接正确。PCA9422 部分型号允许通过外部引脚改变 I2C 地址如果你把地址设置引脚悬空了内部上拉可能导致地址变成了 0x12 而不是 0x10。解决办法是找到引脚说明明确设置地址电平。另外PIC18LF45K42 的 MSSP 在 I2C 主模式下如果总线上有其他设备抢占了时钟或者 SCL 被拉低就会导致 ARB 错误。我调试时用逻辑分析仪抓波形发现 SCL 信号有毛刺原因是 SCL 引脚的外部上拉电阻选得太小1kΩ 和 SDA 一起接 1k导致边沿过冲。后来将两个上拉都换成 2.2kΩ波形明显改善。建议 I2C 上拉大小根据总线上器件的数量和各器件漏电流综合决定一般 2.2kΩ~4.7kΩ 之间是安全的。还有一个非常容易遗漏的点PCA9422 的 I2C 地址是 7 位地址但有些参考代码用的是 8 位地址左移一位在 I2C 读写时一定要清楚你的 HAL 函数传参到底是 7 位还是 8 位。我吃过亏原来是传了 0x20 作为 8 位地址但设备地址实际是 0x10导致总是 NACK。后来统一约定所有底层函数都接受 7 位地址然后在读写内部自动左移。4.2 充电电流不达标的排查方向如果你配置了 500mA 充电电流但实际电流只有 200mA除了 R_ISET 电阻还要检查以下几个因素USB 输入限流如果外部适配器源电流能力不足PCA9422 的输入限流会限制充电电流。查一下 VBUS 电压是否被拉低到 4.5V 以下。PCB 走线电阻电池引脚和输入引脚的走线长度过长或过细会产生 IR 压降使采样电阻上的电压失真。电池连接器接触电阻手持设备中电池弹片可能会氧化导致接触电阻大充电电流下降。最好用开尔文接线方式把电池电压检测和电流路径分开。温度限制充电温度监测 NTC 如果检测到温度偏高充电电流会自动减小。我调试时把 NTC 放在电池旁边结果夏天外壳温度传导给电池导致充电电流降低到 300mA后来重新布局 NTC 位置才解决。排查时我的习惯是先测 PCA9422 的 VOUT_SYS 电压和 VBUS 电压再用示波器看 BAT 引脚波形接着用热像仪看 PCB 是否有局部过热。这样逐步缩小问题范围。4.3 休眠电流偏高的元凶休眠电流实测 6uA比理论值高了一点经过排查发现是 LDO3 虽然软件关断了但实际还有关断后漏电流。另外PCA9422 的中断引脚挂了一个 LED 指示灯LED 在休眠时处于高阻状态但 MCU 的 GPIO 配置为普通输出高电平导致微安级别的漏电。解决方法是把所有 GPIO 在休眠前统一设置为模拟输入或者高阻态并关闭弱上拉。还有一个功耗大坑是 I2C 总线的上拉电阻。上拉电阻一端接 3.3V另一端接 SDA/SCL就算没有任何传输电阻也在消耗电流。2.2kΩ 上拉在 3.3V 下的静态电流是 1.5mA这在休眠时是致命的影响。我后来把上拉电阻接到了 MCU 的一个 GPIO 上休眠时把这个 GPIO 设置为低电平断开上拉的供电从而把电流降到 0。注意这个 GPIO 在休眠前需要设为输入低电平并且不消耗电流否则又会引入漏电路径。更好的做法是电源管理芯片或者 MCU 内部有可控上拉但如果没有外部切换供电是一个省电的好办法。4.4 掉电保存时 Flash 写入失败这个问题出现的频率不高但一旦出现就会导致数据丢失。原因是在掉电瞬间电源电压不稳定MCU 的 Flash 写入模块可能因为电压低于工作下限而进入不可靠状态。解决方法是利用 BOR 中断PIC18LF45K42 的 BOR 模块可以设定一个阈值当电压低于阈值时进入中断在中断里保存数据。掉电中断优先于所有外设在外设中断里先禁止其他中断确保掉电处理过程不被干扰。数据保存在 Flash 之前把 Flash 写入操作放在 RAM 里的临时缓冲等电压稳定后再写。还有一个技巧用超级电容将掉电保护时间延长后MCU 可以检测到 VBUS 掉电但等待 500ms 后确认电压确实下降再保存这样可以防止适配器接触不良导致的误触发。4.5 PCA9422 寄存器丢失问题在某些复位场景下PCA9422 的寄存器值会恢复为默认值导致充电电流或者输出电压突变。这种情况通常发生在上电时序异常或者软件复位。解决办法是每次 MCU 启动时不管是否正常上电都执行一次全寄存器写入即把配置参数完整地重新刷一遍。同时如果系统中的负荷可能引起 PCA9422 电源电压瞬间跌落需要考虑掉电检测来触发重新配置。我在实际代码里每次唤醒后都会调用Power_Init()只不过初始化部分会有条件判断如果 I2C 读到的芯片 ID 和上次写入的校验值不匹配就重新写入所有寄存器如果匹配则跳过配置步骤。这样既保证安全性也减少无谓的 I2C 写入时间。5. 系统调试与验证方法5.1 上电时序测试电源管理电路的验证必须从最基础的电压时序开始。上电时先给适配器供电用示波器同时测量 VBUS、VOUT_SYS、LDO1/2/3 的电压观察它们是否按照正确顺序上升。PCA9422 支持内部上电时序控制通过配置寄存器可以设置 LDO 的使能顺序。我这边要求 MCU 先上电因此 VOUT_SYS 先有效然后 LDO1 使能LDO2 和 LDO3 在 MCU 初始化完成后通过 I2C 再使能。实测各电压上升时间间隔约 1ms满足系统要求。如果发现某个 LDO 没有输出应立即断电检查 I2C 配置是否正确因为 LDO 默认是关断的。用示波器看 LDO 输出引脚是否短接到地这是一个常见焊错引脚的问题。5.2 负载电流与效率验证用电子负载分别模拟三路输出逐步增加负载电流记录 VOUT_SYS 的波动。我测试到总负载 300mA 时VOUT_SYS 纹波为 20mV 左右处于可接受水平。如果纹波太大检查输出电容的 ESR陶瓷电容要选低 ESR 的 X7R而不要用 Y5V。另外充电效率也是需要关注的。在电池电压 3.7V、充电电流 500mA 时充电功率 1.85W而从 VBUS 输入的功率约 2.5W效率约 74%这符合一般线性充电效率范围。如果效率过低检查 BAT 引脚和 GND 之间的压降。5.3 长时间老化与烤机测试电源管理芯片在长时间充电时温度会上升。我将设备放在 45°C 环境箱里通过 I2C 实时读取芯片内部温度寄存器如果 PCA9422 有温度传感器并观察充电状态是否异常。另外还要做一次循环充放电测试用电子负载把电池放电到 3.0V然后充电到 4.2V记录电压变化曲线验证预充、恒流、恒压、截止个阶段是否正确。我循环了 20 次没有出现漂移说明充电参数稳定。烤机测试是检验低功耗策略的最好方式。我把设备充满电后断开适配器让设备进入休眠模式每 10 秒唤醒一次采集数据并写 Flash记录电池电压下降曲线。结果从 4.2V 降到 3.5V 持续了三天多说明整机平均功耗确实很低。当然这个结果和唤醒频率、每次唤醒工作时间有很大关系需要根据产品应用需求调整。5.4 校准 ADC 电池电压PCA9422 的 ADC 虽然内部实现了但实际精度受温度、基准电压影响。如果产品追求电量百分比准确必须在产线上做两点校准。我采取的方法是在出厂测试时给电池端子分别加 4.0V 和 3.6V 两个校准点然后用串口或者 I2C 命令让 MCU 读取 ADC 原始值计算出比例系数和偏移量并存入 Flash。下一次启动时MCU 自动加载校准参数。校准后的误差可以控制在 ±30mV 以内这对于电量百分比显示已经足够了。如果不想做多点校准也可以直接用 PCA9422 内部的标志位来判断低电量。对于很多产品而言电池电压低于 3.3V 就关机高于 3.5V 才开机中间有 200mV 的滞回区间这种简单策略在实践中也足够可靠。6. 最后分享一点实际经验整套系统调通之后我最大的体会是电源管理设计表面上是一个硬件问题本质上是硬件与软件的协同博弈。PCA9422 提供了丰富的寄存器配置但这既是便利也是陷阱。如果你不去深入理解每一个默认值背后的含义就会出现“手册上写着默认能输出 3.3V但是实际上板子没输出”这种困惑。我建议在画板子之前先把 PCA9422 的数据手册中关于上电默认状态、寄存器复位值、中断行为这些章节打印出来用荧光笔标记好再着手设计电路和写驱动。另外PIC18LF45K42 的可配置逻辑单元CLC在这次项目里起到了锦上添花的作用。我用 CLC 把 PCA9422 的充电状态引脚和 MCU 的某个定时器输入连接实现了充电完成事件的硬件触发。这样 MCU 在休眠时不需要频繁轮询 I2C只需要在 CLC 触发的中断里处理充电完成事件。如果你的 MCU 也有类似的可配置逻辑不妨好好利用可以省掉不少软件开销。还有一个很容易被忽略的点PCA9422 的 GND 引脚必须直接连接到系统的模拟地而 LDO 的负载地应该单点连接到 PCB 主地避免充电电流在地平面上造成大的压降影响 MCU 的 ADC 参考电压。我第一版 PCB 就是因为地平面处理不当导致电池电压 ADC 读数在充电时跳动了 20mV后来重新铺铜才解决。最后想提醒的就是电源管理芯片的失效模式比 MCU 抽象得多一旦有异常先拆掉所有负载单独给 PCA9422 上电用示波器量各个引脚波形一步步排除。这种排查方式虽然慢但往往能最快找到问题。我这次遇到的一个 LDO 输出电压不稳定的问题最后发现是反馈电容焊错了位置跟芯片本身没有任何关系。所以当你怀疑芯片有问题时先对照数据手册的引脚图检查焊接、周边元件、PCB 走线这三个方面基本能解决 80% 的问题。另外建议在工程版本里留下一个调试 UART 口用来打印 PCA9422 的寄存器状态。我在调试时用串口发命令读取所有寄存器值和手册对比找出不正常的位域。这个在量产固件里可以关闭但在开发阶段特别管用。目前这套方案已经稳定运行在几块工程样板上后续我打算根据实际温度漂移进一步优化充电电压的温度补偿系数并且把电量计算从纯电压查表升级为库仑计因为在低负载或脉冲负载时电压法估算的误差可能会达到 10% 以上。如果后续有精力我也计划把 PCA9422 的驱动封装成更通用的库支持不同 MCU 平台方便以后做其他电池产品直接复用。如果这篇文章能帮助你在 PCA9422 和 PIC18LF45K42 上少走一些弯路那它就达到了目的。如果你在实际调试中也遇到过奇怪的电源问题欢迎交流我大概率也踩过那个坑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑