ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PCA9422与PIC18F86J50低功耗电源管理方案设计

PCA9422与PIC18F86J50低功耗电源管理方案设计

1. 项目缘起与整体设计思路

嵌入式设备做电源管理,最怕的就是“各管各的”——MCU 自己跑自己的,充电芯片自己充自己的,电量计自己算自己的,最后系统一休眠,谁也叫不醒谁,功耗还下不来。我接手过好几个便携式数据采集终端的项目,几乎都卡在这个问题上:主控用的是 PIC18F86J50,电源部分一开始想用分立方案搭,结果光是充电状态机、电量计量、低功耗唤醒这几块逻辑,就把板子面积和固件复杂度都推上去了。

后来换成 PCA9422 这颗电源管理芯片来配合 PIC18F86J50,整个电源域的架构才真正清晰起来。PCA9422 是那种“把充电、升压、降压、电量计量、看门狗、I2C 控制全部塞进一颗芯片”的 PMIC,而 PIC18F86J50 本身带 I2C 主控、带纳瓦级低功耗管理、带比较器和中断唤醒,两者搭在一起,正好能覆盖从“插上适配器充电”到“电池供电运行”再到“深度休眠唤醒”的完整链路。

这个项目的核心目标很明确:用一颗 PMIC 加一颗低功耗 MCU,实现一套完整的电源管理方案,包括充电管理、多路电源输出、电量监测、低功耗模式切换和异常保护。适合谁来参考?如果你正在做便携式仪器、手持终端、电池供电的工业传感器节点,或者你手头有 PIC18 平台又不想在电源部分堆一堆分立器件,这套组合会很有参考价值。哪怕你用的是别的 MCU,只要带 I2C 主机和外部中断,思路也是通的。

整体设计上,我选择 PCA9422 而不是分立方案,理由有三点。第一,集成度高,充电器、Boost、Buck、LDO、电量计全集成,外围只需要电感、电容和少量电阻,PCB 面积能省下至少三分之一。第二,I2C 接口让 MCU 可以实时读取充电状态、电池电压、电流、温度,甚至能动态调整充电电流和输出电压,这在分立方案里要额外加 ADC 和采样电路才能做到。第三,PCA9422 自带看门狗和复位逻辑,MCU 死机时能强制断电重启,这对无人值守的终端设备来说太重要了。

PIC18F86J50 这边,我主要用它的三个能力:I2C 主机接口用来配置和读取 PCA9422;外部中断和比较器用来响应 PMIC 的中断输出,比如充电完成、电池低电量、按键唤醒;纳瓦级低功耗技术让 MCU 在休眠时电流降到几百纳安,同时还能被 PMIC 的中断唤醒。整个系统的电源状态机就围绕这两颗芯片的交互来设计,后面我会把状态机、寄存器配置、实测数据都拆开讲。

2. 核心器件解析与选型考量

2.1 PCA9422 的关键特性与引脚功能

PCA9422 是一颗面向低功耗便携设备的电源管理 IC,输入支持 USB 适配器和单节锂离子电池,内部集成了线性充电器、同步升压转换器、同步降压转换器、LDO、电量计和 I2C 控制接口。我选它主要看中几个参数:充电电流可编程范围从 10mA 到 500mA,升压输出固定 5V 或可调,降压输出可调范围覆盖 1.2V 到 3.3V,LDO 输出可以给实时时钟或传感器供电。电量计部分用的是电压加电流的混合计量方式,虽然精度不如库仑计,但对于显示“剩余电量百分比”和“低电量预警”来说完全够用。

引脚方面,PCA9422 的封装是 QFN24,引脚密度不低,布线时要注意散热焊盘必须接地。关键引脚包括:VBUS 接适配器输入,VBAT 接电池,SW_BOOST 和 SW_BUCK 分别接升压和降压电感,SDA/SCL 接 I2C 总线,INT 是中断输出,CE 是充电使能,STAT 是充电状态指示。我实际用下来,最容易出问题的是 SW_BOOST 和 SW_BUCK 的走线,必须短而粗,电感要选低直流电阻的屏蔽电感,否则升压效率会明显下降。

2.2 PIC18F86J50 的低功耗与通信资源

