PCA9422与PIC32MX675F256L的便携设备电源管理设计与实现 之前做一款便携式检测设备的时候电源部分一直是我的心病。整机需要从锂电池取电同时给主控、屏幕、传感器、通信模块分别供电还要兼顾充电、电量显示和低功耗待机。一开始用的是分离方案LDO 加专用充电 IC 再加几个 DCDCBOM 拉得很长待机电流也一直压不下去。后来我把方案换成了 PCA9422 这颗 PMIC 配合 PIC32MX675F256L 单片机来做整套电源管理效果立竿见影待机功耗降了一个数量级充电曲线平滑可控系统也终于有了一个像样的“电源状态机”。这篇文章就从头到尾复盘一下这个项目的设计思路、硬件接法、固件实现和调试过程重点讲清楚 PCA9422 和 PIC32MX675F256L 之间怎么配合以及那些数据手册上不会写但实际一定会踩的坑。1. 项目背景为什么用两颗芯片做电源管理1.1 需求从哪来先交代一下项目背景。设备是一个电池供电的便携式数据采集终端主控选型是 PIC32MX675F256L外设包括一块串口屏、两个模拟传感器和一路 4G 模块后来换成了低功耗无线模块。整机的供电需求大致分四路主控 3.3V、传感器 3.3V 模拟轨、通信模块 3.8V 瞬态 2A、屏幕背光 5V。电池是一节 18650 锂电容量 2600mAh需要支持 USB 充电和电量百分比显示。最初我打算沿用老做法充电用独立充电管理芯片三路输出用三个 DCDC电量显示另加一颗库仑计。结果一算 BOM光电源部分就有七八颗芯片再加上电平转换、使能控制、状态指示PCB 面积直接被吃掉一大块。更要命的是这些器件之间没有统一的状态管理充电状态、负载状态、低功耗状态全靠主控 GPIO 硬拉代码里堆满了补丁式的 if else调试起来非常痛苦。后来我重新梳理需求发现其实可以把“充电、电量计、多路 DCDC、状态监控”全部收拢到一颗 PMIC 里。于是选型落在了 PCA9422 上。它是一颗面向应用处理器的电源管理芯片集成三路降压转换器、锂电池充电管理、USB 检测和高精度电池电量监测全部寄存器可读写。而 PIC32MX675F256L 作为系统主控通过 I2C 接口和中断引脚配合就能把所有电源行为变成可编程状态机。1.2 PCA9422 到底管了什么先说清楚 PCA9422 内部到底集成了哪些东西这决定了后面的系统架构。第一是三路高效的降压稳压器代号分别是 BUCK1、BUCK2、BUCK3。每路输出电压都可以通过寄存器独立配置支持动态调压。其中我一直把它当作“主供电轨”来给 PIC32 的 3.3V 供电另外两路分别给传感器和通信模块。三路 BUCK 都支持 PFM/PWM 自动切换轻载时进 PFM 模式静态电流很低。第二是完整的锂电池充电管理单元。它支持 USB BC1.2 检测可以识别 SDP、CDP、DCP 三种充电端口并据此限制最大充电电流。充电过程是标准的 CC/CV 两段式截止电流、浮充电压、充电电流都可通过寄存器调整。这一点比很多独立充电芯片灵活得多——不需要更换外部电阻来改充电电流固件直接写寄存器就行。第三是电池电量监测。PCA9422 内部有库仑计和电压检测通道可以实时读取电池电压、充放电电流和累积电荷。不是简单地用电压查表估算而是具备学习校准能力这对便携设备显示剩余电量非常有价值。第四是各种保护和状态检测。包括输入过压、电池过流、过温保护还有中断输出引脚。PMIC 状态变化时INT 引脚会拉低通知主控主控再通过 I2C 读取中断寄存器判断具体事件。这种事件驱动方式比轮询省电得多。1.3 PIC32 在这里扮演的角色PIC32MX675F256L 有 256KB Flash跑 MIPS M4K 内核主频最高 80MHz外设里有多个 I2C 接口和几十个 GPIO。在这个方案里它不参与电源功率通路只做“电源管理的大脑”。具体职责分成三块。第一块是初始化配置上电后通过 I2C 把 PCA9422 的稳压器输出电压、充电参数、中断屏蔽位全部写好。第二块是运行期管理监听 INT 中断线一旦有 VBUS 插入、充电完成、电量低等事件就读取状态寄存器并根据当前系统负载动态调整 BUCK 输出电压。第三块是低功耗协同整机进入休眠前主控把 PMIC 切到低功耗模式同时自身也进入 IDLE 状态靠 PMIC 的中断把整个系统唤醒。之所以没有直接用 PCA9422 默认配置是因为默认配置面向的是应用处理器场景部分输出电压和时序不一定匹配我们的负载。PIC32 通过软件接管这些寄存器后系统实现了“一套固件适配不同电池和负载”的效果这在后期产品迭代中省下了大量返工。2. 硬件设计要点引脚、电源轨与板级布局2.1 系统供电拓扑和引脚连接先给整机供电拓扑画个清晰的关系USB 5V 进来后先到 PCA9422 的 VBUS 引脚锂电池正极接 BAT 引脚系统主供电由三路 BUCK 输出。BUCK1 配置成 3.3V直接给 PIC32MX675F256L 和数字逻辑供电BUCK2 配置成 3.3V 模拟轨给传感器供电软件里可以做独立开关BUCK3 配置成 3.8V给通信模块供电。PCA9422 与 PIC32 之间只连接四根线I2C 的 SCL、SDA中断输出 INT以及一个系统级的 ON 信号。ON 信号用来控制 PMIC 的软启动和关机由 PIC32 的一个 GPIO 驱动也可以接按键开机关机。这里建议 ON 引脚不要直接用 GPIO 高电平驱动而是用一个 MOS 管或三极管做电平转换因为 ON 引脚的逻辑电平和主控 I/O 电平不一定完全匹配直连容易出奇怪问题。PIC32 的供电则取 BUCK1 的 3.3V 输出再经过一个磁珠和一组 100nF10uF 的电容去耦后接入 AVDD/VDD。千万不要让 PIC32 直接从电池取电——虽然芯片规格书上说工作电压范围包含 3.0V 左右但电池电压在放电末端会掉到 3.0V 以下这时候主控跑在欠压状态Flash 操作很容易异常。2.2 关键外围电路怎么选PCA9422 的 DCDC 引脚对电感、电容是敏感的很多朋友第一次画板随便拿了个工字电感焊上去结果纹波大、压降差、甚至啸叫。我这里分享几个实测下来靠谱的参数选择思路。第一是降压电感。三路 BUCK 的推荐电感值范围可以从数据手册查到但实际选型时最好按输出电流峰值和开关频率估算一下。以 BUCK3 为例输出 3.8V、最大电流 2A开关频率典型值在 1MHz 以上电感纹波电流按输出电流的 30% 计算感值大致落在 2.2uH 到 4.7uH 之间。我最终选了 2.2uH、饱和电流 3A 的一体成型电感好处是饱和电流余量大、屏蔽好、不会干扰旁边的模拟传感器。注意不要为了省钱选工字电感它在 DCDC 开关频率下辐射非常明显会让 ADC 采样值抖动。第二是输入输出电容。VBUS 输入端要放一个 1uF X7R 再加一个 22uF 的陶瓷电容用来应付 USB 热插拔的浪涌。电池端 BAT 引脚要放至少 10uF 陶瓷电容放在离芯片最近的位置。每个 BUCK 输出端建议 22uF 加 100nF 的组合不要为了省空间删掉 100nF它对高频纹波抑制很关键。第三是 I2C 上拉电阻。PCA9422 的 I2C 引脚是开漏结构需要外部上拉。我一开始用 10k 上拉400kHz 通信时波形上升沿很慢SCL 高电平时间不足偶发通信失败。换成 4.7k 之后稳定了但如果你把 I2C 总线拉得很长、挂载设备多可能还要进一步换成 2.2k。上拉电阻值需要根据总线上实际负载电容来调整不能照搬。2.3 板级布局注意事项不说玄学只讲我踩过的实际教训。电源板第一原则反馈走线、开关节点、地回路必须分清。PCA9422 的 BUCK 开关节点是高频高 dv/dt 信号要把它限制在顶层一小块铜皮内不要延伸出去回流地要直接回到芯片底部的散热焊盘。反馈检测走线尽量从负载端单独引出不要靠近电感。第二原则I2C 和中断线要远离开关节点。之前有一版 PCBI2C 走线刚好从 BUCK2 电感下方穿过结果通信时好时坏示波器一量SCL 上叠加了接近 100mV 的开关噪声。后来把走线挪到另一层用地平面隔开问题消失。第三原则电池连接器附近要有 ESD 防护和缓启动。手持设备经常在电池触点处产生放电我在 BAT 正极线上加了 TVS 管和一个 2.2Ω 电阻作为缓充防止热插拔瞬间给输入电容充电产生过压。PCA9422 自身有过压保护但外部加一道防护总是更稳妥。3. 固件架构从寄存器到状态机3.1 I2C 通信基础与地址PCA9422 的 I2C 从机地址是 0x247 位地址换算成 8 位写地址是 0x48。如果你用 PIC32MCC 的 I2C 驱动注意接口里填的到底是 7 位地址还是 8 位地址这一步错后面全错。I2C 通信速率我建议直接用 Fast Mode 的 400kHzPCA9422 支持PIC32 的 I2C 外设也支持。读写寄存器的方式是标准的先发芯片地址再发寄存器地址然后连续读写数据。大部分寄存器是 8 位少部分是多字节多字节的时候要留意数据手册里的大小端顺序。我写驱动时统一按“小端”处理所有多字节读回来的数据先组成 uint16_t再按手册里的位定义解析。给一段最简单的读取芯片 ID 的示例代码环境用 MPLAB X 和 PIC32 裸机寄存器方式。这里为了便于理解做了必要的精简。#include xc.h #define PCA9422_I2C_ADDR7 0x24 #define PCA9422_REG_DEV_ID 0x00 uint8_t pca9422_read_reg(uint8_t reg) { uint8_t val 0; // 发送 START I2C2CONbits.SEN 1; while (I2C2CONbits.SEN); // 发送器件地址(写) I2C2TRN (PCA9422_I2C_ADDR7 1) | 0; while (I2C2STATbits.TRSTAT); // 发送寄存器地址 I2C2TRN reg; while (I2C2STATbits.TRSTAT); // 重发 START I2C2CONbits.RSEN 1; while (I2C2CONbits.RSEN); // 发送器件地址(读) I2C2TRN (PCA9422_I2C_ADDR7 1) | 1; while (I2C2STATbits.TRSTAT); // 读取一个字节 I2C2CONbits.RCEN 1; while (!I2C2STATbits.RBF); val I2C2RCV; // 发送 NACK 和 STOP I2C2CONbits.ACKDT 1; I2C2CONbits.ACKEN 1; while (I2C2CONbits.ACKEN); I2C2CONbits.PEN 1; while (I2C2CONbits.PEN); return val; }这段代码没有用 PLIB 库直接操作寄存器真实项目中我更推荐这种底层方式来做 PMIC 驱动因为时序完全可控出问题也好排查。当然你用 MPLAB Harmony 的 I2C 库也一样但至少初始化序列建议自己读一遍。3.2 初始化序列从默认值到可用状态PCA9422 上电后默认寄存器和我们期望的配置大概率不一致。默认配置偏向某系列应用处理器的上电时序直接把负载挂上去可能输出电压不对或者时序不满足要求。所以固件里要有一套明确的初始化序列我把它分成五步。第一步确认 I2C 通信正常。上电后延时 100ms 等待 PMIC 内部 LDO 稳定然后读 DEV_ID 寄存器核对是否等于预期值。如果读不到先不要急着查软件用示波器看 SCL/SDA 上有没有波形很多时候是硬件问题。第二步配置三路 BUCK 输出电压。通过稳压器相关寄存器把 BUCK1、BUCK2、BUCK3 分别设置到目标电压。这里有个关键点PIC32 工作在 3.3V而默认配置可能是 1.8V 之类所以 BUCK1 必须在主控完全启动之前就收敛到正确电压。虽然 PMIC 是上电即默认输出但主控 I2C 初始化很快可以在 main 函数最开始就把电压改到位负载端用一个大电容缓冲不会出现掉电重启。第三步配置充电参数。根据电池规格写入浮充电压、最大充电电流、截止电流。比如我的电池是 4.2V 满充充电电流限制在 1A截止电流 100mA。同时开启充电安全定时器防止电池异常导致无限充电。第四步配置中断屏蔽。设定哪些事件需要触发 INT 引脚哪些事件只要置位状态位即可。我的策略是VBUS 插入、充电完成、充电异常、电量低、BUCK 输出电压变化完成这五类事件打开中断其它事件关掉。中断屏蔽做对了主控才能安心睡觉。第五步读取一次全状态寄存器做合格性检查。比如确认 BUCK1 输出就绪位为 1充电状态为 No Charge 而不是 Fault然后把连接状态标志清零进入正常监听循环。3.3 稳压器配置与动态调压三路 BUCK 的输出电压配置在 PCA9422 里是通过寄存器字段控制的有更细的步进值所以不要直接用浮点运算去换算最好建一个静态映射表。比如 BUCK1 有 0.6V 到 3.3V 的调节范围步进一般是 25mV 或 50mV按手册写死映射数组用目标电压查表得到寄存器值。这样代码里不会有任何除法也防止边界值算错。动态调压是这个项目里非常实用的一个功能。设备跑在正常采样模式下BUCK3 给通信模块供电只需要 3.3V切到发送模式时模块需要 3.8V 保证射频功率。如果始终按 3.8V 供电传输效率会下降模块发热也大。所以我在状态机里加入动态调压进入发送模式前 5ms 把 BUCK3 从 3.3V 升到 3.8V发送完成后延时 10ms 再降回 3.3V。整个过程实测纹波没有明显增加DC-DC 的瞬态响应完全可以接受。这里提醒一件事改 BUCK 输出电压后不要立刻去读输出就绪位PMIC 内部需要几个毫秒的转换时间。我最初没加延时改完电压马上置负载工作结果有一个批次出现通信模块冷启动失败。后来在改电压后轮询就绪位确认稳定后再继续问题就消失了。bool set_buck_voltage(uint8_t buck_idx, uint16_t mv) { uint8_t reg_addr BUCK1_VOUT_REG buck_idx * 2; // 示意 uint8_t val mv_to_reg(buck_idx, mv); pca9422_write_reg(reg_addr, val); // 等待输出完成 for (int wait 0; wait 50; wait) { uint8_t st pca9422_read_reg(PWR_STS_REG); if (st (1 buck_idx)) return true; delay_ms(1); } return false; }3.4 充电管理状态机充电管理是“完整电源管理”的核心也是最容易写出 Bug 的部分。我的经验是不要用一堆散落的 if 判断充电状态而是显式写一个充电状态机包含以下状态无电源、VBUS 等待、预充、恒流充电、恒压充电、充电完成、充电异常和充电超时。PCA9422 的中断机制是边沿触发比如 VBUS 插入会产生一个下降沿中断主控读取中断寄存器后清零才能接收下一个中断。因此状态机里所有状态跳转都应由“中断事件 标志位查询”驱动。代码结构类似下面这样void power_management_task(void) { uint8_t int_flags pca9422_read_reg(INT_STATUS_REG); if (!(int_flags 0x80)) return; // 无事件 if (int_flags VBUS_INSERTED) { charger_state CHG_STATE_DETECT; } if (int_flags CHG_COMPLETE) { charger_state CHG_STATE_FULL; } if (int_flags CHG_FAULT) { charger_state CHG_STATE_FAULT; } switch (charger_state) { case CHG_STATE_DETECT: // 读取 BC1.2 检测结果 uint8_t port_type pca9422_read_reg(USB_STATUS_REG); set_charge_current_by_port(port_type); charger_state CHG_STATE_CC; break; case CHG_STATE_CC: // 恒流阶段等待电压升到 CV 阈值 break; case CHG_STATE_CV: // 恒压阶段等待截止电流 break; case CHG_STATE_FULL: // 充电完成关闭充电通路等待 VBUS 移除或电池电压回落 break; default: break; } pca9422_clear_interrupt(int_flags); }充电状态机里有一个容易被忽略的问题充电完成之后如果负载还在耗电电池电压会回落PMIC 可能会重新开启充电这样在“充满-再充”之间反复跳变影响电池寿命。PCA9422 内部有充电完成迟滞逻辑但实际测试中如果你在充电完成时把系统重负载全部打开电池电压会立刻掉到浮充阈值以下PMIC 又重新开始充电。我的解决办法是把充电完成事件和系统负载关联起来一旦进入充电完成状态就先把非必要负载切断让电池静置 30 秒再判断是否需要补电。这个策略简单但是非常有效。4. 电量监测与系统交互4.1 电量计原理与校准PCA9422 的电量监测不是单纯的电压查表而是基于库仑计来累加电池进出的电荷。库仑计精度高但有个前提是必须知道“满”和“空”两个参考点。这就像你用雨量计测水位得先把桶确定了否则累加一个浮动的量毫无意义。我在项目中做了两次校准。第一次是“满充校准”系统显示 100% 时实际让充电电流降到截止电流以下并且电池电压稳定在规定浮充电压附近然后向 PMIC 写入满充标定值。第二次是“空点校准”电池放电到保护板截止电压前记录空点写入空容量值。校准之后电量百分比读数就准了很多误差能控制在 5% 以内。一个需要注意的坑是电池老化后实际容量会下降满充标定点如果不更新电量计会慢慢偏大。所以产品里要设计定期或按循环次数触发重新标定的逻辑。PCA9422 支持通过寄存器读取循环次数或累积容量我的做法是每累计 50 个完整充放电循环系统提示用户执行一次校准。这不是必须功能但做了之后电池用到一年以后的显示会准确很多。4.2 系统状态读取主控需要知道的不只是电量百分比还有实时电压、电流、温度这些参数。电池电压和电流用于运行时估算剩余时间温度用于充电保护和负载降频。PCA9422 里这些值都映射在多字节寄存器中读取后要按手册给的 LSB 值换算成真实物理量。比如电压寄存器 LSB 可能是 1mV 或 0.1mV电流可能是 1mA不同型号和固件版本会有差异所以换算系数一定要从确认过的版本手册里抄不要凭感觉猜。实际读取时我倾向于每秒钟采样一次电池电压和电流每 10 秒更新一次电量百分比每 30 秒读取一次温度。这样既不会让 I2C 总线太忙也能保证显示数据不跳动。读取的原始数据先存到一个结构体里再做滤波和单位换算。滤波我用的是简单的一阶低通filtered 0.8 * old 0.2 * new。够用而且代码很少。4.3 低功耗模式联动便携设备逃不开低功耗设计。整机待机时除了 PMIC 和主控其余负载都要断电。我的联动策略是PIC32 在进入休眠前先把 BUCK2 输出关闭传感器不用了把 BUCK3 调到最低可用电压然后关闭内部外设时钟只保留 I2C 和外部中断唤醒功能最后执行 sleep 指令。PCA9422 这边有一个全局的低功耗设置让所有 BUCK 进入 PFM 模式同时关闭充电检测和 BC1.2 检测的周期性扫描但保留中断引脚有效。这样 PMIC 待机电流会降到非常低的水平整机从电池取出的电流实测在几十微安这个量级配合 2600mAh 电池理论待机时间很长。实测下来整机待机从原来的 2mA 降到 80uA 左右这个提升对电池设备来说体验差异极大。需要注意PIC32 从休眠中被 PMIC 中断唤醒后不要马上执行重负载操作。先延时 5ms 等 BUCK 输出完全稳定再恢复传感器供电否则会出现上电瞬间电压跌落。这个和动态调压的等待是同一个思路核心就是“电源转换需要时间软件必须尊重它”。5. 调试经验与问题排查5.1 I2C 通信偶发失败怎么排查I2C 通信问题在 PMIC 调试里出现频率最高。我这里整理几种典型场景。第一种是上拉电阻过大会导致上升沿太慢。现象是通信速度一快就出错降到 100kHz 正常。排查方法很简单示波器看 SDA 的上升沿如果高电平建立时间超过 1us就要减小上拉电阻。注意在低功耗模式下主控可能关闭了内部上拉外部上拉必须保留。第二种是总线被拉死。SDA 一直低。这种情况通常是软件里 I2C 状态机没处理异常比如从设备应答超时后没有发 STOP总线就锁住了。PIC32 的 I2C 模块有总线清零功能检测到总线空闲超时后强制释放我在固件里加了一个超时看门狗每次通信超过 100ms 没完成就复位 I2C 外设。第三种是地址错误。PCA9422 的 7 位地址 0x24写地址 0x48读地址 0x49。如果你按 8 位地址在驱动里填了 0x24那就是在找一个不存在的设备。这个错误一般发生在移植别人代码的时候检查一下注释就很明显。5.2 充电异常、充不满或完全不充充电相关的问题要分情况看待。如果完全不充先量 VBUS 上是否有 5V。有些 Type-C 座子需要 CC 引脚接下拉电阻才能让适配器输出 5V而不是插上就有电。PCA9422 的 BC1.2 检测也能识别但识别的前提是 VBUS 存在。所以我会单独让主控读取 VBUS 状态位如果状态位为 0那问题大概率在座子或适配器侧不在 PMIC。如果充得很慢最可能的原因是 BC1.2 检测识别到了 SDP也就是电脑 USB 口的标准下行端口这种端口默认最大只有 500mA。但我实际调试中发现很多充电头并不完全符合 BC1.2 规范PCA9422 可能识别成 SDP导致只给它 500mA。解决办法是在固件里加一个覆盖逻辑如果系统检测到用户选择了“快速充电”模式直接把充电电流寄存器写到 1A而不再依赖检测结果。当然这需要整机散热能撑住。如果充电提前完成检查截止电流设置。截止电流设得太大电池实际还没充满就判定为完成。标准做法是设成 0.05C 到 0.1C也就是对于 2600mAh 电池截止电流在 130mA 到 260mA 之间。我实际设了 150mA肉眼可见地比默认值多充进去一些电。5.3 硬件设计上的坑和经验这里写的都是实际项目中踩过的、翻过车的问题分享给各位。第一个坑是 BUCK 输出电容的类型。输出电容尽量用 X5R 或 X7R 的陶瓷电容不要用 Y5V。Y5V 电容在直流偏压下容量会掉很多设计值 22uF实际可能只剩 8uF导致环路不稳定动态响应变差。同样芯片引脚处的电容必须靠近引脚距离超过 5mm 效果就大打折扣。第二个坑是电感啸叫。轻载时 BUCK 进入 PFM 模式开关频率可能落在人耳听觉范围附近如果电感质量不好就会发出吱吱声。解决办法有三个一是选用有屏蔽罩的一体成型电感二是调整 PFM 模式的最低频率三是在轻载时强制切 PWM 工作模式。PCA9422 里可以通过寄存器强制工作在 PWM 模式代价是轻载电流稍大但如果你整机并不常在超轻载下运行强制 PWM 完全没问题。第三个坑是地弹。PMIC 的功率地和小信号地建议单点连接。我第一版 PCB 为了铺铜方便把模拟地和功率地大面积连在一起结果 ADC 读数在通信模块发射时会跳十几毫伏。后来改成芯片底部散热焊盘做单点汇聚ADC 采样稳定了很多。5.4 常见问题速查表把项目中经常遇到的问题整理成表格排查的时候顺序走一遍能省不少时间。现象可能原因排查方法解决措施I2C 通信失败上拉电阻过大 / 地址错误 / 总线锁死示波器看 SCL/SDA 波形核对 7 位地址上拉改 4.7k按 0x24 填地址增加总线超时复位BUCK 输出电压偏低电感饱和 / 反馈走线错误 / 电容老化测开关节点波形检查负载电流是否超电感饱和换高饱和电流电感重新布局反馈线充电电流不受控BC1.2 识别异常 / 寄存器配置被覆盖读回充电电流寄存器对比实际电流固件增加充电电流覆盖逻辑电量显示跳动滤波不足 / 地弹干扰观察 ADC 采样序列增加一阶低通滤波改进地平面处理整机无法进入低功耗中断引脚被长期拉低 / 定时器未关量 INT 引脚波形检查唤醒源正确配置中断屏蔽和 GPIO 唤醒模式通讯模块冷启动失败电压建立时间不足示波器测 BUCK3 输出时序调压后轮询就绪位增加延时表格里的每一条都是我在项目里真实遇到并解决过的拿去对照你自己的现象会很有帮助。这次把电源管理全部收进“PCA9422 PIC32MX675F256L”的架构之后一个很明显的感受是电源不再是硬件上的一堆分立元件而是变成了固件里一个可调试、可升级、可复用的状态机。后期我们调整电池容量、更换通信模块只需要改寄存器配置和状态机分支PCB 基本不用动。个人体会是调试 PMIC 一定不要怕看数据手册把每个用到寄存器的 bit 都标出来最好也不要嫌初始化代码繁琐一次调通了后面所有电源故障排查都会变得轻松很多。尤其是充电状态机那部分一定要画清楚跳转条件再写代码这是本方案里最值钱的经验。