做低功耗便携设备的朋友应该都有过这种经历:系统里一堆LDO和DC-DC,上电时序靠RC延时网络硬凑,动态调压靠改反馈电阻的分压比,改一版硬件才能调一次电压。项目赶的时候,恨不得把电源部分整个推倒重来。我就是在这样的背景下,认真用了一颗专用电源管理芯片 PCA9422,搭配 Microchip 的 PIC18F45K40 八位单片机,做了一套完整的电源管理方案。这套方案从硬件拓扑、寄存器配置到固件状态机都重新整理了一遍,前后调试了两周,把动态调压、时序控制、故障保护和低功耗待机这些事一次理顺了。
这篇文章我会把整个实现的思路、硬件设计要点、固件流程和调试验证过程都拆开讲,包括那些藏在手册角落里、不实际踩坑根本发现不了的问题。适合正在做电池供电设备、传感器节点、便携仪器,或者想把供电架构从“一堆分立器件”升级成“可配置PMIC+MCU协同管理”的开发者参考。
1. 为什么选择“专用PMIC + 8位MCU”的方案
1.1 PCA9422能解决哪些分立方案解决不了的问题
先说说为什么不用传统的分立供电方案。在很多低功耗系统里,常见的做法是一颗DC-DC给主控供电,几颗LDO给传感器、模拟前端、通信模块供电。听起来没什么问题,但一旦需求变得复杂,分立方案就非常吃力。
第一难的是动态电压调节。现在的低功耗SoC和无线模组普遍支持DVS,也就是系统负载低的时候把核心电压从1.8V降到1.0V,负载高的时候再升回去。分立方案想实现DVS,基本上要在反馈电阻网络里加模拟开关,或者用数字电位器,电路复杂不说,切换瞬间还会有毛刺,搞不好就把负载芯片打复位。
第二难的是时序。多路电源的上电顺序有时候有严格要求,比如先给IO供电,再给核心供电,最后使能外设。RC延时能做固定延时,但精度很差,温度一变就飘;而且一旦调试中发现顺序不对,改起来要换电阻电容,效率很低。
第三难的是故障保护。分立方案里过压、欠压、过流保护基本靠自恢复保险丝和TVS管,出了故障没有标志位,系统不知道电源出了什么问题,排查全靠猜。
PCA9422这类专用PMIC把这些问题集中解决了。它内部集成了多路功率输出,支持I2C动态配置,电压寄存器直接写目标值就能切换输出电平;软启动时间可编程,使能顺序可以由寄存器或引脚控制;同时带Power Good输出、过压欠压保护、过流保护和热关断,故障状态还能通过寄存器读出来。硬件上只需要几颗电感、电容和电阻,外围非常干净。
1.2 PIC18F45K40在电源管理里的角色和优势
有了PMIC之后,还需要一颗控制器去“管理”它。这个角色我用的是PIC18F45K40,原因有几个。
首先是成本和控制粒度。完整电源管理不只是配寄存器,还需要根据系统负载动态切换电压、检测输入电压、处理故障中断、在睡眠和唤醒之间协调各路电源。这些逻辑用一颗8位MCU完全能跑得动,没必要上Cortex-M,成本也压得住。
其次是PIC18F45K40的外设组合比较契合。它有硬件I2C模块,主机模式配置简单,400kHz通信很稳定;有12位ADC,可以用来采集输入电压和输出电压;还有可配置逻辑单元CLC和多个定时器,能实现一些硬件级的时序保护逻辑,不占用CPU。这颗芯片自身的睡眠电流非常低,典型几十微安级别,配合PMIC的低功耗模式,能把整机待机电流压到很小。
再一个是开发效率。MPLAB X IDE配合XC8编译器,代码量也不大,调试工具便宜,上手很快。实际上这套系统里MCU不一定要很复杂,它的核心任务就是“看懂PMIC的状态,伺候好PMIC的输出”,所以选一颗外设够用、功耗低、价格友好的8位机是合理的。
这套架构的最终形态就是:PCA9422负责“执行”电源策略,PIC18F45K40负责“决策”电源策略。MCU知道系统下一秒要干什么,所以由它来告诉PMIC下一秒输出多少电压、哪路使能、哪路关闭;PMIC负责快速、稳定、安全地把电压切过去,并把执行结果通过PG和FAULT引脚反馈给MCU。
2. 系统架构与核心参数设计
2.1 整体电源拓扑
在做具体设计之前,先理清楚整个系统里有哪些电源需求。我这里用一个典型的电池供电便携设备举例,输入是3.7V锂电池,通过USB也可以充电,系统内部有数字核心、模拟传感器、通信模组和RTC备份电源。
PCA9422在这个方案中提供三路主输出和一路低功耗辅助输出:
- 主核输出:默认1.8V,低负载时降到1.0V,给无线SoC或主控核心供电;
- 模拟LDO:固定3.3V,给运放、传感器模拟前端供电;
- 数字IO电压:1.8V,给存储器和外设接口供电;
- 常备电源:给RTC和备份寄存器供电,系统睡眠时不能断。
PIC18F45K40作为电源管理控制器,承担四件事:
- 通过I2C配置PCA9422的工作模式、目标电压和保护阈值;
- 通过GPIO控制PCA9422的使能引脚,控制各路输出的上电时序;
- 采集输入电压和关键输出电压,做欠压、过压判断;
- 监听PG和FAULT引脚,发生电源异常时快速响应。
2.2 PCA9422关键参数与寄存器规划
PCA9422家族不同后缀的型号集成的通道数和功能略有差异,具体使用时一定要以官方数据手册的寄存器映射为准。我这里把设计过程中最关键的几类参数列出来:
- 电压配置寄存器:每路输出对应一个或一组电压选择寄存器,写入目标电压编码即可切换输出电平。编码表在手册里,比如1.0V对应某个数值,1.8V对应另一个数值;
- 软启动时间:控制输出从0上升到目标电压的时间,典型可以从几百微秒到几毫秒编程;
- 限流阈值:每路输出的峰值电流限制,根据实际负载留足裕量设置;
- 保护阈值:包括输入欠压锁定UVLO、输出过压OVP、过流OCP和过温OTP;
- 状态寄存器:可以读取当前各路输出的状态、故障标志和PG状态。
我在设计阶段把需要用到的寄存器整理成一张表,固件开发时对照着写,避免反复翻手册。这里也建议读者在项目一开始就做这件事,因为PMIC寄存器往往几十上百个,全靠脑子记很容易出错。
| 寄存器类别 | 用途 | 典型操作 |
|---|---|---|
| Device ID | 识别芯片版本 | 初始化时读取,确认I2C通信正常 |
| VOUT1电压控制 | 主核电压切换 | 写目标电压码,等待PG |
| VOUT2电压控制 | 模拟电源电压 | 配置为3.3V固定输出 |
| VOUT3电压控制 | IO电源电压 | 配置为1.8V固定输出 |
| 软启动配置 | 控制上电斜率 | 设置合适的软启动时间 |
| 限流/保护寄存器 | 逐路限流和OVP/OCP | 按负载电流1.3倍余量配置 |
| 状态/故障寄存器 | 读取故障原因 | 中断触发后先读该寄存器再动作 |
2.3 PIC18F45K40引脚分配与硬件连接
硬件连接的原则是:数字控制信号和模拟采样通道分开布局,避免开关电源的噪声耦合到ADC采样回路里。我实际使用的引脚分配如下:
| PIC18F45K40引脚 | 功能 | 说明 |
|---|---|---|
| RC3/RC4 | I2C SCL/SDA | 连接PCA9422的I2C接口,各接4.7k上拉到3.3V |
| RA0 | ADC输入通道0 | 采样电池电压VBAT |
| RA1 | ADC输入通道1 | 采样主核输出电压VOUT1 |
| RB0 | PMIC EN控制 | 控制PCA9422全局使能 |
| RB1 | PG输入 | 监测Power Good状态 |
| RB2 | FAULT输入 | 故障中断输入,下降沿触发 |
| RB3 | 外设负载开关控制 | 控制3.3V外设电源的负载开关 |
| RC6/RC7 | 调试串口UART | 输出电源管理日志 |
设计时特别要注意RB1和RB2这两个引脚必须配置成数字输入,并开启弱上拉或者外部上拉。PMIC的PG和FAULT引脚通常是开漏输出,外部需要上拉电阻才能读到可靠电平。另外,ADC采样通道如果PCB布线较长,建议在引脚附近加一个0.1uF滤波电容,提高采样稳定度。
3. 硬件电路设计要点与选型
3.1 输入输出电容和电感的选择
PCA9422内部的开关转换器需要外部电感和电容配合才能稳定工作。电感值选得太小,纹波电流大,输出电压纹波高;选得太大,动态响应慢,负载突变时电压跌落明显。实际设计时按Buck电路的标准公式计算。
以我的系统为例:输入电池电压范围3.2V到4.5V,开关转换器标称开关频率2MHz,目标输出1.8V,最大负载1A,纹波电流取负载电流的30%即0.3A。电感值计算如下:
L = (Vin - Vout) × Vout / (Vin × fsw × ΔI)
在最恶劣工况下Vin取3.7V计算:
L = (3.7 - 1.8) × 1.8 / (3.7 × 2000000 × 0.3)
L = 3.42 / 2220000 ≈ 1.54uH
实际选型时我用了2.2uH的电感,留了一些裕量,保证在输入电压降低时纹波电流仍然可控。电感饱和电流至少取最大负载电流的1.5倍,也就是1.5A,这样瞬时过载时电感不会进入饱和状态。
输出电容按照负载瞬态要求选。因为DVS切换时输出电压要快速变化,输出电容太小会导致电压过冲大,太大又会拖慢切换速度。我在1.8V主核输出上用了2颗22uF的X5R陶瓷电容并联,等效ESR很低,实测DVS切换过冲大约50mV,系统能接受。
输入电容同样重要。电池供电时,电池本身有一定内阻,开关转换器的脉动电流会直接叠加在输入母线上。我在PCA9422的VIN引脚附近放了一颗22uF陶瓷电容加一颗0.1uF高频旁路电容,同时尽量靠近芯片引脚放置,PCB走线短而粗。如果是USB供电场景,还需要额外考虑热插拔浪涌,建议在前端加一个限流负载开关,避免插拔瞬间的浪涌电流把PMIC打保护。
3.2 使能、时序与Power Good电路
PCA9422的全局使能引脚EN需要MCU控制,不能悬空。悬空状态下引脚电平不确定,可能出现上电不启动或者随机启动的问题。我在EN引脚上加了10k下拉电阻,确保MCU复位期间PMIC处于关闭状态,等MCU初始化完成后再拉高使能。
Power Good引脚是开漏输出,接10k上拉到3.3V。MCU的PG输入引脚配置为数字输入并开启输入缓冲。判断电源状态时不能只靠一次电平采样,因为上电瞬间PG可能因为毛刺产生误触发。我在固件里做了20ms的软件去抖,连续20ms读到高电平才认为电源稳定,这样能过滤掉大部分瞬态毛刺。
FAULT引脚同样接10k上拉,连接到MCU的RB2引脚,配置为下降沿中断。FAULT在正常工作时是高电平,任何故障条件都会把它拉低。这里有一个容易忽略的点:很多PMIC的FAULT是“电平型”输出,不是“脉冲型”输出,也就是说故障没有清除之前它会一直保持低电平。所以固件里进入FAULT中断后,要尽快通过I2C读取状态寄存器,搞清楚故障源是过压、过流还是过温,然后决定是软恢复还是彻底关断。
3.3 测试点与调试预留
硬件设计阶段一定要舍得留测试点。我这次在PCB上预留了这些测试点,调试时帮了大忙:
- VBAT测试点:用来测量输入电压,判断电池电压跌落是否引起UVLO;
- VOUT1测试点:观察DVS切换波形,配合示波器验证切换时间;
- PG测试点:用于验证上电时序,测量PG拉高的实际时间点;
- SCL和SDA测试点:方便用逻辑分析仪抓I2C波形,排查通信问题;
- 每路电源输出预留0欧电阻:电流测量时取下0欧电阻串万用表,不用割板子。
这些测试点成本很低,但能极大提升调试效率。尤其是DVS切换这种事,没有示波器实测光靠肉眼根本看不出问题。
4. 固件实现的完整流程
4.1 初始化顺序
固件里初始化电源管理的顺序非常关键,顺序错了轻则外设初始化失败,重则系统直接卡死。我的推荐流程是:
第一步,配置MCU基础时钟和引脚方向。先把所有GPIO配置成确定状态,尤其是EN引脚要确保输出低电平,PG和FAULT配置为输入,I2C引脚配置为开漏输出。
第二步,初始化I2C主机,频率400kHz。初始化完成后可以先写一个读取PMIC Device ID的测试函数,如果能读到正确的ID,说明I2C通信正常。这一步要放在配置PMIC寄存器之前做。
第三步,配置PCA9422。先把全局使能关闭,然后依次写目标电压寄存器、软启动时间、限流阈值和保护阈值。所有寄存器写完后,统一校验一遍:读回关键寄存器,判断写入值是否和预期一致。
第四步,使能PMIC输出,等待PG。使能EN引脚后,PMIC会按照配置的软启动时间逐步抬起各路电压。MCU在等待PG时必须设置超时,比如500ms,防止PMIC没有启动时系统死等。
第五步,PG确认有效后,再初始化外设电源和系统外设。
这个顺序的核心逻辑是“先通信号,再通电源,最后通外设”。I2C通信是控制链路必须最先确认;PMIC寄存器是电源策略必须先配置好;PG是电源稳定标志,必须确认后才敢给外设上电。
下面是一个简化的初始化代码示例:
void pmic_soft_reset(void) { PMIC_EN_PIN = 0; // 先关闭PMIC输出 __delay_ms(10); // 等待输出电容放电 } bool pmic_init(void) { // 1. 确认I2C通信正常 uint8_t id = pmic_read_reg(PMIC_REG_DEVICE_ID); if (id != PMIC_EXPECTED_ID) { return false; } // 2. 配置各路输出电压 pmic_write_reg(PMIC_REG_VOUT1_CTRL, PMIC_VOUT1_1V8); pmic_write_reg(PMIC_REG_VOUT2_CTRL, PMIC_VOUT2_3V3); pmic_write_reg(PMIC_REG_VOUT3_CTRL, PMIC_VOUT3_1V8); // 3. 配置软启动和保护 pmic_write_reg(PMIC_REG_SOFTSTART, PMIC_SS_1MS); pmic_write_reg(PMIC_REG_PROTECT, PMIC_OCP_1A5 | PMIC_OVP_EN); // 4. 回读校验 if (pmic_read_reg(PMIC_REG_VOUT1_CTRL) != PMIC_VOUT1_1V8) { return false; } // 5. 使能输出并等待PG PMIC_EN_PIN = 1; uint16_t timeout = 500; while (timeout--) { if (PMIC_PG_PIN == 1) { __delay_ms(20); // 软件去抖 if (PMIC_PG_PIN == 1) { return true; } } __delay_ms(1); } return false; }4.2 动态电压调节(DVS)的实现
DVS是这套方案里最实用的功能。低负载时把电压降到1.0V,跑高负载任务前再把电压升回1.8V,功耗和性能之间灵活切换。实现方式很简单,就是通过I2C写目标电压寄存器,但实际操作中有几个顺序讲究。
正确的切换顺序是:升压时先升压后升频,降压时先降频后降压。
举个例子,系统要从低负载状态切换到高负载状态,固件应该先写电压寄存器把VOUT1从1.0V升到1.8V,等PG确认电压稳定后再提高CPU工作频率;反过来,从高负载状态切换到低负载状态,先降低CPU频率,把运行负荷降下来,然后再降低电源电压。如果顺序反了,降压时还在高频率高负载下运行,瞬间电流需求可能超过PMIC的限流点,导致电压跌落甚至系统复位。
DVS切换期间还要注意负载电流。PMIC内部会按照软启动速率将输出电压从当前值过渡到目标值,这个过渡过程不是瞬时的。写入电压寄存器后,不能立刻执行关键代码,必须等待PG重新拉高或者轮询状态寄存器确认切换完成。如果写入后太快去访问闪存、操作外设,遇到电压还在爬升的中间状态,可能出现偶发读写错误。
void dvs_set_voltage(uint8_t target_voltage) { // 升压场景:先切电压,再升负载频率(调用方处理) pmic_write_reg(PMIC_REG_VOUT1_CTRL, target_voltage); // 等待切换完成 uint16_t timeout = 100; while (timeout--) { uint8_t status = pmic_read_reg(PMIC_REG_STATUS); if (status & PMIC_STATUS_VOUT1_PG) { return; } __delay_ms(1); } // 超时处理:读取故障寄存器,记录错误日志 system_log("DVS timeout, status=0x%02X", pmic_read_reg(PMIC_REG_FAULT)); }这里还要强调一点,DVS不是随便划定一个电压范围就完事。要对照负载芯片的数据手册,确认它在每个电压点的最大可用频率和最大负载电流。比如某无线SoC在1.0V下只支持最高48MHz,在1.8V下才能跑120MHz,那DVS策略就必须和系统调频策略联动,而不是单纯切电压。
4.3 低功耗待机流程
低功耗待机是整个电源管理方案里最容易出问题的一环。我的目标是把整机待机电流压到100uA以内,这需要MCU、PMIC和外设三者协同。
进入待机的执行顺序是:
- 关闭外设电源:通过RB3控制的负载开关断开传感器和通信模组的电源;
- 配置PCA9422进入低功耗模式:关闭非必要输出,主核电压切到最低待机电压;
- 关闭MCU内部不需要的外设:包括ADC、UART、I2C都停止工作;
- 执行MCU睡眠指令。
这里有一个关键点:如果MCU本身由PCA9422供电,那么MCU睡眠前不能把电压切到低于MCU最低工作电压。PIC18F45K40的工作电压范围比较宽,可以承受较低电压,但为了保险,我让MCU使用独立的3.3V LDO供电,PMIC的主核输出只给无线SoC,这样DVS范围可以下探到1.0V而不用担心MCU掉电。
唤醒流程相反:
- MCU从睡眠中醒来,先恢复时钟和外设;
- 通过I2C把PCA9422主核输出从待机电压升回工作电压;
- 等待PG确认;
- 打开外设负载开关;
- 系统恢复正常运行。
实际操作中,唤醒后I2C通信偶尔会出现第一帧失败的情况,原因是MCU醒来瞬间I2C模块还没有完全恢复。我在唤醒后增加了一个简单重试机制:如果I2C写寄存器超时,等待1ms后重试一次,实测能解决这个问题。
4.4 故障监测与恢复
电源故障不能只靠FAULT引脚中断,软件还必须做周期性巡检。FAULT中断用于紧急响应,ADC巡检用于发现那些没有触发FAULT但电压已经偏差的异常情况。
我的固件里设置了一个1秒钟周期的电源巡检任务,通过ADC采样VBAT和VOUT1,与预期值比较。如果VOUT1目标电压是1.8V,但采样回来是1.5V,可能原因包括负载过大、电感饱和或者PMIC进入了限流保护。这时候固件会先记录故障日志,然后尝试降低负载,比如关闭部分外设,再看电压是否恢复。如果持续异常,就进入安全关断流程,把所有输出关闭,防止进一步损坏。
FAULT中断服务程序里只做三件事:记录时间戳、读取PMIC故障寄存器、置一个故障标志。真正恢复策略放到主循环里执行,不要在中断里做复杂处理。这是因为FAULT触发后PMIC可能处于不稳定状态,在中断里再去读写I2C容易把事情搞得更糟。
void __interrupt() fault_isr(void) { if (FAULT_PIN_CHANGED) { fault_flag = 1; fault_timestamp = get_tick(); FAULT_PIN_FLAG = 0; } } void main_loop(void) { if (fault_flag) { uint8_t fault = pmic_read_reg(PMIC_REG_FAULT); if (fault & PMIC_FAULT_OVP) { // 过压:关闭对应输出,检查反馈配置 } if (fault & PMIC_FAULT_OCP) { // 过流:降低负载后重试 } if (fault & PMIC_FAULT_OTP) { // 过温:全系统休眠等待冷却 } fault_flag = 0; } }5. 实测数据与调试验证
5.1 上电时序实测
实际测试中,我用示波器同时测了EN、VOUT1、VOUT2和PG。使能后大约0.3ms,VOUT1开始上升;软启动配置为1ms时,输出电压从0升到1.8V的斜率大约1.8V/ms;VOUT1稳定后约0.5ms,PG拉高;PG稳定后再延时20ms初始化外设,整个时序干净利落。
相比原来RC延时方案,这个时序的精度提升非常明显。RC延时会随电容容差和温度变化,实测精度只有±30%;PCA9422的软启动是内部时钟控制的,实测精度可以到±5%以内,这对要求严格上电顺序的负载芯片来说很有价值。某次调试中我发现VOUT1还没完全稳定PG就拉高了,排查后确认是PMIC寄存器里的PG阈值配置偏低,把PG阈值调到目标电压的90%后,时序就正常了。
5.2 动态调压过渡过程
DVS切换我用示波器加上电流探头实测记录:1.8V切到1.0V大约用了2.1ms,电压曲线平滑下降,没有明显下冲;1.0V切回1.8V大约2.6ms,最大过冲约50mV。切换过程中电流从400mA平滑过渡到200mA,没有出现电流尖峰。
不过在带空载的情况下,DVS切换时输出电压的过冲会比带载时更大。这是因为负载电流小时,输出电容上储存的电荷无处泄放,电压只能靠PMIC内部放电。我的解决方法是:如果系统在空载状态切换DVS,先打开一个预负载,比如点亮一个状态LED或者开启某个外设,让输出电容有放电回路,过冲能明显减小。
5.3 低功耗待机数据
整机待机电流实测从原来的1.2mA降到了约80uA。拆解一下这个功耗构成:PCA9422静态电流约30uA,PIC18F45K40睡眠电流约10uA,PMIC和MCU的上拉电阻约15uA,剩余的是负载开关和PCB漏电流。如果把I2C上拉电阻从4.7k改成10k,待机电流还能再降约5uA,但通信稳定性会变差,需要权衡。
这里要提醒一下,测低功耗电流时示波器探头和万用表的表笔本身是有漏电流的,尤其是便宜的万用表在微安档可能引入几十微安误差。测量待机电流时要把所有调试工具断开,用串联电流表方式测量,数据才可信。
5.4 I2C通信稳定性
在400kHz通信速率下,连续读写1000次寄存器没有出现错误。但后来做高低温测试时,发现低温下I2C偶发通信异常。排查后确认是上拉电阻和总线电容导致的上升沿变缓问题。
最初PCB上SCL和SDA各用了2.2k上拉电阻,上升沿很陡,但在低温下振铃明显,导致时钟边沿误判。换成4.7k上拉后,上升沿稍微变缓但振铃消失,高低温度下通信都稳定。这个经验说明,I2C上拉电阻不是越小越好,要结合总线电容和通信速率综合考虑。计算上拉电阻时可以参考标准公式,确保上升沿时间小于I2C规范要求,同时避免过强的振铃。
6. 常见问题排查与避坑清单
6.1 问题排查速查表
调试过程中积累了一些典型问题和对应的排查思路,整理成表格,遇到问题可以先对照排查:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| I2C枚举不到PMIC | 地址配置错误、PMIC没上电、总线被拉死 | 先用逻辑分析仪抓波形,确认地址和ACK信号;检查VIN是否达到工作电压;检查SCL/SDA是否被其它器件占用 |
| 输出电压偏低 | 反馈电阻配置错、负载电流超限、寄存器电压码错误 | 先量空载输出电压,排除负载因素;空载仍偏低则检查寄存器回读值;反馈电阻要按VFB参考电压计算 |
| 上电瞬间过冲 | 软启动时间过短、输出电容过小 | 调长软启动时间;增大输出电容;检查负载芯片对过冲的容忍上限 |
| PG一直不拉高 | EN电平不对、输入电压不足、保护触发 | 先确认EN引脚电压;量输入电压是否低于UVLO阈值;读FAULT寄存器确认是否触发保护 |
| 电压切换后系统复位 | 降频降压顺序做反、DVS切换时负载电流过大 | 检查DVS切换流程是否先降频再降压;示波器观察切换瞬间电压跌落深度;必要时降低切换速率 |
| 待机电流降不下去 | 外围上拉电阻耗电、PMIC没有进入待机模式 | 逐个断开外设排查;用寄存器确认PMIC输出是否真正关闭;检查引脚漏电 |
| 低温下I2C通信异常 | 上拉电阻太小导致振铃、总线电容过大 | 换大一点的上拉电阻;降低通信速率;检查PCB走线长度 |
6.2 原理图和PCB设计避坑清单
原理图阶段有几件事一定要做扎实:
第一,I2C上拉电阻的封装做成可选件。调试时可能需要在上拉阻值上做调整,预留一个0402封装的位置,方便换阻值。如果空间紧张,可以做成两个并联焊盘,调试时选焊一个。
第二,每路电源输出都串一个0欧电阻。这个电阻平时不影响功能,但需要测电流时直接焊下来串万用表,不用割线不用飞线。量完电流再焊回去,效率很高。
第三,PMIC芯片底部如果有散热焊盘,一定要接到地,并且打足够的过孔。有些PMIC的过温保护频繁触发,就是因为散热焊盘没处理好导致的。
PCB布局时注意以下这些:
- 电感要远离MCU晶振和模拟信号走线,避免磁场耦合;
- PMIC的输入输出电容尽量靠近芯片引脚,走线短而粗;
- 模拟采样线从输出电压采样点单独走线,不要在电感下面穿过;
- 地平面尽量完整,开关转换器的功率地和模拟地单点连接。
6.3 固件调试避坑清单
固件方面最大的坑是“寄存器配置只写不回读”。PMIC寄存器写入失败的原因很多,可能是I2C时序问题,也可能是PMIC内部状态机不允许某项配置。只在初始化时写一次,后面出了问题很难排查。我的做法是初始化完成后,把所有关键寄存器统一回读一遍,和期望值比对,不一致立刻报错并在串口打印具体寄存器地址和数据。
还有一个经验是建立“恢复默认配置”流程。调试过程中经常会把PMIC寄存器改乱,如果固件里有一个一键恢复出厂配置的函数,重新上电后能快速回到已知状态,可以省很多时间。
最后一个经验是超时机制。所有等待PG、等待DVS完成、等待寄存器切换的地方都必须加超时,不能死等。实际项目中曾经遇到PMIC因保护关机,PG一直不拉高,固件如果死等,系统就会卡死在启动流程里。加超时后,超时进入故障记录流程,至少能搞清楚发生了什么。
7. 个人体会与后续扩展
写到这,这套“专用PMIC+8位MCU”的电源管理方案基本完整了。我实际做完之后最深的体会是:与其在板上堆十几个分立元件去拼一套供电架构,不如用一颗可配置PMIC把供电逻辑理顺,再用一颗小MCU把电源策略做活。硬件上的复杂度降低了,软件上多写几百行代码,但换来的是时序可控、电压可调、故障可查,这个交换非常划算。
DVS和时序这件事,能用软件解决的尽量交给软件,不要用硬件去硬凑。RC延时改一次要换元件,寄存器里改一个配置只要一条命令,两者维护成本完全不在一个量级。
后续如果要继续扩展,有几个方向值得尝试:一个是在PCA9422支持多组电压表的情况下,把DVS和系统负载预测联动起来,比如无线收发前预先把电压升上去,收发完成后再降回来;另一个是把电池电量计也接到同一套I2C总线上,实现电源状态完整上报,让MCU不仅管电压,还能评估剩余电量和健康状态。
希望这篇记录能给正在调电源的朋友一点参考,至少在选型和排坑的时候少走几步弯路。