资讯动态

基于PCA9422与STM32F405RG的电源管理设计实战

发布时间:2026/10/24 3:29:35 来源:尧图企业网站定制
1. 项目缘起与整体设计思路1.1 为什么偏偏选中 PCA9422 这颗电源管理芯片搞过便携设备或者小型工控板子的朋友应该都有体会给一颗 STM32F405RG 配电源表面上看是个简单活儿——无非就是 3.3V 数字电源、1.8V 或者 1.2V 的内核电源再加个电池充电管理。但真动手做的时候你会发现分立方案搭起来又占板子又难调尤其是低功耗场景下各条电源轨的上电时序、掉电时序、休眠时的静态电流每一项都能让你多熬几个通宵。PCA9422 这颗芯片吸引我的地方在于它把锂电池充电管理、多路降压转换器、LDO 以及 I2C 可编程控制全部塞进了一个 3mm x 3mm 的 QFN 封装里。对于 STM32F405RG 这种需要 3.3V IO 和 1.2V 内核的 MCU 来说PCA9422 恰好能提供两路 buck 输出其中一路可以固定输出 3.3V 给 IO 和大部分外设另一路可以动态调节输出 1.2V 给内核。更关键的是它内置的 I2C 接口允许 MCU 在运行时动态调整输出电压和上电时序这在做低功耗状态切换时非常有用。我选它的另一个理由是充电管理部分。PCA9422 支持最大 1A 的充电电流充电电压和截止电流都可以通过 I2C 配置对于 1000mAh 到 3000mAh 的单节锂电来说完全够用。而且它自带 JEITA 温度补偿虽然我们不一定用得上但至少说明这颗芯片在电池安全方面是下了功夫的。1.2 STM32F405RG 的电源需求拆解STM32F405RG 的电源引脚不算复杂但有几个细节容易踩坑。VDD 是 1.8V 到 3.6V 的数字电源通常取 3.3VVDDA 是模拟电源必须和 VDD 同电位或者略高一般也是 3.3V但要注意 VDDA 的滤波VDD_USB 是 USB 收发器电源如果不用 USB 可以悬空或者接 3.3VVBAT 是备份域电源接纽扣电池或者直接接 VDDVCAP_1 和 VCAP_2 是内核稳压器的输出需要各接一个 2.2uF 的电容到地这两个电容必须是低 ESR 的陶瓷电容而且走线要尽量短。内核电压方面STM32F405RG 的内核稳压器输出典型值是 1.2V这个电压不是外部直接供电的而是由芯片内部的 LDO 从 VDD 降压得到。所以严格来说PCA9422 的第二路 buck 并不是直接给内核供电而是给 VDD 供电然后芯片内部再降到 1.2V。这一点我在设计初期差点搞错以为需要外部提供 1.2V后来仔细看了数据手册才发现 VCAP 引脚是内部稳压器的输出不是输入。不过如果你想让 STM32F405RG 跑在 168MHz 满速下VDD 必须稳定在 3.3V 附近而且纹波要小。PCA9422 的 buck 输出纹波在 3.3V 档位下典型值是 10mVpp 左右对于 STM32F405RG 来说完全够用。但如果你的板子上还有 ADC 采样或者音频电路那就得在 PCA9422 输出后面再加一级 LC 滤波或者 LDO把纹波压到 1mV 以下。1.3 整体电源树的设计取舍整个电源树的设计思路是这样的锂电池输入经过 PCA9422 的充电管理模块一路给电池充电另一路通过 buck1 输出 3.3V 给 STM32F405RG 的 VDD、VDDA、VDD_USB 以及所有 3.3V 外设供电buck2 输出 1.8V 或者 1.2V给那些需要低电压的外设比如某些传感器或者 SD 卡接口。如果外设需要 1.8V那就用 buck2 直接输出如果不需要buck2 可以关掉节省功耗。这里有个取舍PCA9422 的两路 buck 都是同步整流架构效率在 90% 左右但轻载时效率会下降。如果你的设备大部分时间处于休眠状态那就要考虑在休眠时把 buck2 关掉只留 buck1 给 MCU 供电然后 MCU 进入 STOP 模式把电流压到几十微安。PCA9422 本身在关掉一路 buck 后的静态电流大约是 30uA加上 MCU 的 STOP 模式电流整机休眠电流可以控制在 100uA 以内对于电池供电的设备来说是可以接受的。另外PCA9422 的 I2C 地址是固定的7 位地址是 0x34所以同一组 I2C 总线上只能挂一颗。如果你需要多颗那就得用 I2C 多路复用器或者换用其他型号。这一点在选型时就要确认好别等到画完板子才发现地址冲突。2. 核心细节解析与实操要点2.1 PCA9422 的引脚功能与外围元件选型PCA9422 的引脚不算多但每一个都挺关键。VIN 是充电输入通常接 USB 的 5V耐压 6V所以直接接 USB 没问题但要注意加一个 TVS 管防浪涌。SW1 和 SW2 是两路 buck 的开关节点需要接电感和电容。FB1 和 FB2 是反馈引脚用来设定输出电压。SDA 和 SCL 是 I2C 通信线需要上拉电阻典型值是 4.7k 到 10k。INT 是中断输出可以接到 MCU 的外部中断引脚用来通知充电状态变化或者故障。电感的选择很关键。PCA9422 的 buck 开关频率是 2MHz所以电感值不能太大否则体积下不来也不能太小否则纹波电流太大。根据数据手册的推荐1.5uH 到 2.2uH 是比较合适的范围。我一般选 2.2uH 的屏蔽电感饱和电流至少 1.5A直流电阻尽量小比如 50mΩ 以内。输出电容用 10uF 的 X5R 或者 X7R 陶瓷电容再加一个 100nF 的高频去耦电容放在输出引脚附近。反馈电阻的计算也不复杂。PCA9422 的 FB 引脚参考电压是 0.6V所以输出电压等于 0.6V 乘以 (1 R1/R2)。比如要输出 3.3VR1/R2 就是 4.5取 R145kR210k实际输出就是 0.6 * (1 45/10) 3.3V。但要注意PCA9422 也支持通过 I2C 动态调整输出电压这时候反馈电阻的设定值只是默认值I2C 可以覆盖它。所以如果你打算用 I2C 调压反馈电阻可以按默认输出设定然后通过软件改。2.2 I2C 通信协议与寄存器配置PCA9422 的 I2C 接口支持标准模式 100kHz 和快速模式 400kHzSTM32F405RG 的 I2C 外设完全支持。通信格式是标准的 I2C 读写7 位地址 0x34写操作是 0x68读操作是 0x69。寄存器地址是 8 位的数据也是 8 位的。常用的寄存器有几个0x00 是设备 ID读出来应该是 0x22 或者类似的固定值可以用来确认通信是否正常。0x01 是充电控制寄存器可以设置充电电流和充电使能。0x02 是 buck1 控制寄存器可以设置输出电压和使能。0x03 是 buck2 控制寄存器。0x04 是状态寄存器可以读取充电状态、故障标志等。配置的时候要注意有些寄存器是只读的有些是读写的还有些是写 1 清零的。比如状态寄存器里的故障标志读出来之后要写 1 才能清除否则下次读还是同样的值。这一点在写驱动的时候要特别小心不然会误判故障。另外PCA9422 的 I2C 通信在电池电压过低时可能会不稳定因为芯片本身需要一定的供电电压才能正常工作。所以如果你的电池电压低于 3.0V最好先通过充电电路把电池电压抬上来再进行 I2C 配置。或者你可以用 USB 供电来配置因为 USB 5V 经过 VIN 引脚可以直接给芯片供电不需要电池。2.3 上电时序与复位策略STM32F405RG 对上电时序没有特别严格的要求但 PCA9422 的两路 buck 上电顺序是可以配置的。默认情况下buck1 先上电然后 buck2 延迟一段时间上电。这个延迟时间可以通过 I2C 配置典型值是 1ms 到 10ms。为什么要关心上电时序因为如果你的板子上有多个外设比如 SD 卡、传感器、显示屏它们可能对电源上电顺序有要求。比如某些传感器要求 IO 电源先上内核电源后上否则会有漏电流。这时候你就可以通过 PCA9422 的时序配置来满足。复位策略方面STM32F405RG 的 NRST 引脚需要接一个 100nF 电容到地再加一个 10k 上拉电阻到 3.3V。PCA9422 本身没有复位输出所以你需要用 MCU 的 GPIO 来控制外设的复位或者用专门的复位芯片。如果板子上有多个需要复位的器件建议加一颗复位芯片比如 MAX809 之类的成本不高但能省不少事。3. 实操过程与核心环节实现3.1 硬件原理图设计与 PCB 布局要点原理图设计阶段先把 PCA9422 的典型应用电路抄下来然后根据实际需求改。VIN 引脚接 USB 5V加一个 1uF 和 100nF 的电容去耦。SW1 和 SW2 分别接 2.2uH 电感到 3.3V 和 1.8V 输出。FB1 和 FB2 接反馈电阻分压。SDA 和 SCL 接 4.7k 上拉到 3.3V。INT 接 MCU 的 PB0 或者任意一个外部中断引脚。PCB 布局的时候有几个地方要特别注意。第一SW 节点的走线要尽量短因为这是高频开关节点走线长了会辐射 EMI。第二输入电容和输出电容要尽量靠近芯片引脚尤其是输出电容要放在电感和芯片之间不能放在电感后面。第三反馈电阻要靠近 FB 引脚走线要远离 SW 节点否则会耦合噪声。第四I2C 走线要等长如果板子上有多个 I2C 器件要加缓冲器或者多路复用器。地平面方面建议用完整的地平面不要分割。PCA9422 的 GND 引脚和电容的地要直接打到地平面过孔要多打几个降低阻抗。模拟地和数字地不用分因为 PCA9422 本身没有模拟部分STM32F405RG 的 VDDA 和 VSSA 可以在芯片下方单点接地。3.2 软件驱动开发与寄存器配置实例软件部分我用的是 STM32Cube HAL 库I2C 初始化很简单配置成 400kHz 快速模式7 位地址模式。然后写几个基本的读写函数uint8_t PCA9422_ReadReg(uint8_t reg) { uint8_t data; HAL_I2C_Mem_Read(hi2c1, 0x34 1, reg, I2C_MEMADD_SIZE_8BIT, data, 1, 100); return data; } void PCA9422_WriteReg(uint8_t reg, uint8_t data) { HAL_I2C_Mem_Write(hi2c1, 0x34 1, reg, I2C_MEMADD_SIZE_8BIT, data, 1, 100); }然后初始化的时候先读设备 ID 确认通信正常uint8_t dev_id PCA9422_ReadReg(0x00); if (dev_id ! 0x22) { // 通信失败检查硬件 }接着配置充电电流为 500mA充电使能PCA9422_WriteReg(0x01, 0x0A); // 假设 0x0A 对应 500mA配置 buck1 输出 3.3V使能PCA9422_WriteReg(0x02, 0x1F); // 假设 0x1F 对应 3.3V 和使能配置 buck2 输出 1.8V使能PCA9422_WriteReg(0x03, 0x0F); // 假设 0x0F 对应 1.8V 和使能具体的寄存器值要根据数据手册的表格来填我这里只是示意。实际调试的时候建议先用 I2C 扫描工具确认地址然后逐个寄存器读写验证。3.3 低功耗模式下的电源管理策略低功耗是电池设备的核心需求。STM32F405RG 支持多种低功耗模式SLEEP、STOP、STANDBY。在 STOP 模式下MCU 的电流可以降到 100uA 左右STANDBY 模式下可以降到 2uA 左右。但 STOP 模式下I2C 外设会停止工作所以你不能通过 I2C 去配置 PCA9422。这时候就需要在进入 STOP 模式之前先把 PCA9422 配置好比如关掉 buck2把 buck1 的输出电压降到 3.0V 或者更低以节省功耗。PCA9422 本身在关掉一路 buck 后的静态电流大约是 30uA加上 MCU 的 STOP 模式电流整机休眠电流可以控制在 100uA 以内。如果电池容量是 2000mAh那么理论待机时间就是 2000mAh / 0.1mA 20000 小时约 833 天。当然这是理想值实际会有各种漏电流但至少说明这个方案在低功耗方面是可行的。唤醒的时候可以通过外部中断唤醒 MCU比如按键或者传感器中断。MCU 唤醒后先通过 I2C 重新配置 PCA9422把 buck2 打开把 buck1 恢复到 3.3V然后再初始化外设。这个过程大概需要几毫秒对于大部分应用来说是可以接受的。4. 常见问题与排查技巧实录4.1 I2C 通信失败排查流程I2C 通信失败是最常见的问题没有之一。排查的时候先确认硬件SDA 和 SCL 有没有上拉电阻上拉电阻是不是 4.7k 左右用示波器看波形有没有毛刺上升沿是不是太慢如果上升沿太慢说明上拉电阻太大或者总线电容太大可以减小上拉电阻或者缩短走线。然后确认软件I2C 地址对不对PCA9422 的 7 位地址是 0x34HAL 库里面要左移一位变成 0x68。时钟频率是不是太快先降到 100kHz 试试。有没有其他器件占用总线用 I2C 扫描工具扫一下看看能不能找到 0x34。如果还是不行那就检查电源PCA9422 的 VIN 有没有电电池有没有接如果电池电压太低PCA9422 可能不工作。这时候可以用 USB 供电因为 VIN 引脚可以直接从 USB 取电。4.2 输出电压不准或者纹波过大输出电压不准先检查反馈电阻。用万用表量一下 FB 引脚的电压应该是 0.6V。如果不是说明反馈电阻有问题或者 FB 引脚虚焊。如果 FB 电压是对的但输出电压不对那就是反馈电阻的比例算错了重新算一下。纹波过大先检查输出电容。是不是容量不够是不是 ESR 太高换一个 10uF 的 X7R 陶瓷电容试试。然后检查电感是不是饱和电流不够是不是直流电阻太大换一个 2.2uH 的屏蔽电感试试。最后检查布局SW 节点的走线是不是太长输出电容是不是离芯片太远重新布局一下。如果纹波还是大那就在输出后面加一级 LC 滤波电感用 1uH电容用 10uF可以把纹波压到 1mV 以下。但要注意LC 滤波会引入相位延迟可能会影响 buck 的稳定性所以要在反馈环路里面加一个前馈电容典型值是 100pF。4.3 充电电流不达标或者充电异常充电电流不达标先检查充电电流设置寄存器。PCA9422 的充电电流是通过 I2C 配置的默认值可能比较小比如 100mA。你要根据电池容量来设置比如 2000mAh 的电池充电电流可以设到 1000mA但不要超过电池的最大充电电流。然后检查输入电源。USB 5V 的电流能力是不是够如果 USB 口只能提供 500mA那你设 1000mA 也没用PCA9422 会自动限流。这时候可以换一个能提供 2A 的充电头或者用 DC 电源供电。充电异常比如充不进去或者充到一半停了先读状态寄存器看看有没有故障标志。常见的故障有电池温度过高或者过低、输入电压过低、充电超时。如果是温度问题检查电池的 NTC 电阻是不是接对了阻值是不是匹配。如果是输入电压问题检查 USB 线是不是太长或者太细导致压降太大。4.4 常见问题速查表问题现象可能原因排查方法解决方案I2C 通信失败上拉电阻缺失或过大示波器看波形加 4.7k 上拉电阻I2C 通信失败地址错误用扫描工具扫描确认地址为 0x34输出电压不准反馈电阻错误量 FB 引脚电压重新计算反馈电阻纹波过大输出电容不足换电容测试加 10uF X7R 电容纹波过大布局不合理检查 SW 走线缩短 SW 走线充电电流不达标输入电源限流量 USB 电压换大电流充电头充电异常电池温度问题读状态寄存器检查 NTC 电阻休眠电流过大buck2 未关量总电流休眠前关 buck25. 个人实操心得与进阶建议5.1 几个容易忽略的细节第一个细节是 PCA9422 的 INT 引脚。这个引脚是开漏输出需要上拉电阻典型值是 10k。如果你不接上拉INT 引脚永远是低电平MCU 会一直进中断。我一开始就没接结果 MCU 一直在中断里面出不来查了半天才发现是 INT 引脚的问题。第二个细节是 VCAP 电容。STM32F405RG 的 VCAP_1 和 VCAP_2 必须各接一个 2.2uF 的陶瓷电容而且必须是低 ESR 的。我试过用普通的电解电容结果 MCU 跑起来就不稳定偶尔会复位。换成陶瓷电容后就好了。这两个电容的走线要尽量短最好直接放在引脚旁边不要打过孔。第三个细节是 VDDA 的滤波。STM32F405RG 的 VDDA 是模拟电源对噪声很敏感。如果你用 PCA9422 的 buck1 直接给 VDDA 供电那 ADC 采样出来的值可能会跳。建议在 VDDA 前面加一个磁珠或者电感再加一个 1uF 和 100nF 的电容把噪声滤掉。如果对 ADC 精度要求很高那就再加一个 LDO比如 3.3V 的 LDO把纹波压到 1mV 以下。5.2 进阶玩法动态电压调节PCA9422 支持通过 I2C 动态调节输出电压这个功能在低功耗场景下很有用。比如 MCU 跑在 168MHz 的时候VDD 需要 3.3V但如果降频到 84MHzVDD 可以降到 3.0V 甚至 2.8V功耗会明显下降。你可以写一个函数根据 MCU 的主频来动态调整 PCA9422 的输出电压。具体实现是先改 PCA9422 的 buck1 输出电压寄存器然后等一段时间让电压稳定再改 MCU 的时钟配置。注意顺序不能反否则 MCU 可能会因为电压不够而复位。另外改电压的时候要确保电流不超过 buck 的最大输出电流否则会触发过流保护。5.3 后续扩展方向这个方案还可以扩展。比如加一个电量计芯片通过 I2C 读取电池的剩余电量然后在显示屏上显示。或者加一个温度传感器监测电池温度在温度过高或者过低时自动降低充电电流。再或者加一个无线充电接收芯片把 VIN 引脚接到无线充电的输出实现无线充电功能。如果你需要更多的电源轨比如 5V 或者 12V那就可以在 PCA9422 的 buck1 输出后面再加一个升压转换器或者用 PCA9422 的 buck2 输出 1.8V然后再升压到 5V。不过这样效率会低一些因为经过了两次转换。更好的方案是选一颗多路输出的 PMIC比如 PCA9450 之类的但那就不是这个项目讨论的范围了。最后再分享一个小技巧调试电源的时候一定要用电子负载或者功率分析仪不要只用万用表。万用表只能看平均电压看不到纹波和瞬态响应。电子负载可以模拟各种负载条件帮你快速定位问题。我一开始只用万用表结果板子跑起来偶尔会死机后来用示波器一看纹波有 200mVpp难怪会死机。换了输出电容和电感之后纹波降到 20mVpp板子就稳定了。

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

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

免费获取报价 →
↑