资讯动态

PMIC与MCU协同的嵌入式电源管理实战:从硬件到固件

发布时间:2026/10/24 3:05:37 来源:尧图企业网站定制
1. 项目概述为什么拿 PMIC 加单片机组团嵌入式设备的电源管理很多时候被当成点个灯、通个电的小事来处理。但真正做过电池产品的人都知道电源部分如果做得糙后面调试功能模块的时候会被一路坑回来。这个项目用 PCA9422 和 PIC18F45K50 做了一套完整电源管理PCA9422 负责把充电、路径切换、多路电压输出、保护策略这些硬件功能收拢到一颗芯片里PIC18F45K50 负责通过 I2C 控制它、解析状态、跑开关机逻辑顺便用 USB 上报电源信息。做这个项目之前我也觉得分立方案够用做完之后反而觉得凡是要长时间跑、要低功耗、要对外报状态的设备都应该认真考虑 PMIC 加 MCU 这种组合。这套方案适合什么场景手持仪表、低功耗传感器节点、便携健康设备或者任何需要锂电池充电加多路供电的嵌入式设备。不是说所有产品都要这么干但如果你的设备供电超过两路或者需要充电管理或者有复杂的低功耗需求那这套思路就有直接参考价值。1.1 分立电源方案为什么让人头疼先说说我为什么从分立方案走出来。早年做一款电池小设备电源部分长这样一颗 DCDC 转 5V两颗 LDO 分别转 3.3V 和 1.8V再串一颗单节锂电充电 IC。BOM 看着不贵但调试的时候问题特别集中。首先是上下电时序。MCU 上电时要等电源稳定传感器在某种电压下不能先启动这套顺序全靠硬件复位电路的延迟和电容充满时间硬凑。有一批板子因为电容容差导致上电时 MCU 先启动、外设还没就绪代码跑飞一下怎么查都查不出来最后才发现是供电时序漂了。其次是状态散。充电 IC 有没有在充、充到什么状态欠压没有过流没有这些信息零散分布在不同的芯片引脚上MCU 要靠一堆 IO 去轮询甚至好几颗芯片的故障标志都没法直接读到出了故障只能靠看现象猜。再有就是静态功耗。每一颗 DCDC 和 LDO 都有静态电流各几十微安五颗芯片加起来就接近 0.3mA对电池设备来说待机电流一下就超标了。把这些痛点倒过来看就明白 PMIC 加 MCU 这种架构的出发点把电源相关的功能尽量集中把状态信息尽量数字化把时序逻辑尽量交给软件。1.2 PCA9422 把电源功能收拢到什么程度说说 PCA9422 这颗 PMIC 在我项目里承担的角色。不同批次和封装后缀可能略有出入整体架构一致最终以数据手册为准。PCA9422 把这几件事集成在一起输入源管理、单节锂电池充电、多路降压输出、I2C 控制和中断输出。输入侧支持 USB 或适配器供电也支持电池直接接入。当 USB 插上的时候芯片内部自动做路径切换让 USB 给系统供电的同时给电池充电拔掉 USB 之后自动切到电池通路。这个路径切换是纯硬件完成的响应速度比 MCU 加外部电路做要快得多尤其能防边充边放这种尴尬局面。输出侧它提供多路电源。我这边一共用了三路一路 3.3V 给主控和传感器一路 1.8V 给逻辑电路一路可调的输出给板载外设。每一路的输出电压和限流点都能通过 I2C 或者外部引脚配置。对嵌入式系统来说这就省掉三颗独立电源芯片的外围电路。充电方面默认支持单节锂电充电电流、截止电压、温度保护都能配。板上接了一颗 NTC 电阻到电池附近充电过程中如果电池温度超了阈值PMIC 会自动中断充电这比我用分立方案时自己做温度判断要省心得多。1.3 PIC18F45K50 在这里的定位可能有人问PMIC 这么能干为什么还要一颗 PIC18F45K50 在旁边因为 PMIC 提供的是一堆寄存器和控制引脚它只会按照配置去执行和保护不会定义什么时候开机什么时候关机要不要上报异常这种系统策略。PIC18F45K50 就是这台设备的电源管家。PIC18F45K50 具备几个适合做这个活的底子I2C 主机外设用来读写 PCA9422 的配置和状态寄存器ADC 用来额外采集电池电压、温度这些模拟量USB 模块用来和上位机通信把电源状态通过 CDC 虚拟串口报出去中断输入接 PMIC 的 INT 引脚几秒钟内就能响应欠压、过流这类事件。再加上它本身是 8 位单片机功耗控制也不错待机时进入不同的低功耗模式整个系统在等待状态下能把电流压到很低。一套系统里两颗芯片配合一颗管硬件执行一颗管策略和通信各干各擅长的这是选择这个组合的根本原因。1.4 把电源策略放到单片机上的好处电源逻辑放在 MCU 固件里最大的好处是灵活。硬件不用改只要改寄存器初始化顺序就能调整上电时序只要改充电配置就能适配不同容量的电池。这对产品迭代来说太重要了。实际调试时也方便不用拿烙铁改电阻直接在串口上用命令读 PMIC 状态、改配置、观察效果。这种调试体验跟以前对着示波器猜波形是完全两回事。如果产品出事固件里还可以加日志把故障前 PMIC 的寄存器快照全部记录下来定位问题比硬件方案快一个量级。2. 硬件电路设计与关键参数计算2.1 电源拓扑USB、电池、系统三路关系从拓扑上看这套系统就是三进多出USB 5V 和锂电池进 PCA9422系统各负载从 PCA9422 的三路输出取电。USB 存在时PCA9422 把输入直接导向系统侧同时用充电通道给电池补电USB 拔出后电池通过内部开关接入系统。我在样板上的接法是这样的网络连接对象说明VBUSUSB 5V 输入经过 ESD 保护和输入电容后进 PCA9422VBAT锂电池正极直连 PCA9422 电池端板子没有做反接保护靠锂电池保护板兜底SYS_3V3PCA9422 输出 1给 PIC18F45K50 和传感器供电SYS_1V8PCA9422 输出 2给逻辑芯片供电SYS_VOUTPCA9422 输出 3可调输出我给外设模块用这里要特别提醒的是 VBAT 网络。锂电池电压范围大约是 3.0V 到 4.2VPCA9422 内部的充电管理和路径开关都在这条通路上PCB 布线时这条线要走粗而且尽量避免在背面打过孔因为充电电流可能到 1A 以上细走线压降会让单节锂电的欠压判断失真。2.2 外围元件的选择和布局细节PCA9422 外围看起来不复杂但有几个位置特别容易翻车。输入电容不能省。VBUS 入口至少要放一个 4.7uF 以上的陶瓷电容最好是 X5R 或 X7R 材质。我之前试过用 1uF 凑合USB 热插拔时会看到系统电压抖一下严重的时候直接触发 PMIC 的输入欠压保护表现为插上充电器系统重启。后来换成 10uF 加 0.1uF 组合问题消失。输出电感的选择也别随意。DCDC 输出电感我当时看手册推荐值选了一颗标称 2.2uH 的但没仔细看饱和电流只有 800mA结果负载超过 600mA 时输出电压开始波浪形下跌。后来换成饱和电流 1.5A 以上的电感纹波和带载能力都正常了。选电感时记住一句话饱和电流至少留 1.5 倍余量手册标的额定电流不等于饱和电流。I2C 上拉电阻也要注意。PCA9422 的 I2C 引脚通常需要上拉到其内部电源域很多时候是 VIO 引脚这个电压可能跟 MCU 的 3.3V 不一样。如果你的 VIO 接了 1.8V那上拉电阻不能直接拉 3.3V否则电平不匹配读出来全是乱码。我这边统一拉到 3.3V上拉电阻选了 4.7kΩ配合 100kHz 时钟没问题。布局方面开关节点走线要短。PCA9422 有几个开关输出引脚它们和电感之间的连线属于高频开关节点我做第二版板子时特意把电感放在芯片旁边 3mm 以内开关节点的铜皮面积控制在最小整版纹波降了不少。2.3 电池电压采样电阻的计算12 位 ADC 的分压设计PIC18F45K50 自带 12 位 ADC这给电池电压监测提供了很大方便。但 ADC 参考电压通常只有 2.048V 或者 3.3V而电池最高电压 4.2V不能直接采样必须先分压。我选择内部 FVR 做 2.048V 参考电压这样噪声比直接用 VDD 小。为了让电池满电时的采样电压落在参考电压范围内分压比需要满足VBAT_MAX × K 2.048V。取 K 0.34 左右4.2V 对应 1.428V留了不少余量。具体电阻取值R1 100kΩ接电池正极R2 51kΩ接地中间节点接 ADC 输入。分压比 K 51 / (100 51) ≈ 0.3377。电池满电 4.2V 时ADC 引脚电压约 1.418V电池放到 3.3V 时约 1.114V。12 位 ADC 对 2.048V 参考电压的分辨率是 2.048V / 4095 ≈ 0.5mV。换算到电池端电压分辨率就是 0.5mV / 0.3377 ≈ 1.48mV。这个精度对电量估算来说足够用了比很多号称库仑计但校准乱七八糟的方案还准。分压电阻要选高阻值。100kΩ 和 51kΩ 串联后从电池吸取的静态电流只有 4.2V / 151kΩ ≈ 27.8uA。待机时如果关不断这条通路这个电流一直耗着对低功耗设备是很大的浪费。所以我在 ADC 采样通路和地之间加了一颗 NPN 三极管做开关只有需要采样时才把分压电阻下端接地平时完全断开待机漏电流降到接近 0。2.4 开关机按键与中断引脚的接法系统需要一个可靠的开关机方式。我的接法是按键接 PCA9422 的 PWRKEY 引脚按下后 PMIC 会触发系统上电中断PIC18F45K50 在中断里读取按键状态启动系统。长按 3 秒则进入关机流程MCU 先保存电源状态再通过 I2C 让 PMIC 断开主输出系统进入完全关闭状态。PMIC 的 INT 引脚接 PIC18F45K50 的一个外部中断引脚配置为下降沿触发。PCA9422 在发生输入电压变化、充电完成、充电故障、电池欠压这些事件时都会拉低 INTMCU 不用轮询寄存器只要等中断就好。这里有个细节INT 引脚是开漏输出必须接上拉电阻到 MCU 的电源域否则电平永远浮空。我用的是 10kΩ 上拉实测响应没有问题。还有PCA9422 的 PWRKEY 引脚也最好加一个 100nF 左右的 RC 滤波避免机械按键抖动触发误动作。3. 固件实现I2C 配置与电源状态机3.1 I2C 底层驱动与寄存器读写封装PCA9422 是标准 I2C 从设备。PIC18F45K50 的 MSSP 外设配置成主机模式我先把时钟跑在 100kHz等通信稳定后再提升到 400kHz。开发阶段建议不要一上来就跑高速万一布线寄生电容大波形也不好看排查问题会麻烦很多。MSSP 配置主机模式的初始化代码大致这样void I2C1_Init(void) { // 配置 SCL/SDA 引脚为开漏输出 TRISCbits.TRISC3 1; // SCL TRISCbits.TRISC4 1; // SDA // MSSP 主机模式100kHz SSP1CON1 0x08; // I2C 主机模式 SSP1ADD 0x27; // 100kHz 16MHz Fosc SSP1CON1bits.SSPEN 1; }写寄存器函数可以直接做一个固定格式先发从机地址加写位然后发寄存器地址最后发数据。读操作则是先写寄存器地址再发从机地址加读位连续接收两个字节。uint8_t PMIC_ReadReg(uint8_t regAddr) { uint8_t val 0; // 发启动 从机地址 写位 I2C1_Start(); I2C1_Write(PMIC_I2C_ADDR 1 | 0); I2C1_Write(regAddr); // 重复启动 从机地址 读位 I2C1_Restart(); I2C1_Write(PMIC_I2C_ADDR 1 | 1); val I2C1_Read(0); // 最后一个字节发 NACK I2C1_Stop(); return val; }实际项目中我会把读到的寄存器值缓存到全局数组里避免每次查询都走一遍 I2C。因为电源状态寄存器短时间内不会频繁变化缓存可以降低总线负载也让代码逻辑更清晰。3.2 初始化流程先把 PMIC 配置和状态对账PIC18F45K50 上电后的第一件事不是跑业务逻辑而是先和 PCA9422 建立通信。我习惯的初始化顺序如下配置芯片时钟和 IO。初始化 I2C 主机。读 PCA9422 的 Device ID 寄存器确认通信正常。配置各路输出电压。配置充电电压、充电电流、温度阈值。清掉所有旧的故障标志。开中断使能。进入主循环。这个顺序有一个关键点清故障标志要在使能中断之前。如果你先开了中断再读故障寄存器很可能刚清完一个另一个故障又触发了中断风暴就来了。而先清标志再开中断PMIC 内部已经没有待处理的失败事件中断引脚不会因为残留状态被拉低。初始化配置代码示例void PMIC_Init(void) { // 检查通信 uint8_t id PMIC_ReadReg(PMIC_REG_DEVICE_ID); if (id ! PMIC_EXPECTED_ID) { // 通信异常点亮故障灯进入死循环等日志 while (1); } // 配置三路输出 PMIC_WriteReg(PMIC_REG_OUT1_CFG, 0x1F); // 3.3V PMIC_WriteReg(PMIC_REG_OUT2_CFG, 0x0E); // 1.8V PMIC_WriteReg(PMIC_REG_OUT3_CFG, 0x14); // 可调输出 // 充电配置 PMIC_WriteReg(PMIC_REG_CHG_CFG, 0x35); // 充电电流截止电压 PMIC_WriteReg(PMIC_REG_TEMP_CFG, 0x03); // 使能 NTC 温度保护 // 清除故障标志 PMIC_WriteReg(PMIC_REG_INT_CLR, 0xFF); }不同型号的寄存器地址和位定义会有差异实际移植时一定要打开数据手册把每个掩码都对一遍不要照抄网上代码。3.3 电源状态机从关机到故障处理电源管理逻辑如果只靠一堆 if 判断最多半个月就乱了。我把它拆成状态机状态之间只有明确的转换条件。状态进入条件主要动作退出条件POWER_OFF系统上电或长按关机关闭外设等待按键按键按下触发开机中断BOOT按键触发开机初始化外设、读 PMIC 状态、配置输出初始化完成RUNNING初始化完成正常业务逻辑、周期上报电源状态低电量或故障或关机按键CHARGING检测到 USB 接入且未满电使能充电、显示充电状态充电完成或 USB 拔出LOW_BATT电池电压低于阈值关闭耗电外设、降低主频、提示充电电压恢复FAULTPMIC 报告过压/过流/温度异常安全关机记录故障快照人工复位这个状态机里最容易出问题的是 RUNNING 和 CHARGING 的切换。USB 插上时PCA9422 会自动进入充电路径MCU 只需要通过中断感知事件再读寄存器确认状态。千万不要在中断服务函数里做长时间的操作正确做法是中断里只置一个标志位主循环里再去改状态。状态机代码骨架typedef enum { POWER_OFF, BOOT, RUNNING, CHARGING, LOW_BATT, FAULT } PowerState; PowerState state POWER_OFF; volatile uint8_t pmicIntFlag 0; void main(void) { PMIC_Init(); while (1) { if (pmicIntFlag) { pmicIntFlag 0; handle_pmic_interrupt(); } switch (state) { case POWER_OFF: wait_for_power_on(); break; case BOOT: boot_sequence(); state RUNNING; break; case RUNNING: if (is_usb_connected()) { state CHARGING; } break; case CHARGING: report_charging_status(); break; case LOW_BATT: save_critical_data(); break; case FAULT: shutdown_system(); break; } } }这套状态机跑了一个多月最直观的感受是新增一种异常状态很容易只需要加一个枚举值、一个 case、一个转换条件不会影响其他状态。以前用 if 堆逻辑加一个条件要反复检查会影响哪里头都大了。3.4 USB 接入检测与电量上报PIC18F45K50 自带 USB 控制器我可以把它做成一个 CDC 虚拟串口让上位机直接读取电源信息。USB 枚举要依赖 D D- 走线PCB 布局时这两根线别太绕。USB 接入检测不一定非要靠 USB 控制器PCA9422 的输入源状态寄存器里就有 VBUS 信息。MCU 在中断服务里读一下这个寄存器就知道刚才是不是 USB 插拔了。我两种方式都做USB 枚举成功与否用来区分只有充电还是连了电脑PMIC 寄存器状态用来做触发源。电量上报内容一般包括这些PMIC 状态寄存器的值比如充电中、充电完成、输入欠压、过流。电池电压通过 ADC 采样分压后的值再换算回实际电压。估算电量百分比我用的是一种简单的开路电压查表法因为系统负载稳定查表够用。故障标志如果 PMIC 检测到异常把标志位明文发上来。波特率用 115200上报周期 1 秒一次。实测 USB 线插上电脑上位机用串口工具打开 COM 口能连续收到一行行的状态数据排查故障时很直观。void report_power_status(void) { uint16_t adcVal adc_read_battery(); uint16_t mv (uint16_t)(adcVal * 2048L / 4095); uint16_t batMv (uint16_t)(mv * 296); // 除以 100换算回实际电池电压 printf(BAT%dmV CHG%s FAULT%04X\r\n, batMv, pmic_is_charging() ? ON : OFF, pmic_fault_reg); }3.5 低功耗与防掉电处理系统待机时PIC18F45K50 可以进入睡眠模式PCA9422 的电压输出继续维持。我测过待机电流大约 40uA 左右主要来自 PMIC 的静态功耗和少量漏电MCU 睡眠时的功耗已经可以忽略。睡眠前要做几件事把 ADC 采样通路的三极管关断彻底断开分压电阻的漏电。关闭无关外设时钟特别是 USB 模块如果不关功耗会明显偏高。把 PMIC 的 INT 引脚配置为唤醒源。把 MCU 的 IO 状态统一设置避免某些引脚在睡眠时悬空产生额外漏电。void enter_sleep(void) { // 断开分压电阻 ADC_SWITCH 0; // 关闭不用的外设 PMD0 0xFF; PMD1 0xFF; // 配置外部中断唤醒 INT0IE 1; SLEEP(); }这里容易踩坑的是 IO 状态。有的引脚在睡眠时如果既不是高也不是低而是靠内部上拉顶着那么漏电路径就产生了。我用万用表测待机电流时发现始终有 100 多 uA排查半天发现是一颗本来该被拉低的 GPIO 被配成了高阻输入内部上拉导致电流流向地。把这些引脚统一拉高或拉低后电流立刻降下来了。4. 调试现场故障排查与实测心得4.1 I2C 读回的数据全是默认值项目第一版样片焊接后我写了个轮询设备 ID 的测试程序结果读回来的值永远是 0xFF 或者固定值写寄存器也没有任何反应。排查步骤是这样的先量 SCL 和 SDA 有没有波形逻辑分析仪挂上去发现主机侧确实发数据了但从机没回应。怀疑从机地址错误重新查数据手册确认地址和手册一致。测 VIO 引脚电压发现 PCA9422 的 VIO 没有接电芯片的 I2C 接口完全没有参考电平。补焊 VIO 引脚后通信立刻正常。这个问题的教训是PMIC 的 I2C 接口不一定跟 VBUS 或 VBAT 走同一电源域很多芯片有单独的 VIO 引脚必须先确保它的供电正常。以后画板子VIO 这类引脚的电源网络一定要单独命名别和主电源混在一起。4.2 电池插上不充电另一个高频问题USB 插上系统能跑但电池电压始终不涨。检查了充电配置寄存器值也对充电状态寄存器就是显示未充电。一步步排查后发现是三件事先后起作用PCA9422 的充电使能位确实默认是打开的但 NTC 引脚接的电阻选型不对芯片检测到温度异常锁死了充电回路。换用正确阻值的 NTC 后充电状态变成了预充电但电流很小原因是充电电流配置寄存器里写了一个偏小的值。最后把充电电流调到规格书推荐值充电才正常进入恒流阶段。如果你也遇到充电不启动优先检查 NTC 引脚电压。用万用表量这个引脚的电压如果不在芯片规定的范围内充电就是启动不了。很多时候不是芯片坏了而是 NTC 电阻型号选错。4.3 一插 USB 系统就重启这个问题的现象是设备电池供电工作正常一插 USB 线系统瞬间断电重启。我用示波器抓 VBUS 的波形发现 USB 插入瞬间有一个负向毛刺同时系统的 SYS_3V3 也掉到复位阈值以下。原因有两层。一是 USB 热插拔时连接器弹片抖动VBUS 瞬间断开又接通产生欠压二是系统输入电容太小充电通路突然接入时大电流把电压拉垮。解决办法输入电容换成 10uF 并把 PMIC 的输入欠压保护阈值调低一点同时软件里做了一次 USB 事件去抖只有检测到 VBUS 稳定 100ms 后才允许切换充电状态。改完之后哪怕故意拿 USB 线快速插拔系统也不会重启。4.4 中断引脚被反复拉低调试到后面我发现 PMIC 的 INT 引脚经常拉低MCU 一直进中断什么都干不了。查逻辑分析仪看到 INT 引脚是连续的低脉冲。这是典型的中断风暴。PMIC 里只要有一个故障标志没有被读取它就会持续通过 INT 引脚通知主机。我最初的代码只在中断里读了一个状态寄存器没把其他故障标志清干净导致中断被反复触发。正确做法是进入中断后把 PMIC 所有状态寄存器都读一遍并将所有可清除的故障位全部写 1 来清除。清完再退出中断。如果你在处理过程中又来新故障下一次中断自然会触发不需要担心漏掉事件。void handle_pmic_interrupt(void) { // 读所有状态寄存器 uint8_t st1 PMIC_ReadReg(PMIC_REG_STATUS1); uint8_t st2 PMIC_ReadReg(PMIC_REG_STATUS2); // 清标志 PMIC_WriteReg(PMIC_REG_INT_CLR, 0xFF); // 根据 st1/st2 做业务判断 if (st1 PMIC_MASK_BATT_LOW) { change_state(LOW_BATT); } }4.5 用什么工具测电源才靠谱电源管理项目的调试工具我习惯四件套数字万用表、示波器、逻辑分析仪、热成像仪。测静态电流一定用万用表的微安档而且要等系统完全进入睡眠后再串联进电池回路。测纹波必须用示波器加接地弹簧不能用普通表笔表笔地线太长会形成天线测出来的纹波全是噪声。我试过用普通表笔量 3.3V 输出波形上一片毛刺换了接地弹簧后实际纹波只有不到 10mV。逻辑分析仪用来抓 I2C 波形最顺手。设置触发条件为从机地址一旦有读写波形直接抓下来对照数据手册逐位分析。热成像仪则是发现异常发热的利器板子上如果有某颗元件异常烫手热成像一眼就能看出来尤其适合排查 DCDC 电感饱和、PCB 走线过流这样的问题。5. 经验沉淀数据、布局和后续扩展5.1 实测数据待机、充电、纹波整个系统调完之后我记录了一组典型数据场景电流/电压说明系统待机约 40uAMCU 睡眠PMIC 维持输出分压电阻通路关断正常运行35mA 左右传感器和 MCU 工作USB 断开电池供电USB 充电时系统运行充电电流 800mA系统电流 35mAPMIC 路径管理正常不会边充边放3.3V 输出纹波8mV 左右示波器接地弹簧测量负载 200mA 时满载输出1A 持续 10 分钟电感温度 55℃ 左右没有触发保护充电从空电到满电大约用了 2 小时 20 分钟这个时间跟电池容量和充电电流基本吻合。整个 PMIC 的充电效率没有专门测过但充电过程中芯片表面温度上升不明显说明损耗控制得还可以。5.2 布局和初始化顺序的经验教训两版板子打样下来我总结出几条可以抄的规律。PCB 布局上PMIC 周边元件越紧凑越好尤其是电感、输入电容、输出电容。我第二版板子把电感从芯片旁边挪开了 5mm结果纹波从 8mV 涨到 18mV后来发现是因为开关节点的环路面积变大了。重新靠近后纹波恢复。开关电源布局环路面积就是一切。软件初始化顺序上永远记住先确认通信再配输出再配充电再清故障最后开中断。我见过有人先开中断再配置充电结果中断里收到一堆预充电阶段的状态变化日志刷屏主程序迟迟进不了正常流程。把中断放到最后开一切安静。寄存器缓存策略也建议加上。如果你的 PMIC 状态寄存器变化不频繁加一个软件缓存层读寄存器时优先读缓存只有缓存超时或收到中断时才真正走 I2C。这能明显降低总线占用也方便做快照。5.3 后续扩展方向这套架构做完之后扩展空间还很大。第一个方向是动态调压。PCA9422 的可调输出路可以通过 I2C 实时改电压我可以让 MCU 根据系统负载动态调整输出电压在负载低的时候把电压降一点进一步省电。第二个方向是加更完整的电量算法。目前用的是开路电压查表法适合负载恒定场景。如果需要更准的电量计可以在电池回路串一颗毫欧级采样电阻用电流积分法估算PIC18F45K50 的 12 位 ADC 配合采样保持能做到不错的效果。第三个方向是搞一个电源日志系统。PMIC 每秒钟上报一次状态MCU 把关键事件和寄存器快照存到板载 Flash 里掉电不丢。这样产品在用户手里出了异常拿回来直接读日志比现场复现故障效率高得多。我在这个项目里最大的体会是电源管理不是接个稳压芯片就完事而是要把它当成一个独立的功能模块来设计和调试。PCA9422 把硬件复杂度收拢了PIC18F45K50 把策略复杂度放到了固件里两者结合之后一套完整的电源管理系统就变得既能快速调试又能稳定量产。最后再提一句所有 PMIC 的寄存器地址和位定义我都建议整理成一份 Excel 对照表调试时放旁边随时查这比现翻数据手册快太多了。

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

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

免费获取报价 →
↑