PIC18F86J50 是 8 位 MCU 里比较适合做电源管理主控的一颗,它有 64KB Flash、3936 字节 RAM,自带 I2C、SPI、UART,还有 12 位 ADC 和两个比较器。我选它的原因不是性能,而是它的低功耗模式做得很细:有 Idle 模式、Sleep 模式、Deep Sleep 模式,Deep Sleep 下典型电流只有 50nA 左右,而且可以被外部中断、RTCC 闹钟、比较器输出唤醒。这意味着系统在待机时可以让 MCU 几乎不耗电,只靠 PCA9422 维持实时时钟和电池监测,需要工作时再唤醒 MCU。

I2C 接口方面,PIC18F86J50 支持主控模式,最高速率 400kHz,用来读写 PCA9422 的寄存器绰绰有余。我一般把 I2C 速率设在 100kHz,虽然慢一点,但抗干扰更好,走线长一点也没问题。外部中断引脚我接的是 PCA9422 的 INT 输出,配置成下降沿触发,这样 PMIC 有事件时能立刻唤醒 MCU。比较器我用来监测电池电压,设定一个阈值,低于阈值时直接触发中断,不用 MCU 轮询。

2.3 为什么不用分立方案:成本、面积与可靠性对比

很多人会问,充电芯片加升压芯片加降压芯片加电量计,分立方案不是更便宜吗?我一开始也是这么想的,但实际算下来,分立方案在中小批量下并不省钱。一颗充电 IC 加一颗 Boost 加一颗 Buck 加一颗电量计,四颗芯片的 BOM 成本加起来可能比 PCA9422 便宜一点点,但外围的电感、电容、电阻数量翻倍,PCB 面积至少多出 40%,而且固件要分别驱动四颗芯片,开发周期拉长。更关键的是,分立方案的各颗芯片之间没有协同,比如充电时升压和降压的使能顺序、低电量时各路输出的关断逻辑,都要 MCU 自己协调,一旦 MCU 死机,整个电源系统就失控了。

PCA9422 把这些逻辑都集成在内部,MCU 只需要通过 I2C 配置一次,之后 PMIC 自己就能处理充电状态机、输出使能顺序和异常保护。我实测下来,集成方案的待机功耗比分立方案低 30% 左右,因为 PMIC 内部的低功耗状态机比 MCU 轮询要省电得多。可靠性方面,PCA9422 自带看门狗,MCU 超过设定时间不喂狗,PMIC 会直接复位 MCU 甚至切断输出,这在工业现场非常实用。

3. 硬件设计与关键参数计算

3.1 电源树规划与各路输出分配

整个系统的电源树是这样的:VBUS 输入 5V,一路进 PCA9422 的充电器给电池充电,另一路进升压转换器,升压输出 5V 给外设供电。电池电压范围 3.0V 到 4.2V,进降压转换器,降压输出 3.3V 给 PIC18F86J50 和传感器供电。LDO 输出 1.8V 给实时时钟和低功耗传感器。这样分配的原因是:MCU 和数字传感器需要稳定的 3.3V,用降压比用 LDO 效率高得多;外设比如显示屏背光需要 5V,用升压从电池升上去;实时时钟功耗极低,用 LDO 供电可以避免降压转换器的开关噪声影响。

这里有个细节要注意:PCA9422 的升压和降压不能同时从电池取电,因为电池放电电流有限。我的做法是,当 VBUS 存在时,升压直接从 VBUS 取电,降压从 VBUS 经过充电器后的系统电压取电;当 VBUS 移除时,升压和降压都从电池取电,但 MCU 会通过 I2C 把升压输出的电流限制调低,优先保证 3.3V 降压输出的供电。这个逻辑在固件里实现,后面会讲。

3.2 充电电流与电感选型计算

充电电流的设定取决于电池容量和适配器能力。假设电池容量是 2000mAh,按 0.5C 充电,充电电流设 1000mA,但 PCA9422 最大支持 500mA,所以实际设 500mA。充电电流由 I2C 寄存器配置,公式是 I_CHG = (V_SET / R_ISET) × 系数,具体系数查数据手册。我一般先用 500mA 快充,当电池电压达到 4.0V 后切换到 100mA 涓流充电,这个切换由 PCA9422 内部状态机自动完成,不需要 MCU 干预。

