拿到一个电池供电的嵌入式项目,我最先画的不是 MCU 最小系统,而是整棵电源树。PIC18F45K80 这类 8 位 MCU 本身功耗并不高,但整套系统一旦接入无线模块、传感器、执行机构,各个电压轨的需求就会立刻变得复杂:有的要持续低纹波供电,有的需要大电流瞬态响应,还有的必须在待机时彻底断电。用分立器件搭出这样一套电源并不难,难的是让充电管理、升降压、电压监测、低功耗切换这些环节长期协同工作。实践下来,PCA9422 作为电源前端芯片、PIC18F45K80 作为主控与策略调度,是一个成品率很高、也方便维护的搭配。下面从选型逻辑讲起,一直写到 I2C 寄存器级实现和调试踩坑,希望对正在设计同类方案的你有参考价值。
1. 为什么让 PCA9422 和 PIC18F45K80 组队:选型逻辑与任务边界
1.1 电池供电系统的三种电源方案:从分立到集成
很多人做低功耗产品时,第一反应是"MCU 选低功耗的,其他器件也选低功耗的,系统自然就省电了"。这句话方向没错,但忽略了一个关键点:电源转换本身的损耗和待机漏电流,往往比负载芯片标称的功耗更致命。一颗 LDO 静态电流几十微安,系统里挂三五颗,待机电流就下不去了。所以现在做电池产品,基本上逃不开下面三种电源架构:
| 方案类型 | BOM 数量 | 可配置性 | 静态功耗 | 调试难度 | 适合场景 |
|---|---|---|---|---|---|
| 全分立:充电 IC + 独立 LDO + 独立 DC-DC + 电压比较器 | 多 | 差 | 偏高 | 高 | 对成本极度敏感、规格固定的量产件 |
| 半集成:充电 PMIC + 分立 DC-DC | 中 | 中 | 中 | 中 | 需要灵活调整电压轨、有一定调试能力 |
| 集成 PMIC + MCU 策略调度 | 少 | 强 | 低 | 低 | 多电压轨、有低功耗要求、需要实时监控 |
全分立的做法不是不行,但它有一个隐藏问题:上电时序和掉电时序完全靠 RC 延时和电源监控芯片去"猜",不同批次器件参数稍有漂移,时序余量就会变化。半集成方案灵活一些,但充电管理和 DC-DC 之间没有统一的状态反馈,MCU 想拿到"现在是不是在充电""当前输出电流多大"这些信息,还得额外接采样电阻和 ADC,电路又变复杂了。
PCA9422 这一类集成 PMIC 把充电管理、多路降压转换器、电压监测、电源路径管理、上电时序控制打包在一起,而且通过 I2C 总线往外暴露状态,这让它和 MCU 之间不再是"各自独立工作"的关系,而是真正可以协同调度。PIC18F45K80 正好具备 I2C 主模式、多个外部中断、低功耗休眠唤醒这些外设,用它来指挥 PMIC 非常合适。
1.2 能量转换与策略决策的分工逻辑
打个比方:PCA9422 像是一个发电厂,负责把电池里的能量高效地转换成系统需要的各种电压轨;PIC18F45K80 则是电网调度中心,决定什么时候让哪一路电压轨工作、什么时候切到充电、什么时候进入低功耗。PMIC 本身虽然能完成很多电源管理动作,但它没有"业务逻辑",它不知道当前系统处于运行、待机还是充电状态,这些判断必须由 MCU 来做。
这种分工还有个容易被低估的优势:PIC18F45K80 这类 8 位 MCU 本身功耗很低,而它只需要在"事件发生"的时候才去操作 PMIC。比如充电状态变化、PMIC 故障、按键唤醒、定时唤醒,这些都用中断或低功耗定时唤醒来处理,不需要让 MCU 一直满频运行。于是整个系统的平均功耗可以做得非常低,同时又保留了完整的电源管理能力。
1.3 系统级连接关系:从电池到电压轨再到 MCU
把系统框架用文字描述一下,方便后面讲原理。整条链路是这样的:
电池正极进入 PCA9422 的 VBAT 输入,PCA9422 内部完成充电管理后,从充电通路给电池充电;系统主供电路径从 USB 或适配器输入取电,同时 PCA9422 内部降压转换器输出两到三路电压轨,比如 3.3V 给数字逻辑、1.8V 给传感器或模拟电路。PIC18F45K80 挂在其中一路电压轨上,它的 I2C 引脚分别接到 PCA9422 的 SCL 和 SDA,PMIC 的中断输出 INT 接到 MCU 的一个外部中断引脚。
除此之外,PCA9422 的电池温度检测引脚接一个 NTC 热敏电阻到电池附近,用来做充电温度保护;MCU 还可以通过内部 ADC 采集电池电压和系统电流采样信号,形成双重监控。也就是说,PMIC 自己有一套硬件保护,MCU 又有一套软件策略,两层保护互相兜底。后面讲到低功耗和电池保护时,这个结构会反复出现。
2. PCA9422 的能力拆解:充电、降压输出与上电顺序
2.1 充电管理的关键参数与快速计算
PCA9422 的充电管理部分遵循锂离子电池最常见的充电曲线:涓流充电、恒流充电、恒压充电、充电截止。理解这条曲线的关键在于,配置充电电流时不是越大越好,而是要根据电池容量和系统自身功耗来折算。
举个例子,一块 2000mAh 的电池,如果希望 2 小时左右充满,恒流阶段电流大概可以设置到 0.5C 也就是 1A。但如果系统在充电的同时还在满负荷运行,消耗 300mA,那实际给电池的充电电流就只有 700mA,充满时间会变长。反过来,如果电池规格允许 1C 充电且散热条件足够,也可以把电流设到 1A 或更高。这里有个设计红线:充电电流必须同时低于电池规格书标称的最大充电电流、充电 IC 允许的最大电流,以及电路板走线和连接器能承受的电流,三条全部满足才能定了。
恒压阶段的截止电压通常设置为 4.2V,也有些电池标称 4.35V,需要在寄存器里改配置。充电完成之后,PMIC 并不会彻底停止监测,而是当电池电压回落到再充电阈值时重新开始充电,否则系统放掉一点电又充满,会反复触发充电流程,对电池寿命和 PMIC 都不友好。
2.2 多路输出轨的配置思路
电池供电系统里几乎不可能只有一路电压轨,常见情况是 MCU 要 3.3V,传感器或存储需要 1.8V,无线模块可能要 3.3V 但瞬态电流很大。PCA9422 内部集成多路降压转换器,就是为了避免为了多路电压去堆一堆独立的 DC-DC 芯片。
设计多路输出时,我的习惯是先列一张电压轨清单,每一行写清楚:负载是谁、峰值电流、平均电流、允许纹波、是否需要在休眠时断电。这张表直接决定每一路输出的配置,也决定后级要不要再加 LDO 稳压。比如模数转换的参考电压对纹波非常敏感,即使 PMIC 输出的 3.3V 纹波已经控制在几十毫伏,也建议在模拟部分单独加一级低噪声 LDO,不要让数字电路和模拟电路直接共享同一路电源轨。
PCA9422 的每一路降压输出通常都有独立的寄存器来设置输出电压。配置时要注意输出电容和电感的选择要和补偿网络匹配,如果为了省空间把电感选得太小,瞬间负载变化时输出电压会出现明显跌落,严重时会导致 MCU 复位。
2.3 上电时序为什么必须可编程
在多电源轨系统里,上电时序比很多人想象的重要。最典型的例子是:MCU 内核电源已经稳定,但 I/O 电源还没起来,这时如果 I/O 引脚上连接的外设提前上电,电流会通过引脚的保护二极管倒灌进 I/O 电源轨,导致 MCU 进入不确定状态,甚至闩锁损坏。
PCA9422 的可编程上电时序就是解决这个问题的。初始化时给每一路输出配置不同的延迟时间,让核心电压先建立,外设电压后建立,保证任何时刻都不会出现电流倒灌路径。掉电时序同样要配置:系统进入休眠或彻底关机时,应该先关闭外设电源轨,再关闭核心电压轨,顺序反过来就会产生掉电毛刺,下次唤醒时 MCU 可能死机。
2.4 配置项汇总:一个可参照的初始化表格
下面这张表是我在一个典型低功耗采集系统上会用到的配置项,具体寄存器地址和取值以数据手册和原理图为准,但配置思路是通用的。
| 配置项 | 典型值 | 说明 |
|---|---|---|
| 充电截止电压 | 4.2V | 根据电池规格修改 |
| 恒流充电电流 | 500mA~1A | 综合电池规格和系统功耗确定 |
| 再充电阈值 | 4.1V 左右 | 避免频繁重启充电 |
| NTC 温度范围 | 0℃~45℃ | 超出范围暂停充电 |
| 输出轨 1 电压 | 3.3V | 给 MCU 和数字逻辑 |
| 输出轨 2 电压 | 1.8V | 给传感器或存储 |
| 上电延迟 | 视设计 | 核心先上电,外设后上电 |
| 故障响应 | 自动重试或锁存 | 根据产品形态选择 |
3. PIC18F45K80 的 I2C 主控角色:从硬件连接到寄存器级操作
3.1 硬件连接和电平匹配的细节
PIC18F45K80 的 MSSP 外设可以配置成 I2C 主模式,用来读写 PCA9422 的寄存器。硬件连接上,SCL 和 SDA 都要接上拉电阻到对应电平。这里有个很容易踩的坑:PCA9422 的 I2C 电平可能和 MCU 的 I/O 电压不在同一域,如果 PMIC 的 I2C 是 1.8V 逻辑而 MCU 是 3.3V,直接连过去是测不到稳定通信的。要么选择支持电平转换的方案,要么在中间加一个双向电平转换电路。
上拉电阻的取值也不能照抄参考设计。I2C 总线上的总电容包括 PCB 走线、器件引脚、滤波电容,总线电容越大,上拉电阻就该越小,否则上升沿太慢,通信速率上不去。反过来,上拉电阻太小会增大灌电流,导致低电平被拉不干净。常规做法是 2.2kΩ 到 4.7kΩ,再根据实际抓到的波形升沿调整。
INT 中断引脚的处理同样要注意:它通常是开漏输出,需要 MCU 内部的上拉或者外部上拉电阻。初始化时把 MCU 对应的外部中断引脚配置为下降沿触发,因为 PMIC 产生中断时会把 INT 拉低。中断处理函数里不要做复杂操作,只设置一个标志位,真正的寄存器读取和故障分析放到主循环里做,避免在中断上下文里阻塞。
3.2 驱动层封装:读、写、修改三位一体
寄存器级操作是整条链路的地基。我会把 I2C 底层的 Start、Stop、发送、接收封装成基础函数,然后基于它封装 PMIC 的寄存器读写接口。最简单也最稳妥的写法如下:
#define PMIC_I2C_ADDR 0x48 /* 实际地址以数据手册和原理图为准 */ void PMIC_WriteReg(uint8_t reg, uint8_t val) { I2C_Start(); I2C_WriteByte((PMIC_I2C_ADDR << 1) | 0); /* 写方向 */ I2C_WriteByte(reg); I2C_WriteByte(val); I2C_Stop(); } uint8_t PMIC_ReadReg(uint8_t reg) { uint8_t val = 0; I2C_Start(); I2C_WriteByte((PMIC_I2C_ADDR << 1) | 0); /* 写方向,先发寄存器地址 */ I2C_WriteByte(reg); I2C_Start(); I2C_WriteByte((PMIC_I2C_ADDR << 1) | 1); /* 读方向 */ val = I2C_ReadByte(0); /* 最后一个字节回 NACK */ I2C_Stop(); return val; }很多寄存器并不是每一位都被用到,直接写整字节容易把保留位改错。所以我还习惯加一个"读改写"接口,先把目标寄存器读回来,用 mask 把要修改的位挑出来,再回写。这样即使将来芯片固件升级、寄存器定义有变化,只要保留位没变,代码也不容易出问题。写操作完成之后,可以再回读一次做校验,尤其是在靠近电源轨切换这种关键时刻的配置,宁可多花一次 I2C 通信也要确认写入成功。
3.3 初始化序列:上电、识别、配置、使能
PIC18F45K80 上电后,自身时钟和外设先稳定,然后才开始操作 PMIC。完整初始化序列我习惯分成四步:设备识别、充电配置、输出配置、全局使能。
设备识别这一步非常关键,尤其当电路板上有多个 PCA9422 或者兼容芯片时。读回来的 ID 寄存器如果不匹配预期值,直接上报错误,不要继续往下配置。曾经有一次我在一个板子上发现 PMIC 怎么配置都没反应,最后才发现是贴片时把另一颗芯片焊到了 PCA9422 的位置,ID 不对,幸好识别的步骤拦住了后面的操作。
充电配置和输出配置没有固定顺序,但建议先配充电再配输出,原因很简单:如果输出轨先使能,系统已经在工作状态,这时再切充电模式,负载电流会叠加在充电电流上,容易出现瞬间电流尖峰。配置完成后最后使能输出轨,使能后延时几十毫秒,然后读回输出状态寄存器,确认各路电压轨建立正常。
void PMIC_Init(void) { uint8_t id = PMIC_ReadReg(PMIC_REG_ID); if ((id & 0xF0) != PMIC_EXPECT_ID) { System_ErrorHandler(ERR_PMIC_ID); return; } PMIC_WriteReg(PMIC_REG_CHG_CONFIG, 0x00); /* 先关闭充电,完成配置后再开启 */ PMIC_WriteReg(PMIC_REG_CHG_CURRENT, 0x05); /* 恒流充电电流设置 */ PMIC_WriteReg(PMIC_REG_CHG_VLMT, 0x04); /* 恒压截止电压设置 */ PMIC_WriteReg(PMIC_REG_OUT1_VOUT, 0x1B); /* 输出轨 1 电压设置 */ PMIC_WriteReg(PMIC_REG_OUT2_VOUT, 0x0F); /* 输出轨 2 电压设置 */ PMIC_WriteReg(PMIC_REG_SEQUENCE, 0x21); /* 上电时序配置 */ PMIC_WriteReg(PMIC_REG_OUT_ENABLE, 0x03); /* 使能输出轨 */ DelayMs(50); PMIC_WriteReg(PMIC_REG_CHG_CONFIG, 0x01); /* 开启充电 */ }这段代码里的寄存器地址和数值只是示意,真正的值要去查数据手册的寄存器映射表。重点在于顺序:先识别,再配置,最后使能,并且每完成一步都留够时间让 PMIC 内部状态稳定。
3.4 中断驱动的状态监控:充电完成、故障与欠压
初始化完成之后,系统进入正常运行状态,MCU 不需要一直去轮询 PMIC。PCA9422 的中断机制会在充电完成、充电中断、过压、欠压、过热这些事件发生时拉低 INT 引脚,MCU 被外部中断唤醒后再去读取故障源寄存器。
这里需要提醒一个问题:很多 PMIC 的中断标志位是"读后即清"的,但有些标志需要软件写 1 清除,有些必须在清除主标志之前先清除子标志,顺序反了会导致中断一直被触发或者漏掉后续事件。保险的做法是在中断处理函数里把整套读取和清标志的流程走完,然后用逻辑分析仪确认 INT 引脚确实恢复到了高电平。如果没恢复,说明还有未处理事件,这是安全机制在起作用,不是程序 bug。
状态监控的数据可以用一个结构体维护,主循环周期性地刷新:
typedef struct { bool is_charging; bool charge_done; bool input_present; bool thermal_fault; bool undervoltage_fault; } PMIC_Status; void PMIC_UpdateStatus(PMIC_Status *status) { uint8_t st = PMIC_ReadReg(PMIC_REG_STATUS); status->is_charging = (st & ST_CHARGING) != 0; status->charge_done = (st & ST_CHARGE_DONE) != 0; status->input_present = (st & ST_INPUT_OK) != 0; status->thermal_fault = (st & ST_THERMAL) != 0; status->undervoltage_fault = (st & ST_UVLO) != 0; }4. 完整电源管理策略:低功耗状态机、电池保护与动态调压
4.1 从运行到休眠的三级状态机
硬件连接和驱动层只是基础,真正决定产品体验的是上层的电源管理策略。我习惯把系统电源状态分成三级:运行态、空闲态、休眠态。运行态下所有电压轨都开启,MCU 全速运行,无线模块可以收发;空闲态下关闭非必要的负载,比如传感器和指示灯,MCU 低频运行等待事件;休眠态下 PMIC 关闭大部分输出轨,只保留给 MCU 的唤醒供电,MCU 进入休眠模式,整个系统待机电流压到最低。
状态切换的触发源很关键。运行态进入空闲态可以用定时器超时,空闲态进入休眠态需要确认当前没有充电、没有按键、没有待处理事件。休眠态唤醒源可以是 PMIC 的中断,比如充电完成;也可以是 MCU 自身的外部中断,比如按键或者 RTC 定时唤醒。
每次状态切换时,MCU 都要通过 I2C 去调整 PMIC 的寄存器。休眠前先通知 PMIC 关闭输出轨,然后等输出电压降下来再让 MCU 休眠,否则 MCU 在休眠的一瞬间还有负载在电源轨上,电压跌落会造成复位。唤醒时反过来,先让 MCU 从休眠中恢复到运行,再去使能 PMIC 的输出轨。这个顺序不能反,反了就会出现"MCU 想操作 PMIC,但 PMIC 还在睡"的窘境。
4.2 电池电压监测与分级保护
PMIC 自身有硬件欠压保护,但那是最底层的一道防线。软件上应该做分级保护,避免一遇到电压波动就立刻关机。我的做法是设置三个阈值:警告阈值、临界阈值、关断阈值。电池电压低于警告阈值时,只记录日志并降低无线模块发射功率;低于临界阈值时,关闭非关键外设,延长使用时间;低于关断阈值且持续一段时间,才执行系统关机。
这个"持续一段时间"的防抖设计很重要。电池在射频发射瞬间会有明显压降,如果只看瞬时值,系统会被误关断。一般我会取 64 次 ADC 采样的滑动平均值,再配合 500ms 到 1s 的连续低位判断,确保关断决策足够可靠。
电压采样可以从两条路径获取:PCA9422 内部监测寄存器给出的电池电压值,以及 PIC18F45K80 自己的 ADC 采样结果。两条路径可以互相校验,如果 PMIC 给出的电压和 MCU 采样值偏差超过一定范围,说明其中一路采样链路有问题,这时候应该按更保守的值执行保护。
4.3 温度与充电安全策略
电池充电必须在安全温度范围内进行。PCA9422 的温度检测引脚接 NTC 后,PMIC 自己会根据温度阈值暂停充电,但这只是硬件保护。软件策略上,我习惯把温度分成几档:正常温度下可以全速充电;接近高温阈值时把充电电流降低一档;超过硬件阈值时彻底停止充电,等温度回落后再恢复。
这里有个容易被忽略的点:NTC 的安装位置直接决定了这个保护是否有效。把 NTC 贴在电池外壳上,测量的其实是电池表面温度,和电芯内部温度有差异;把 NTC 放在 PCB 上,测量的是环境温度,对电池保护的参考意义就要打个折扣。设计阶段就要定好 NTC 的安装位置,还要在固件里加一个温度合理性检查,比如上电后连续读到 -40℃ 或 125℃,大概率是 NTC 断路或短路,这时候宁可不充电也不能硬充。
4.4 动态调节电压与性能的取舍
PCA9422 的多路输出可以通过 I2C 在线调整电压,这给动态调压提供了可能。比如系统处于性能模式时,把 MCU 数字逻辑电压调到稍高一点,保证高频运行稳定;处于省电模式时,把电压调低一点,降低功耗。
但动态调压不是随手改个寄存器就能完事。电压调整后,负载芯片的时序约束会变化,尤其是 MCU 内部 Flash 读取、ADC 采样这类对电压敏感的模块,电压低了可能跑不过时序,电压高了可能超过耐压。所以每次调压都要看负载芯片手册允许的电压范围,调整完成后做一轮完整的功能回归测试,不能只看功耗数字好看就上线。
5. 实测踩坑记录:地址冲突、时序余量、纹波与唤醒毛刺
5.1 I2C 总线上的地址冲突与扫描排查
一个很典型的坑:系统里既有 PCA9422,又挂了其他 I2C 器件,结果 MCU 往 PMIC 写配置时,另一颗芯片也响应了,寄存器值被写乱。排查时我没有直接看代码,而是先把逻辑分析仪挂在 SCL 和 SDA 上,抓一轮完整的 I2C 通信,然后做了个最简单的地址扫描:让 MCU 遍历 0x01 到 0x7F 的所有地址,发一个读请求,看哪些地址有 ACK。
扫描结果出来,同一时刻共有两个地址响应,其中一个就是另一颗器件的默认地址。解决办法有两个:一是给 PCA9422 的地址引脚加不同的电平配置,让它换一个地址;二是把另一颗器件的地址跳线改掉。无论用哪种,改完硬件之后都要重新扫描一遍,确保整个总线上地址唯一,再继续往下调试。
这个教训说明一件事:靠"看数据手册觉得没问题"是靠不住的,实际电路里的地址冲突只有用仪器扫一遍才最可靠。地址扫描代码也不复杂,值得在调试阶段常驻固件里,做成一个自检命令。
5.2 上电时序余量不足导致的 MCU 启动异常
又一次调试中,系统出现一个很怪异的现象:冷启动一切正常,但只要快速循环开关机几次,MCU 偶尔启动到一半就卡死,必须彻底断电才能恢复。最开始怀疑 MCU 自身电源,后来用示波器同时抓两路电压轨的波形,才发现问题:一路是 3.3V,另一路是 1.8V 外设电源,3.3V 建立之后,1.8V 还要过很久才起来,而 MCU 的 I/O 引脚在外设上电过程中一直处于悬空状态,外部电路通过引脚倒灌了一小股电流,导致 MCU 锁死。
解决方案是把两路输出轨的上电延迟时间重新配置,让外设电源轨比 MCU 核心电源轨早几百微秒先建立,这样 MCU 复位释放时,所有引脚的参考电压已经稳定,不会再出现倒灌。修改完时序参数后,又做了 200 次连续开关机测试,没有再复现。这个坑再次印证:上电时序配置不只是走个流程,它直接决定系统的可靠性。
5.3 纹波治理:开关节点、模拟地与输出电容
电池供电系统对纹波的要求很高,尤其当射频模块的谐波成分耦合成电源噪声时,通信灵敏度会明显下降。有一次实测发现 PMIC 输出的 3.3V 电压轨在 1MHz 附近有很明显的开关纹波,幅度接近 50mV,已经超标了。
排查过程分三步:先把纹波来源定位到降压转换器的开关节点,用示波器表笔短接地环去测量,看到开关波形的高频振铃;然后检查输出电容是否足够,发现电容偏小,开关纹波没有被充分吸收;最后检查 PCB 布局,发现开关节点走线绕了一圈,和模拟电路的地线靠得很近,耦合过来的噪声不可忽视。最后处理方式是加大输出电容、重新规划接地路径,把模拟地和功率地单点连接,纹波才降到了 20mV 以内。
处理电源纹波最忌讳的是盲目堆电容。电容加多了可能引发环路不稳定,反而让输出电压出现振荡。正确做法是先看开关波形,判断振铃频率来自哪里,再针对性地调整补偿和滤波,每一步改动都要用示波器复测。
5.4 低功耗唤醒瞬间的电压跌落
系统的休眠态待机电流已经压到了几十微安级别,但唤醒瞬间会出现一个奇怪的现象:PC 端收到数据时会偶尔丢掉几包,后来才发现是唤醒后电压跌落导致的。休眠时 PMIC 输出轨全部关闭,唤醒后 MCU 先把电压轨使能,紧接着外设就开始工作,瞬态电流从几十微安跳到几百毫安,电压被瞬间拉低,MCU 和外设都出现了短暂复位。
解决办法是"阶梯式唤醒":唤醒后先让 MCU 进入一个 10ms 左右的延时,只建立核心电压轨,不启动外设;等电压稳定后,再逐个使能外设电源轨,并且每路之间错开几毫秒。这样每一路的电流跳变幅度小了很多,电压跌落就不再触发复位了。
这个场景也说明了为什么低功耗设计和"快速唤醒"不能完全划等号。某些应用确实需要毫秒级唤醒,但电源轨的物理限制摆在那里,瞬态响应再快也需要时间,与其追求极致速度,不如在唤醒延迟和可靠性之间找一个平衡点。
6. 可以抄作业的调试清单与工程建议
6.1 基础调试工具组合
电源管理调试不能只靠万用表,示波器、电子负载和逻辑分析仪这三样基本是标配。示波器要至少两个通道,因为排查上电时序时经常需要同时看多路电压轨的相对关系;如果有四个通道更好,可以同时抓输入电压、输出电压、开关节点和负载电流。电子负载用来模拟系统不同负载状态,验证 PMIC 在各种瞬态条件下是否稳定。逻辑分析仪主要用于 I2C 通信抓包,核对地址、数据、ACK 时序,这个工具在确认 PMIC 配置时能省很多时间。
另外建议准备一个低阻值的采样电阻,串联在电池回路上,配合示波器电压探头测量唤醒和休眠时的电流变化。直接测电流需要电流探头,价格高,用采样电阻加电压探头也能得到同样的结果,只是要注意采样电阻上的压降不要影响系统最低工作电压。
6.2 固件上线前的自检项
每次改完固件,我都会保留一组自检项,放在上电初始化完成后执行:检查 I2C 地址扫描结果是否和预期一致;回读 PMIC 的 ID 寄存器;读取所有关键配置寄存器并和期望值比对;让 PMIC 进入一次充放电循环,确认状态标志位能正确翻转;最后做一轮完整的上电、休眠、唤醒循环,观察是否有异常复位。这些检查项不需要量产固件里全部保留,但开发阶段一定要跑通,否则后面任何问题都很难定位。
6.3 一些个人体会
做电源管理,最大的感受是"系统思维"比单点能力更重要。PCA9422 负责把能量管好,PIC18F45K80 负责把策略执行好,但真正决定方案成败的,往往是两者之间的配合细节:上电时序、中断处理、状态回读、低功耗切换顺序。这些细节没有一个会在数据手册里直接写出来,全得靠实际调试一条一条去踩。如果你正在做类似的电池供电方案,建议把初始化时序和状态切换做成一张明确的表格,让硬件、固件、测试都能照着同一个标准去检查,能省掉很多来回沟通的功夫。