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

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

PCA9422与PIC18F86J50低功耗电源管理方案设计 ★ FEATURED ARTICLE
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.3VLDO 输出可以给实时时钟或传感器供电。电量计部分用的是电压加电流的混合计量方式虽然精度不如库仑计但对于显示“剩余电量百分比”和“低电量预警”来说完全够用。引脚方面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)代入 VBUS5V、V_OUT5V 时占空比接近 50%实际算下来 4.7μH 能保证纹波电流在 300mA 以内。降压转换器开关频率 2MHz输入 4.2V 输出 3.3V2.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.4VPMIC 产生中断MCU 关闭非必要外设降低主频准备休眠。休眠状态是 MCU 进入 Deep SleepPMIC 保持实时时钟和电池监测等待中断唤醒。状态切换的条件都写在固件的中断服务程序里。比如充电完成中断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μAMCU 消耗约 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 的寄存器配置一定要按顺序来先配充电再配输出最后配中断顺序错了会出现配置不生效的情况。第二个心得是低功耗优化不要只盯着 MCUPMIC 自身的功耗也很关键把不用的功能关掉能省不少电。第三个心得是I2C 通信的稳定性比速率更重要100kHz 足够用不要盲目追求 400kHz。后续扩展的话可以考虑加一颗外部EEPROM 存储电池历史数据比如循环次数、最大充电电流、最高温度这样能更准确地评估电池健康状态。还可以把 PCA9422 的中断输出接到 MCU 的多个引脚实现不同事件的快速响应不用每次都读寄存器。另外如果系统需要多路输出PCA9422 的 LDO 可以给传感器单独供电通过 I2C 动态开关进一步降低待机功耗。最后分享一个小技巧调试电源管理时一定要用可编程电子负载模拟电池这样可以精确控制电池电压和电流比用真实电池方便得多。我用的电子负载可以设置电池内阻模拟不同老化程度的电池对测试低电量保护和充电状态机非常有帮助。这个投入对于做电源管理的团队来说绝对值得。
阅读完成 · 觉得有帮助?
咨询建站