电感选型方面,升压电感我选 4.7μH,饱和电流至少 1.5A,直流电阻小于 50mΩ。降压电感选 2.2μH,饱和电流 1A,直流电阻小于 80mΩ。为什么选这些值?升压转换器开关频率是 1.5MHz,根据公式 L = (V_IN × (V_OUT - V_IN)) / (ΔI_L × f_SW × V_OUT),代入 VBUS=5V、V_OUT=5V 时占空比接近 50%,实际算下来 4.7μH 能保证纹波电流在 300mA 以内。降压转换器开关频率 2MHz,输入 4.2V 输出 3.3V,2.2μH 对应纹波电流约 200mA,都在合理范围。

3.3 I2C 总线上拉电阻与走线注意事项

I2C 总线的上拉电阻我选 4.7kΩ,接在 3.3V 上。为什么不是 2.2kΩ 或 10kΩ?因为总线电容估算下来大约 100pF,走线长度 10cm 以内,4.7kΩ 对应的上升时间约 1μs,在 100kHz 速率下绰绰有余。如果上拉太小,功耗会增加;上拉太大,上升沿变缓,高速通信会出错。走线方面,SDA 和 SCL 要尽量平行走,远离升压电感和开关节点,否则开关噪声会耦合到 I2C 总线上,导致通信误码。我吃过这个亏,后来在 SDA/SCL 旁边加了地线屏蔽,问题才解决。

另外,PCA9422 的 INT 引脚是开漏输出,也要加上拉电阻,我同样用 4.7kΩ。INT 信号走线要短,直接连到 PIC18F86J50 的外部中断引脚,中间不要经过任何缓冲器,否则唤醒延迟会增加。

4. 固件架构与状态机实现

4.1 电源状态定义与切换条件

整个系统的电源状态我定义了五个:充电状态、满电状态、电池供电状态、低电量状态、休眠状态。充电状态是 VBUS 存在且电池未满,此时 MCU 正常工作,PMIC 以 500mA 充电。满电状态是充电电流降到 50mA 以下,PMIC 产生中断,MCU 读取状态后把充电电流设为 0,进入满电待机。电池供电状态是 VBUS 移除,系统从电池取电,MCU 根据任务需求决定是否进入休眠。低电量状态是电池电压低于 3.4V,PMIC 产生中断,MCU 关闭非必要外设,降低主频,准备休眠。休眠状态是 MCU 进入 Deep Sleep,PMIC 保持实时时钟和电池监测,等待中断唤醒。

状态切换的条件都写在固件的中断服务程序里。比如充电完成中断,MCU 读取 PCA9422 的充电状态寄存器,确认是“充电完成”后,把系统状态从充电切换到满电。电池低电量中断,MCU 读取电池电压寄存器,确认低于阈值后,切换到低电量状态。这里要注意,中断服务程序里不要做太多事情,我一般只置一个标志位,具体处理放在主循环里,避免中断嵌套和响应延迟。

4.2 I2C 驱动与 PCA9422 寄存器配置流程

PIC18F86J50 的 I2C 驱动我用的是 MCC 生成的代码,但做了优化。初始化流程是:设置 I2C 时钟为 100kHz,使能 I2C 模块,配置 SDA 和 SCL 引脚为开漏输出。读写 PCA9422 寄存器的函数我封装成两个:PCA9422_WriteReg 和 PCA9422_ReadReg,内部处理起始条件、地址发送、寄存器地址发送、数据收发和停止条件。这里有个坑,PCA9422 的 I2C 地址是 7 位,写地址是 0x60,读地址是 0x61,如果搞错了,通信会一直失败。

配置流程我按顺序来:先配置充电参数,包括充电电流、充电电压、涓流阈值;再配置升压输出,设置输出电压和电流限制;然后配置降压输出,设置输出电压和使能;最后配置中断使能,打开充电完成、电池低电量、看门狗超时等中断。每一步配置完都要读回寄存器验证,确保写入成功。我实测下来,PCA9422 的寄存器写入后需要至少 1ms 的稳定时间,连续写多个寄存器时要在中间加延时,否则后面的写入会失败。

