资讯动态

PCA9422+PIC32MZ:便携设备如何用PMIC实现精细电源管理

发布时间:2026/10/24 5:01:33 来源:尧图企业网站定制
前阵子把一个便携式数据采集项目从分立 LDO 方案改成 PMIC 方案才真正理解“完整电源管理”到底意味着什么。以前用一颗 MCU 加几路 LDO、再配一颗充电管理 IC电路板上一大片电源器件BOM 看着不贵但布局、调试、功耗优化都很吃力。后来换成 PCA9422 搭配 PIC32MZ1024EFK144把电池充电、路径管理、双路 DC-DC 和 MCU 侧电源状态控制统统收拢到一条 I2C 总线上整套系统的电源行为才真正可控了。这篇文章适合正在做电池供电设备、可穿戴产品、便携仪器或者想把 MCU 电源功耗做到“每一毫安都能解释”的开发者。内容会从选型思路、硬件电路、软件实现到实测调试一路讲下去直接给出可以放进项目里的经验做法。我尽量少写废话以实际踩坑和验证过程为主。1. 系统组成与设计思路1.1 PCA9422 的定位充电、路径管理与双路降压PCA9422 属于高度集成的电池电源管理芯片目标场景很明确一颗锂电池、一路 USB 或适配器输入、系统需要多路电源轨。它内部包含了线性充电器、输入电源路径管理、两路同步降压 DC-DC 转换器还有配套的 ADC 监测和中断输出。小封装里把主电源部分全包了这在可穿戴和便携设备里非常实用。先拆开看三块核心功能线性充电器负责给单节锂离子/锂聚合物电池充电支持预充、恒流、恒压、截止几个阶段。充电电压和充电电流可以通过 I2C 寄存器调整也可以用芯片出厂配置的 OTP 预设值。以我常用的参数为例充电截止电压设 4.2V预充电流 25mA 左右恒流阶段按电池容量设定小容量电池一般 100mA 到 200mA 就够。输入电源路径管理当外部电源比如 USB 的 5V 接入时芯片可以同时给系统供电和给电池充电外部电源断开时自动切到电池路径给系统供电。这个切换不是简单二极管“或”逻辑而是内部负载开关控制的低损耗路径所以压降比二极管方案小很多。两路同步降压转换器BUCK1 和 BUCK2输出由 OTP 或 I2C 配置。比如一路出 3.3V 给 MCU IO 和传感器另一路出 1.8V 给逻辑器件或者射频模组。两路都支持 DVS也就是动态调整输出电压配合 MCU 的负载变化可以做省电策略。这个组合解决了一个很实际的痛点在多电压域设备里以前需要“充电管理 IC 多颗 LDO/DC-DC 电源监控芯片”现在只要一颗 PCA9422 再配几个电容和两个电感就能完成几乎全部电源工作。同时它给 MCU 留了一个 I2C 从站接口所有电源状态都能被主控读取和改写这为后续做精细功耗管理铺好了路。1.2 PIC32MZ1024EFK144 的主控优势PIC32MZ1024EFK144 是 Microchip 家的高性能 32 位 MCU核心是运行在 200MHz 的 MIPS M-class 处理器带 1MB 闪存和 512KB RAM还有 ECC 错误检测纠正能力。这颗芯片主打工业、物联网、HMI 等领域外设非常丰富包括多路 UART、SPI、I2C、USB、CAN、ADC 和 DMA 控制器。选它做电源管理主控最主要的原因是三个方面一是外设接口足够多。电源管理需要一条 I2C 总线去访问 PCA9422同时还要留出中断输入引脚、充电状态指示 GPIO、电池温度检测 ADC 通道。PIC32MZ1024EFK144 的 144 引脚封装里 GPIO 非常充裕完全不会因为功能分配而牺牲其他业务接口。而且它的 I2C 外设支持 100kHz、400kHz 和 1MHz 模式和 PCA9422 的通信带宽完全够用。二是性能和功耗可以联动。200MHz 的性能对于数据处理、显示驱动、通信协议栈都能胜任而低负载时又可以切到更低主频或者进入休眠模式。配合 PCA9422 的 DVS 功能MCU 可以做到“重负载时跑高频、系统电压调高一点轻负载时降频降电压”整体功耗弹性很大。这种 CPU 性能和电源域协同调节的能力是普通低端 MCU 不具备的。三是开发闭环完整。Microchip 的 MPLAB Harmony 框架对 PIC32MZ 系列有完整的外设驱动支持I2C、DMA、中断库函数都可以直接生成初始化代码。PCA9422 的驱动只需要在 MCU 侧封装一层硬件抽象基于 Harmony 现有 I2C 驱动很快就能跑起来。当然即使不用 Harmony直接操作寄存器也不复杂关键点在于初始化 I2C 时钟和中断优先级这部分后面详细说。1.3 整体方案拓扑与工作模式把整个系统的电源拓扑画出来大概是这样的结构VBUS 5V ── PCA9422(VIN) ├── BUCK1 ── 3.3V ── PIC32MZ IO、传感器 ├── BUCK2 ── 1.8V ── 外设逻辑、存储 └── 充电路径 ── 锂电池 ── 系统备用电源 PIC32MZ1024EFK144 ├── I2C1_SCL ── PCA9422 SCL ├── I2C1_SDA ── PCA9422 SDA ├── GPIO_IRQ ── PCA9422 INT └── GPIO_VBUS ── USB 插入检测从拓扑可以看出MCU 和 PMIC 不是简单的“主从 I2C 设备”关系而是相互配合PCA9422 负责物理层面的电源转换和充电PIC32MZ 负责策略层面的电量评估、负载调度、充电参数设置和异常处理。系统有四个典型工作模式外部供电模式VBUS 接入PCA9422 通过输入路径同时给 BUCK 供电和给电池充电。此时如果电池电量较低充电电流优先保证系统运行再由剩余电流给电池补电。电池放电模式VBUS 断开PCA9422 自动切换到电池路径BUCK1/BUCK2 由电池供电。MCU 通过 I2C 读取电池电压、估算剩余电量并在电量不足时降低外设功耗或进入休眠。充电完成模式电池达到浮充电压充电截止但系统仍由外部电源正常供电。休眠/低功耗模式MCU 进入睡眠PCA9422 通过 OTP 默认配置维持低压差输出。如果 MCU 需要在唤醒瞬间快速恢复高频运行唤醒流程里就要先把 DVS 电压恢复再切高频。在设计初期就把这四种工作模式定义清楚后面写状态机、调硬件参数都会顺很多。我在第一版方案里就是没把“外部供电但电池没充满”和“外部供电且电池充满”分开处理导致后续低功耗判断逻辑绕来绕去改了好几次代码才理顺。2. 硬件电路引脚、网络与布局要点2.1 PCA9422 最小系统与关键外围元件PCA9422 的最小系统不算复杂但外围元件的选型直接影响充电效率和 DC-DC 纹波。我把每个关键引脚对应的外部器件和注意事项列一下。输入侧在 VBUS 引脚附近至少要放一颗 1uF 陶瓷电容和一个 100nF 高频去耦电容靠近芯片引脚放置。如果 USB 线比较长或者适配器质量一般输入还要增加 TVS 器件做浪涌保护同时输入电流限制可以通过 I2C 配置保护外部电源。电池侧 VBAT 引脚需要一颗 1uF 到 10uF 的陶瓷电容放在电池连接器后端。这里特别提醒电池不是理想电压源电池线的电阻和电感会导致芯片端电压波动所以电池检测电阻走线要尽量短粗避免出现“芯片端读到电池电压偏低”的问题。我踩过一次因为电池座弹簧接触电阻偏大导致充电截止电压总是提前触发最后处理方法是把充电截止电流调小并重新标定检测路径。BUCK1/BUCK2 输出侧的电感是核心元件。经验值选 1.0uH 到 2.2uH注意饱和电流要大于最大负载电流的 1.3 倍以上。输出电容建议 10uF 陶瓷为主再并一个 100nF 高频电容。开关节点 LX1 和 LX2 的走线要短避免辐射噪声串到相邻模拟电路。两路 BUCK 的反馈网络按 PCB 上是否有精确负载而决定要不要外部分压电阻PCA9422 支持内部设定和外部反馈配置建议尽量用内部设定减少分压电阻带来的偏差。TS 引脚用于电池温度监测外部接一颗 NTC 热敏电阻到地。这颗 NTC 的 B 值要和芯片温度阈值匹配一般 10k 或 100k NTC 是常见选择。如果没有温度监测需求可以固定一个电阻让芯片认为温度正常但我在实际项目中不建议这样做锂电池如果发生过充过热后果比较严重。宁可多做一路温度保护。2.2 与 PIC32MZ 的 I2C/中断/复位连接PCA9422 对外通信接口就是 I2C 从站有几个信号需要接到 PIC32MZ1024EFK144 上SCL、SDA、INT 中断输出、以及可选的外部复位/使能控制引脚。SCL 和 SDA 需要接上拉电阻典型值 2.2k 到 4.7k取决于 I2C 总线上挂了多少设备以及通信速率。总线上如果还挂了其他从机上拉电阻要统一计算确保上升沿满足时序规格。PIC32MZ1024EFK144 的 I2C1 引脚通过外设引脚选择PPS功能映射到具体 IO 口。比如可以把 SCL 映射到某个 RB 引脚、SDA 映射到另一个 RC 引脚配置时注意 PPS 的输入、输出方向要同时设置不能只配一边。还要确认映射的引脚没有被其他外设占用特别是 JTAG 和调试接口的默认引脚开发阶段容易冲突。INT 中断输出建议接到 PIC32MZ 的一个支持输入变化中断CN的引脚并在这个引脚上做内联上拉或者外部弱上拉。PCA9422 的 INT 是低有效开漏输出MCU 侧要配置为下降沿或低电平中断触发。因为 INT 可能会在充电状态变化、BUCK 欠压、输入插拔时拉低所以中断服务函数里一定要用 I2C 读取具体中断状态寄存器来区分事件种类而不是简单置一个标志位了事。如果系统需要更彻底的下电控制可以用一个 GPIO 控制 PCA9422 的使能或者复位输入。这样 MCU 可以在异常死机时强制关闭电源路径再重新启动。但不能滥用否则可能出现“系统自我复位但外部电源仍在供电”的混乱状态。比较好的做法是只有在下电时序明确时才控制该引脚正常跑业务时保持默认电平。2.3 电源布局中的去耦、电感与回流路径硬件设计最容易忽视的就是电源布局然而大部分充电异常、纹波超标、I2C 干扰问题都能追溯到布局。先讲大原则所有高频电流回路要短电源路径和信号路径要分开参考地要连续。PCA9422 下方的 PCB 布局我习惯按信号流分区块输入 VBUS 和大电容在左侧电池引脚和检测电阻在右侧BUCK1 和 BUCK2 的电感和输出电容各占一个区域I2C 和中断引脚走远离电感开关节点的信号层。这样可以避免 LX 节点的开关噪声耦合到 I2C 线和 TS 线上。电感的选择不只是看感值还要看谐振频率和屏蔽特性。我建议选一体成型功率电感屏蔽性好、漏磁少。如果为了省成本用绕线电感开关节点和电感本体尽量远离天线类电路。输出电容用 X5R 或 X7R 温漂特性好的陶瓷电容不要用 Y5V。地平面规划要特别注意“单点回流”思维。充电电流路径从 VBUS 经过芯片然后到电池放电路径从电池经过芯片到 BUCK 输出这些大电流路径不应该穿过 MCU 的信号地。我曾在一版 PCB 上因为电池负极走线绕到 I2C 总线上方导致通信偶尔出错后来把电池回流路径加宽并移开后才稳定。最后是所有去耦电容的接地过孔尽量靠近芯片 GND 引脚至少一个引脚对应一个过孔不能图省事几个引脚共享一个长走线。3. 软件框架与状态控制实现3.1 I2C 寄存器模型和开发准备拿到 PCA9422 的第一件事不是急着写业务代码而是先读一遍数据手册的寄存器映射表。里面会列清楚哪些寄存器是只读状态、哪些是可写配置、哪些需要先解锁才能修改。以我调试的经验以下这组寄存器类目是必须了解的芯片版本/ID 寄存器用于初始化时校验 I2C 通信是否正常。状态寄存器组包括充电状态、输入电源状态、BUCK 输出电压状态、故障状态。控制寄存器组用于配置输入电流限制、充电电压、充电电流、BUCK 电压、使能开关等。中断寄存器组包含中断标志和中断屏蔽位读取标志后一般需要写清除。在 MCU 侧开发我建议先封装一层pca9422_hal.c把所有 I2C 操作抽象成write_reg(addr, val)和read_reg(addr)两个基础函数后续业务代码不直接操作 I2C 驱动。底层 I2C 可以用 Harmony 生成的驱动也可以自己写寄存器版轮询驱动。轮询模式在低功耗场景下更可控而 DMA 模式在大量寄存器读写时效率更高但电源管理通常只是零星读写两者差别不大。设备地址要确认清楚。PCA9422 的 I2C 地址可能因为产品变体或者地址引脚设置不同产品型号后缀和引脚配置会决定最后一位地址。初始化第一步就是读 ID 寄存器如果读不回来先用逻辑分析仪看 SCL/SDA 波形确认是否有 ACK再排查地址位设置。我曾经在调试时把 7 位地址和 8 位地址搞混代码里左移一位没处理好总线上一直 NACK这种小问题最容易卡半天。3.2 初始化、配置与动态调压流程PCA9422 上电后不一定要等 MCU 起来才工作因为它有 OTP 预设配置。也就是说PCA9422 可以先靠出厂配置把 BUCK 输出拉到默认电压给 MCU 供电MCU 跑起来以后再通过 I2C 覆盖默认配置。这个机制特别重要因为它解耦了“芯片启动”和“应用初始化”的先后顺序。MCU 侧的标准初始化流程可以这样写配置 I2C1 引脚复用、时钟速率 400kHz。读取 PCA9422 ID 和当前状态判断 I2C 通路正常。写入输入电流限制比如 USB 场景设 100mA 到 500mA 之间。配置充电电压、预充电流、恒流电流和截止电流。锂电池 4.2V 浮充是常见选择具体看电池规格。配置 BUCK1 目标电压为 3.3VBUCK2 目标电压为 1.8V打开两路输出使能。清除无效中断标志使能我们需要监听的中断源。读取一次完整状态核对配置是否生效。动态调压部分的逻辑稍微复杂。PIC32MZ 在运行状态下可能要跑 200MHz 高频也可能降频到几十 MHz。BUCK 输出虽然可以直接设为一个固定值但在轻负载时适当降低电压能省下可观的动态功耗。我不能每次 DVS 都频繁翻 I2C不然中断开销会把收益吃掉。更实际的做法是分成性能模式和省电模式两种档位在模式切换时通过 DMA 或快速 I2C 写一次电压寄存器。关键点BUCK 电压调整要等输出电压稳定再继续业务切换时如果负载突变很容易触发欠压保护。我一般在寄存器写入之后加一个短延时并读取状态寄存器确认没有欠压标志。延时长度不必很长几百微秒就够关键是要有这个确认步骤。3.3 中断驱动的电源状态机电源状态机是这个软件框架的核心。我采用一个简化但可靠的状态集合POWER_SOURCE_EXTERNAL、POWER_SOURCE_BATTERY、CHARGING、CHARGING_DONE、FAULT、SHUTDOWN。中断事件是状态机的主要驱动源。PIC32MZ 的 GPIO CN 中断触发后在中断服务函数里快速读取 PCA9422 的中断状态寄存器再根据事件类型投递到任务队列由主循环里的状态机统一处理。不要在中断服务函数里做耗时的 I2C 操作如果 I2C 底层是轮询模式那就更要避免在中断里长时间等待。举个例子当 VBUS 拔出时PCA9422 会切换到电池路径同时 INT 拉低。MCU 收到中断后读取状态寄存器发现输入电源丢失于是更新状态为电池供电模式。这个过程要做两件事第一记录当前电源来源第二向业务层发送事件比如提示降低屏幕亮度或关闭非关键外设。如果 VBUS 重新插入再走一遍输入恢复流程。充电状态变化也要走状态机。充电开始、预充、恒流、恒压、完成每个状态都可以在 I2C 状态寄存器里读到。比如充电完成中断触发后状态机把充电标志置为完成业务层可以据此显示“充电已完成”。如果电池电压因为自放电回落到阈值PCA9422 通常会重新启动充电INT 会再次触发状态机从充电完成回到充电中。这种自动回流特性导致状态机不能只靠单次中断置位主循环要周期性核对电源状态避免界面状态和实际充电状态不一致。3.4 低功耗与休眠协作低功耗场景是这套方案最有价值的地方。PIC32MZ1024EFK144 进入休眠时主时钟停振外设按需关闭功耗可以降得很低。但要想真正省电除了 MCU 本身进入休眠还要让 PCA9422 处于合适的工作模式。一种可行策略是MCU 休眠前先把 BUCK 输出降到低功耗档位。比如运行时 3.3V休眠时改为 2.5V虽然对 IO 供电有要求2.5V 对部分外部器件可能不够。所以更安全的做法是休眠时不需要的 BUCK2 直接关断BUCK1 保持供电但不做电压调整。如果外部传感器或存储器在休眠时可以断电那关断 BUCK2 省下的功耗非常可观。MCU 休眠期间PCA9422 的 INT 仍然可以工作比如充电完成、输入插拔、电池低电压都会触发中断。MCU 需要保留一个支持唤醒的 IO 引脚来接收 INT。我在实际项目里用的方案是PIC32MZ 睡眠模式下将 GPIO 配置为上升沿/下降沿唤醒源INT 引脚连接 PCA9422。当电池电压掉到阈值以下时PCA9422 触发 INTMCU 被唤醒读取状态后进入更深的系统级关机或者控制负载切换把非关键电路断开。还要注意休眠和 I2C 的时序关系。MCU 唤醒后第一件事可能就是从执行 I2C 读取状态但 PCA9422 此时如果没有进入正常工作模式I2C 可能响应的比较慢。建议 MCU 唤醒后先等待一小段时间再进行 I2C 访问避免总线上出现 NACK。我在调试时用逻辑分析仪看过多次睡眠前写寄存器没问题唤醒后马上读第一次偶尔失败加了 1ms 延时后全部通畅。4. 调试实测与常见问题4.1 关键实测波形与工具电源方案做得好不好光看软件不够必须实测。我的桌面常年放着示波器、电子负载、数控电源、逻辑分析仪和功耗分析仪。调试 PCA9422 时有几个关键测量点VBUS 输入波形观察输入电流是否限制稳定USB 插入瞬间是否有浪涌。BUCK 开关节点波形可以直观看到 DCDC 工作在 PWM 还是 PFM 省电模式。开关频率是否稳定导通脉宽是否随负载变化。输出电压纹波一般在 BUCK 输出电容后端测量探头要用短地线弹簧测量点尽量靠近芯片引脚和电容。电池电流用低值采样电阻加上差分探头或者干脆用电量计。我用功耗分析仪连成回路可以精确看到每个阶段的充电电流曲线。I2C 总线波形看 SCL 频率、数据毛刺、ACK/NACK 时序。示波器是主要工具开关节点波形能看出很多东西。PFM 模式下开关频率会随负载下降而降低这是正常的。如果 PWM 模式下纹波异常抬高就要检查电感和输出电容是否有问题。I2C 波形调试我一般用逻辑分析仪配协议解码插件比纯示波器效率高很多可以快速定位地址、寄存器、数据值。4.2 常见硬件/软件问题与排查我在调试这套电源方案时遇到过几类典型问题这里挑有代表性的说几个。第一类是充电电流为 0 或者不对。可能的原因包括输入电源连接不良、输入电流限制设置过小、电池电压已在浮充电压附近、温度保护触发、充电使能位被配置成关闭。排查思路是从输入电压开始一级一级往下看。用万用表量 VBUS 电压、芯片输入引脚电压再用 I2C 读状态寄存器看是否有输入电源 OK 标志。如果电池电压已经接近浮充电压充电电流自然会逐渐减小到截止这是正常现象不要误判为故障。第二类是 I2C 通信不稳定。常见原因是上拉电阻值不合适、总线上设备地址冲突、VREF 和 I2C 电平不匹配、板子布局导致信号受开关节点干扰。处理办法先用逻辑分析仪打开波形看 SCL 上升沿是否缓慢如果边沿很缓就把上拉电阻从 4.7k 换成 2.2k 试试。同时检查 PCB 上 I2C 走线是否跨过 LX 开关节点跨了的话改走线或用屏蔽地线包裹。如果 MCU 引脚配置了 PPS尤其要检查 SDA 的开漏配置忘记开漏会导致总线拉不出低电平。第三类是 BUCK 输出电压偏低且带载能力差。出现这种状况时先测电感饱和电流如果是饱和造成压降需要换成更大额定电流的电感。再看输出电容ESR 过大的电容会导致瞬态响应差。还有可能就是 BUCK 工作在 PFM 省电模式负载很轻时电压有轻微波动这不是故障。第四类是系统复位或死机。这种情况优先排查是否触发了欠压保护。MCU 在外设并发启动时瞬时电流很大如果 BUCK 配置的输出限流不够或者输入路径内阻偏大电压会被瞬间拉低。处理办法提高输入电流限制或者把外设启动改成错峰启动避免同时拉电。另外要排查中断处理里是否有死循环比如中断服务函数里错误地等待 I2C 操作完成而 I2C 总线又被持住。4.3 项目经验速查表整理一张速查表方便直接贴到团队文档里供后续项目参考。现象可能原因排查动作充电电流为 0输入未插入、限流为 0、电池已充满、温度保护量 VBUS、读状态寄存器、查浮充电压I2C 传输 NACK地址错误、上拉不足、开漏未配置查波形、确认地址位、调上拉阻值BUCK 电压偏低电感饱和、输出电容 ESR 高、PFM 波动测开关节点、换大饱和电流电感、查 ESR系统频繁复位BUCK 欠压、外设启动电流过大调输入限流、错峰启动、测瞬时电压休眠后唤醒异常INT 唤醒配置错误、I2C 访问过早查唤醒引脚配置、加延时再访问电池电压检测偏差检测走线电阻大、电池座接触不良短粗走线、校准检测路径其他经验还有几条写在这里第一PCA9422 的寄存器配置要在硬件确认后再固化不要在验证前就写死在初始化里第二充电截止电流和预充电流要结合电池内阻和系统负载去调不能照抄参考设计第三I2C 通信必须加错误重试和超时机制PMIC 是系统的基础设备通信一旦异常整个电源都会出问题第四测量电池电流时尽量用差分方式避免探头地线引入噪声否则小电流阶段的数据完全不可信。5. 写在最后的一点体会这套 PCA9422 加 PIC32MZ1024EFK144 的方案我最满意的不是省了多少器件、也不是待机功耗有多低而是整个电源状态从以往“黑盒”变成了“透明可读”。以前调试电源问题只能靠万用表量、示波器看大部分时间在猜原因。现在 MCU 直接通过 I2C 读充电状态、输入状态、故障标志代码里一 log 就知道芯片内部在干什么排查效率高了一个量级。如果让我重新做一次这个项目我会把更多精力放在第一步的寄存器理解和硬件布局验证上而不是急着写大量业务代码。电源管理这个领域软件部分其实不难难的是理解芯片在每个阶段的行为以及 PCB 上那些看不见的寄生参数如何影响真实波形。做完整电源管理本质上是把每一瓦功率的去向都掌握清楚从这个角度看PCA9422 和 PIC32MZ 的组合确实是个很均衡的选择。

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

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

免费获取报价 →
↑