资讯动态

PMIC+低功耗MCU协同设计:PCA9422与MK24FN电池供电系统实战

发布时间:2026/10/24 6:11:13 来源:尧图企业网站定制
做电池供电设备电源管理方案往往决定项目成败。我最近一个项目就把PCA9422和MK24FN1M0VDC12放在一起用了PCA9422负责全部供电和充电MK24FN1M0VDC12作为主控不光跑业务逻辑还负责给电源芯片下指令。组合起来之后充电、多路电压输出、低功耗调度都收归到一个框架里整体电流表现比之前用分立DCDC的方案好不少。如果你也在做手环、温湿度传感器、便携仪器这类需要锂电池供电的产品这套“PMIC低功耗MCU”的协作思路值得参照。文章会从系统设计、硬件连接、软件配置到实测数据、排坑记录把能复现的部分都写清楚。1. 项目需求与选型为什么把电源管理单独做成一个环节1.1 需求拆解电池设备要解决的问题不止是把电压稳住任何锂电池供电的系统拆开看都有三层电源需求。第一层是充电管理。单节锂电池不能直接随便接个电源就充需要按“涓流—恒流—恒压”三个阶段控制充电电流和终止电压还要有过压、过流、过温保护。用分立器件搭充电回路不是不行但线性充电的效率低发热大可配置性也差。用开关充电器则要选型、算电感、算采样电阻设计周期明显变长。第二层是电压轨生成。一颗MCU自己就要多个电源域核心逻辑用低电压、I/O用1.8V或3.3V、模拟参考需要干净的电压。外设模块如传感器、无线模组还可能要求5V或者单独的3.3V。如果每个电压轨都用一个独立的DCDC或LDO板子上全是电源芯片BOM成本和布局面积都扛不住。第三层是低功耗。这是电池设备最麻烦的一环。MCU本身有各种睡眠模式但光MCU睡了没用如果DCDC芯片的空载功耗是几十上百微安整机待机电流就会很难看。电源管理必须支持轻载模式MCU在进入休眠前还要能主动把系统里的非必要外设断电。所以这项目从一开始就明确电源不能靠MCU内部稳压器凑合需要一颗专门的可配置PMIC。剩下的问题才是选哪颗MCU去指挥这颗PMIC。1.2 关键器件选型思路MCU这端考虑到产品的核心功能需要跑比较多的数据运算和通信协议Flash和RAM的容量必须够大性能也要够。MK24FN1M0VDC12属于Cortex-M4F系列主频120MHz带浮点单元1MB Flash加256KB RAM在穿戴设备和仪器仪表这类产品里属于“算力和存储都不是瓶颈”的位置。更关键的是这颗MCU的低功耗模式分得很细从普通STOP到保留RAM的低功耗停止模式再到RTC继续跑的超低功耗停止模式预留了很大的功耗调优空间。PMIC这端PCA9422的定位正好对应前面拆解的三层需求。它内部把锂电池充电管理和多路电压输出集成在一起I2C可配置性很强可以动态调整输出电压也支持轻载时切换低功耗状态。对嵌入式系统来说这意味着电源管理不再是硬件工程师焊一堆零件之后“听天由命”的事而是能由MCU运行时动态控制的软件资源。这一点是选择PCA9422的核心原因。1.3 系统架构谁给谁供电谁指挥谁整套系统的架构可以描述为电池供电给PCA9422PCA9422产生所有需要的工作电压其中一路给MK24FN1M0VDC12供电同时PCA9422与MK24之间通过I2C总线连接。MK24作为I2C主机去配置PCA9422的寄存器读取充电状态、输出电压状态和故障标志PCA9422则把充电完成、输入接入、故障等事件通过中断引脚通知给MK24。另外不要忽略I2C在这套方案中的“纽带”作用。硬件上它只是两根线加一根中断线软件上它却决定了整个电源管理框架能不能跑起来。如果I2C配置有问题PMIC也许能用默认配置工作但动态调压、低功耗切换这种高级玩法就全部指望不上。所以在硬件设计阶段I2C的上拉电平、中断线的选择、从机地址的分配都需要预先确认好后面讲到坑位排查时我再细说。1.4 为什么不用更便宜的“MCU内部DCDC外部充电IC”方案有人可能会问MK24本身有内部稳压器我外部再加一颗充电芯片不是也能实现吗在这个项目里有两个问题。第一MK24内部稳压器主要面向MCU自身供电不能给传感器、无线模组等外部负载提供多路、可独立开关的电压轨全部外挂DCDC又回到BOM膨胀的老路上。第二充电IC和系统供电分开之后MCU无法统一监控电池电压、充电电流这些关键状态低功耗调度时缺少全局视角。用PCA9422把“充电供电”合并MCU一次I2C读取就能拿到整机电源状态软件上好做得多。2. 硬件电路设计把电源树和关键连接一次画对2.1 电源树与电压轨的范围划分真正画原理图之前先把整机的电压需求列成一张表。以我这个模拟项目X为例最终需要三路电压一路3.3V给MK24FN1M0VDC12和数字逻辑部分一路1.8V给存储芯片和部分I/O电平一路由电池直接或经过轻度稳压后给模拟前端供电要求噪声低。PCA9422这类芯片通常不止一个输出通道可以根据产品需要把输出通道分配给不同负载。系统设计时需要注意两件事第一不能让所有负载都挂在同一个输出电压上否则高功耗模块唤醒时会把整路电压拉垮影响MCU这种对电压跌落敏感的器件第二每路输出要评估最大电流再根据这个电流去选电感的饱和电流和输出电容容量。这些值在PMIC手册里通常会给出参考范围但最终取值必须结合自己负载的动态电流曲线。2.2 PCA9422 的外围电路要点PMIC毕竟是电源器件外围电路的处理很大程度决定最终性能。这里把几个最容易被低估的点逐一说清楚。一是电感。开关电源的电感值、饱和电流、直流电阻直接决定转换效率和输出纹波。按照我实际踩坑的经验电感饱和电流宁可取大也不要贴着典型负载电流估。比如负载峰值是500mA选一个饱和电流800mA的电感看起来够但锂电池电压偏低时DCDC的峰值电流会明显高于直流负载电流如果电感余量不足轻则电流受限重则发热异常。我的做法是留30%以上的余量并尽量选屏蔽电感减少对无线模块和模拟电路的干扰。二是输入输出电容。PMIC的输入电容附近通常要并联一个0.1微法的高频去耦电容输出电容的ESR和容量会影响瞬态响应。初次画板时我习惯按照手册的推荐值先摆上去再根据实测纹波去调整。要注意的是不能为了把一个输出纹波压到极小就盲目加大电容容值过大会拖慢动态调压的响应速度这在后面要讲DVS快速切换时会特别明显。三是充电回路的输入保护和采样。锂电池充电输入一般来自USB口或适配器输入端的防浪涌和过压保护是必须的至少要在VBUS进入PMIC之前加一级TVS管和合适的输入限流配置。如果PMIC的充电电流是通过I2C寄存器设置的就不用额外焊采样电阻但需要保证板上的地线回路足够短避免充电大电流在PCB地上产生压差干扰I2C信号。四是热设计。集成充电管理的PMIC在2A充电且环境温度偏高时芯片本体的温度上升是实打实的。PCB上要给PMIC周围铺足够大的铜箔最好连到地平面帮助散热。如果产品外壳完全密闭还要在测试阶段用热电偶实测芯片表面温度避免走到量产才发现热问题。2.3 MK24FN1M0VDC12 的电源与接地处理MK24的电源引脚比较多包括多个VDD/VSS引脚以及模拟参考引脚。设计时不能把所有VDD引脚只连一个过孔到电源平面就完事高频数字逻辑的工作电流是动态变化的多引脚可以分担电流更关键的是要保证每个VDD引脚旁都有就近的去耦电容。对于模拟部分如果产品对ADC精度有要求建议把模拟参考电压的滤波单独处理不要和数字I/O的供电混在一起。另外MK24这类MCU通常有独立的电池备份引脚或RTC供电引脚当主电源完全断电时可以靠纽扣电池维持RTC。在这一项目中如果产品需要时间戳功能就要把这些引脚接到单独的备份电源上而不是也并到3.3V主轨后边。否则MCU主电源被PMIC关断后RTC和备份RAM也会跟着丢数据。2.4 I2C与中断线的硬件连接PCA9422作为I2C从设备SCL和SDA都需要上拉电阻。这里有一个容易踩坑的点上拉电阻应该上拉到PCA9422和MK24都兼容的电平。如果MK24的I2C引脚是3.3V容忍而PMIC工作电平是1.8V需要设计好电平匹配方案否则通信会时好时坏。最简单的情况是大家都在3.3V域下工作上拉电阻取值根据总线上挂的设备数量和总线速度定一般2.2k到10k之间都可以低速模式下偏大一些反而省功耗。INT中断线我建议接到MK24的任意一个支持唤醒的GPIO上。这样当PCA9422检测到外部电源插入、充电完成、故障恢复等事件时可以主动把MCU从睡眠中唤醒MCU不用轮询去读寄存器中断唤醒的方式对系统功耗更友好。硬件引脚分配时还要注意这个GPIO最好不要复用其他关键外设功能否则排查问题时分不清是电源芯片的中断还是其他外设的信号。3. 软件实现让PMIC和MCU跑成一个整体3.1 I2C驱动与初始化流程软件工作首先要保证I2C驱动正确。以MK24的SDK为例初始化流程一般是配置I2C引脚复用、设置波特率、使能I2C外设。波特率不建议太高PMIC这类电源管理芯片的寄存器读写频率不需要很快400kHz已经够用外部线路比较长或上拉电阻偏大时降到100kHz反而更稳定。代码里我习惯把按寄存器写操作封装成两个基础函数// 简化示例具体寄存器地址请对照PCA9422数据手册确认 static uint8_t pmic_read_reg(uint8_t reg_addr) { uint8_t value 0x00; // I2C start, write slave address reg_addr // I2C repeated start, read one byte // I2C stop return value; } static void pmic_write_reg(uint8_t reg_addr, uint8_t value) { // I2C start, write slave address reg_addr value // I2C stop // 需要处理NACK return; }这两个函数是整个电源管理框架的地基。所有上层功能包括充电配置、输出电压调整、状态读取最后都会落到这两行I2C操作上。所以调试时宁可先把这两个函数对着示波器验证清楚也不要急着写复杂逻辑。3.2 充电管理逻辑三段式充电与状态监控锂电池充电的标准流程是电池电压过低时先用很小的电流涓流充电电压升上来后进入恒流充电接近充满后转恒压充电电流下降到阈值后判定充满。PCA9422内部会管理这些阶段但MCU需要做的是配置合适的目标电压和电流并持续读取充电状态必要时做保护。实际软件里我会用一个简单的状态机系统上电后读取PMIC的输入电源标志判断有没有外部电源接入有输入电源且电池电压低于阈值时配置充电电流并启动充电每1秒读取一次充电状态寄存器当出现充满标志或故障标志时记录状态并通过中断或日志上报。充电电流的初始配置尤其重要如果适配器或USB口的供电能力有限过大的充电电流会把输入电压拖垮导致PMIC反复重启。我的建议是先按保守值配置比如500mA实测输入电压跌落不多再往上调。3.3 动态电压调节把输出电压变成软件可调资源PCA9422支持通过I2C调整输出电压这是它比传统固定输出PMIC有价值的地方。利用这个特性可以实现类似CPU动态调频的思路系统处于高性能模式时把主电压轨设定到较高值让MCU和外设满血运行进入低功耗模式时再把电压调低或者关闭冗余输出轨。这里必须注意时序。切换输出电压不是瞬间完成的PMIC内部有反馈环路和软启动机制电压爬升需要一段时间。如果MCU在电压还没稳定的时候就去跑高频外设可能出现偶发死机。我实现时会先写配置寄存器然后轮询状态寄存器里的电压稳定标志确认OK之后再继续后续操作。软件等待超时时间我设为10ms实际测量大多数切换在几百微秒内就完成但保险起见代码里该等还是得等。3.4 MK24低功耗模式与PMIC的入睡/唤醒协同整套方案最精彩的地方在低功耗协同。MK24支持多档低功耗模式而PCA9422也有对应的低功耗或轻载状态两者必须配合不能只管一头。以休眠流程为例MCU先关闭所有不必要的外设电源轨或者把对应电压轨调到低功耗档位然后通过I2C把PCA9422切换到省电模式最后MK24执行WFI指令进入STOP/VLPS模式。唤醒流程则正好反过来外部事件或PCA9422的中断信号先把MK24唤醒MK24马上恢复PCA9422的正常输出电压配置等各路电源稳定后再继续跑业务。每一步的前后顺序都必须固定否则就会出现MCU还醒着但电压轨已经关了或者外设还在工作而主控已经睡着的尴尬状态。我记得第一次调这个休眠流程时只留心让MCU跑进了VLPS忘了先把PMIC切到省电模式结果整机待机电流从几十微安涨到了几百微安。后来在测试脚本里加了检查项进入休眠前读PMIC当前状态寄存器和输出配置全部符合预设值之后才允许MCU执行WFI。调试这类问题时软件里多留几个状态断言比在示波器上猜要高效得多。4. 实测数据与效果分析4.1 各工作模式的功耗清单项目进入测试阶段后我在样机上把几个典型工作模式的整机电流都测了一遍。测试方法是用精密电流表串在电池和PCA9422的VBAT输入端之间记录不同状态下的稳定电流。以下数据是从模拟项目X的样机在实际测试条件下得到的典型值不同板卡和固件配置会有差异主要看变化趋势。工作状态整机电流典型值说明正常工作MCU以120MHz跑主循环约12mA3.6V电池包含外设和无线模块短时发射MCU进入STOPPMIC保持正常输出约300μA外设未断电仍有静态电流MCU进入VLPSPMIC切省电模式冗余轨关闭约15μARTC继续走时等待外部中断唤醒充电中充电电流设置为500mA输入端约600mA含DCDC转换损耗温升不明显这组数据里最值得关注的是第三步的15μA。对比我之前做的分立方案同样的设备在类似状态下待机电流基本在100μA以上。差距主要来自两部分一是PMIC本身在省电模式下静态电流很低二是冗余电压轨被真正切断了而不是靠每个负载自己的待机电流去“自觉”省电。4.2 动态切换与纹波表现用示波器观察MCU从VLPS唤醒瞬间的电压跌落是检验电源设计是否合格的重要指标。唤醒时MCU内核和外设同时开始工作瞬时电流尖峰可能达到几十毫安如果PMIC瞬态响应不好或者输出电容不足3.3V轨上会看到一个明显的凹坑。我实测在3.3V轨上用100μF输出电容的情况下唤醒瞬间最大跌落约120mV大概在2ms内恢复到正常值没有触发MCU的欠压复位。这个表现能接受但如果产品对电源质量要求更高可以适当增加输出电容或者调整PMIC的环路补偿参数。另外对于模拟前端所在的那一路电压纹波表现也很重要实测开关频率纹波在5mV以内基本不会影响ADC采样精度。4.3 与分立方案的对比感受如果把这套“PCA9422MK24”组合和我早期用“独立充电IC独立DCDC多个LDO”的分立方案对比最直观的差距不是原理图省了几颗料而是整个项目在后期调低功耗时的效率完全不同。分立方案里每一路电源的使能、状态反馈都需要单独引脚和单独软件逻辑排查问题时要跨多个芯片查数据手册。集成方案里所有电源状态都映射为寄存器一个函数就能把所有输出轨调到目标状态调试迭代速度明显更快。这种差异在方案设计阶段不容易量化但项目进行到功耗调优阶段会感受很深。5. 实操中的常见问题与排查技巧5.1 I2C通信不稳定时而读到错误数据我遇到过几次I2C读回来全是0xFF或者偶发应答错误最先怀疑的是从机地址配错但反复核对也没问题。后来查接地才找到根源充电大电流回路的PCB走线恰好从I2C信号下方穿过充电时地平面电位波动耦合到了信号线上。解决办法是调整布局让信号线远离大电流回路同时把I2C上拉电阻稍微调小提升抗干扰能力。另外如果总线上只挂了PCA9422一个从机可以直接把I2C速率降到100kHz试试通常能排除大部分信号质量问题。5.2 充电电流总是达不到设定值充电电流设置600mA实测却只有200mA左右。我先怀疑是输入电源限流因为当时用的是USB口供电线缆和电脑口都有电流限制。后来单独用稳压电源供电再测电流就到了600mA问题被定位在输入侧。想提醒的是PMIC的充电电流是输入电流和电池充电电流的综合结果输入端电压一旦被拉低内部会主动降流。排查这类问题时先看输入电压实时值记录充电过程中VBUS或适配器电压是否稳定很多“芯片不工作”的假象都是供电侧先拉垮了。5.3 整机进入休眠后电流始终比预期大整机休眠目标15μA实测却停在300μA。排查步骤是按电源树从上往下断开负载先通过软件把所有关闭的输出轨的寄存器状态读出来确认PMIC确实切到了省电模式再检查组外设负载有没有被真正断电比如某个传感器VCC接到的是常通电压轨而外部电路没有加电源开关。那次查到问题就出现在板上一颗上拉电阻MCU的I2C引脚休眠时是开漏状态上拉电阻把电流从3.3V轨拉到引脚引脚内泄放到地回路形成一个持续的漏电通道。虽然只有十几微安但对于追求极低待机电流的设备来说已经足够致命。解决方法是把上拉电阻改到休眠时也会断电的电压轨上或者使用带开关的负载开关统一控制。5.4 唤醒瞬间MCU偶尔复位唤醒瞬间复位是最难复现的问题之一。用逻辑分析仪抓了一周才意识到问题不在PMIC而在我唤醒流程软件的时序MK24唤醒后立刻去操作I2C配置PMIC但此时PMIC还处于省电模式对I2C请求的响应时间比正常模式慢导致超时并误报错误进而触发了软件复位。修复方式是唤醒后先等固定延时比如5ms再操作PMIC让芯片有充足时间完成内部状态切换。这种时序问题在低功耗协同开发中非常典型建议每次修改休眠/唤醒代码时都对着示波器把每个事件的时间间隔过一遍。5.5 快速排查清单遇到电源相关的问题我会先在脑海里过一遍清单输入电压是否稳定、输出使能是否打开、I2C从机地址和配置是否正确、负载是否有短路或反向压差、当前PMIC是否处在省电模式。这些问题占了实际排查工作量的大半。其中PMIC当前模式最容易被忽略因为很多代码只在初始化时配置一次寄存器中间休眠唤醒了几百次之后芯片状态可能早已和预期不一致。如果产品稳定复现某个异常重启后第一次运行却一切正常优先怀疑状态残留问题。我个人在实际项目里的体会是把电源管理交给一颗可配置PMIC之后硬件的供电设计并没有变简单但它把复杂度从“电路板上的焊点和电阻”转移到了“软件里可读、可写、可测的寄存器”调试手段一下子丰富了很多。PCA9422和MK24FN1M0VDC12这套组合让我印象最深的是低功耗协同不再靠猜测每一路电压和每一种工作模式都能在代码里查得到、调得动。最后再分享一个小技巧开发早期就把I2C寄存器读写日志打开每次休眠唤醒都自动记录PMIC的关键寄存器快照。等项目做久了你会发现这份日志救过好多次排查的命。

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

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

免费获取报价 →
↑