4.3 中断处理与低功耗唤醒逻辑

中断处理是低功耗设计的核心。PIC18F86J50 进入 Deep Sleep 前,要先把不用的外设关掉,把 I2C 引脚设为输入,避免漏电。然后使能外部中断,配置为下降沿触发,对应 PCA9422 的 INT 引脚。最后执行 SLEEP 指令,MCU 进入休眠。当 PMIC 有事件时,INT 引脚拉低,MCU 被唤醒,进入中断服务程序。中断服务程序里先清除中断标志,然后读取 PCA9422 的中断状态寄存器,判断是哪种事件,置对应的标志位,最后返回主循环处理。

这里有个细节:PCA9422 的中断是锁存型的,读取中断状态寄存器后会自动清除,所以中断服务程序里必须读一次,否则下次中断不会触发。我一开始没注意,导致唤醒后只能响应一次中断,后来查了数据手册才发现这个问题。另外,唤醒后 MCU 需要重新初始化 I2C 和系统时钟,因为 Deep Sleep 会关闭这些模块,我一般把初始化代码放在唤醒后的第一段执行。

5. 实操过程与实测数据记录

5.1 硬件焊接与上电检查步骤

焊接顺序我建议先焊 PCA9422 和 PIC18F86J50,再焊外围的小电阻电容,最后焊电感和连接器。PCA9422 的 QFN 封装底部有散热焊盘,必须用热风枪均匀加热,焊膏要涂够,否则虚焊会导致芯片不工作。焊完后先用万用表测各路电源对地阻抗,确认没有短路。然后上电,先不装电池,只接 VBUS,测 PCA9422 的 VBUS 引脚电压是否正常,再测升压输出和降压输出是否正常。如果升压输出不对,先检查电感是否焊好,再检查 SW_BOOST 引脚是否有开关波形。

我踩过的坑是,第一次焊接时 QFN 底部焊盘没接地,导致芯片发热严重,充电电流上不去。后来重新植球焊接,问题解决。所以 QFN 封装一定要确保底部焊盘可靠接地,最好在 PCB 上开几个过孔到地平面,增加散热和接地效果。

5.2 充电与放电实测数据

实测数据我记录了一组:电池容量 2000mAh,初始电压 3.6V,接上 5V 适配器,充电电流设为 500mA。充电开始后,电流稳定在 498mA,电池电压从 3.6V 缓慢上升,大约 2 小时后达到 4.1V,充电电流开始下降,进入恒压阶段。再经过 30 分钟,电流降到 50mA 以下,PCA9422 产生充电完成中断。整个过程电池温度从 25°C 升到 38°C,在可接受范围内。

放电测试时,系统正常运行,MCU 主频 16MHz,外设全开,电池从 4.2V 放电到 3.4V,耗时约 3 小时 20 分钟。然后进入低功耗模式,MCU 休眠,只保留实时时钟和电池监测,放电电流从 120mA 降到 80μA,电池从 3.4V 放到 3.0V 用了将近 48 小时。这个数据说明,低功耗模式下的待机时间远大于运行时间,对于间歇工作的终端设备来说非常合适。

5.3 低功耗模式电流实测与优化

低功耗电流实测我用了高精度电流表,串联在电池和 PCA9422 的 VBAT 引脚之间。MCU 进入 Deep Sleep 后,整体电流是 80μA,其中 PCA9422 自身消耗约 50μA,MCU 消耗约 20μA,外围电路漏电约 10μA。为了进一步降低,我把 PCA9422 的实时时钟输出关掉,只保留电池电压监测,电流降到 60μA。再把 MCU 的未使用引脚全部设为输出低电平,避免浮空输入漏电,电流降到 45μA。

优化过程中发现,I2C 上拉电阻在休眠时仍然有电流流过,因为 SDA 和 SCL 被外部上拉拉高,而 MCU 引脚设为输入时内部没有下拉。我的做法是在休眠前把 I2C 引脚设为输出低电平,这样上拉电阻两端都是低电平,没有电流。但这样会影响 PCA9422 的 I2C 通信,所以唤醒后要立刻恢复。这个技巧在数据手册里没写,是我实测摸索出来的。

6. 常见问题与排查技巧实录

6.1 I2C 通信失败排查流程

I2C 通信失败是最常见的问题,排查步骤我整理成表格:

现象可能原因排查方法解决方法
完全无应答地址错误用逻辑分析仪抓波形确认写地址 0x60,读地址 0x61
偶尔应答上拉电阻过大测上升时间换 4.7kΩ 或更小
数据错误走线受干扰检查走线是否靠近电感加地线屏蔽,远离开关节点
写入后读回不对稳定时间不够示波器看时序写入后加 1ms 延时

我遇到过一次,I2C 通信时好时坏,后来用逻辑分析仪抓波形,发现 SCL 上升沿有振铃,原因是上拉电阻 10kΩ 太大,换成 4.7kΩ 后波形干净,通信稳定。所以 I2C 调试一定要用逻辑分析仪,光靠万用表是看不出问题的。

6.2 充电异常与电池保护处理

充电异常主要有三种:充电电流上不去、充电不停止、电池过放。充电电流上不去,先检查适配器能力,再看 PCA9422 的充电电流寄存器是否配置正确,最后检查电池温度是否过高触发保护。充电不停止,一般是充电完成阈值设得太高,或者电池老化导致充不满,我一般把充电完成电流设为 50mA,如果还不行就换电池。电池过放,是低电量保护没做好,PCA9422 有欠压锁定,但阈值要配置正确,我设的是 2.8V,低于这个值就切断输出,保护电池。

这里有个经验:锂电池不要每次都充到 4.2V,长期满电会加速老化。我在固件里设了一个选项,用户可以选“长寿命模式”,充电到 4.0V 就停止,虽然容量少了一点,但电池循环寿命能延长一倍。这个功能通过 I2C 配置 PCA9422 的充电电压寄存器实现,很简单但很实用。

6.3 休眠唤醒失败与看门狗复位问题

休眠唤醒失败,最常见的原因是中断配置不对。PIC18F86J50 的外部中断有多个引脚,要确认用的是哪个,中断使能位和标志位都要设置正确。另外,PCA9422 的 INT 引脚是开漏输出,上拉电阻不能少,否则中断信号拉不高,MCU 检测不到。我遇到过唤醒后 MCU 跑飞的情况,后来发现是休眠前没有关掉看门狗,MCU 休眠时看门狗还在跑,超时后复位了。解决方法是在休眠前喂一次狗,然后关掉看门狗,唤醒后再打开。

看门狗复位问题,PCA9422 的看门狗是独立于 MCU 的,MCU 正常运行时定期通过 I2C 喂狗,如果 MCU 死机,超过设定时间不喂狗,PCA9422 会复位 MCU。这个功能很好用,但要注意喂狗周期不能太短,否则 MCU 忙于喂狗影响正常任务。我一般设 2 秒喂一次,看门狗超时设 5 秒,留足余量。

7. 个人实操心得与后续扩展方向

这套方案我前后调了三个月,踩了不少坑,也总结了一些数据手册上不会写的经验。第一个心得是,PCA9422 的寄存器配置一定要按顺序来,先配充电再配输出,最后配中断,顺序错了会出现配置不生效的情况。第二个心得是,低功耗优化不要只盯着 MCU,PMIC 自身的功耗也很关键,把不用的功能关掉,能省不少电。第三个心得是,I2C 通信的稳定性比速率更重要,100kHz 足够用,不要盲目追求 400kHz。

后续扩展的话,可以考虑加一颗外部EEPROM 存储电池历史数据,比如循环次数、最大充电电流、最高温度,这样能更准确地评估电池健康状态。还可以把 PCA9422 的中断输出接到 MCU 的多个引脚,实现不同事件的快速响应,不用每次都读寄存器。另外,如果系统需要多路输出,PCA9422 的 LDO 可以给传感器单独供电,通过 I2C 动态开关,进一步降低待机功耗。

最后分享一个小技巧:调试电源管理时,一定要用可编程电子负载模拟电池,这样可以精确控制电池电压和电流,比用真实电池方便得多。我用的电子负载可以设置电池内阻,模拟不同老化程度的电池,对测试低电量保护和充电状态机非常有帮助。这个投入对于做电源管理的团队来说,绝对值得。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进