资讯详情

资讯详情

PCA9422与PIC32MZ1024EFK144电源管理设计实战

1. 从一颗PMIC说起为什么这个组合值得单独拿出来讲如果你手头正在做一个以PIC32MZ1024EFK144为核心的项目而且这个项目对功耗、上电时序、多路电源轨有明确要求那你大概率绕不开一个现实问题这颗MCU本身性能很强200MHz主频、大容量Flash和RAM、丰富的外设但它的电源需求并不简单。核心电压、IO电压、外设电压、模拟部分供电往往需要多路不同电压和不同上电顺序。如果全部用分立LDO和DC-DC去搭板子面积、BOM成本、调试复杂度都会迅速上升。PCA9422就是在这种场景下进入视野的。它是一颗面向低功耗嵌入式系统的电源管理IC集成多路降压和LDO输出支持通过I2C接口动态配置电压和开关状态还带有中断和状态寄存器可以让主控实时掌握电源状态。把它和PIC32MZ1024EFK144搭配本质上是在做一件事用一颗可编程PMIC把MCU及其外围的供电、时序、低功耗模式统一管起来。这套组合适合谁适合正在做工业控制、便携仪器、数据采集终端、带电池备份的设备以及任何需要MCU多路电源低功耗策略的嵌入式项目。它不适合那种只需要一路3.3V、功耗无所谓的最小系统。换句话说当你开始认真考虑上电顺序休眠电流动态调压这些词的时候这篇文章就是写给你的。我下面会从硬件连接、I2C通信、上电时序、低功耗策略、调试踩坑几个角度把PCA9422配PIC32MZ1024EFK144这件事讲透。所有代码和配置思路都是基于常见工程实践整理的你可以直接拿去改。2. 先搞清楚PCA9422到底能给你什么2.1 电源轨数量和能力边界PCA9422的定位是多路输出PMIC它通常提供若干路降压转换器和若干路LDO。具体到实际使用你需要先做一件事把PIC32MZ1024EFK144的电源需求列成一张表。这颗MCU一般需要核心电压VDDCORE通常在1.8V到3.3V之间具体取决于你跑的主频IO电压VDDIO常见3.3V或1.8V模拟电压AVDD对ADC精度有影响USB或其他外设电压如果有把这些需求和PCA9422的输出路数一一对应是设计的第一步。不要先画原理图再想这件事顺序反了会返工。电源域典型电压由PCA9422哪一路提供备注VDDCORE1.8V/2.5V/3.3V降压通道1根据主频选择VDDIO3.3V降压通道2或LDO影响IO电平AVDD3.3VLDO建议单独滤波外设/传感器1.8V或3.3VLDO可动态开关这张表看起来简单但它决定了后面所有配置。比如你把VDDCORE和VDDIO都挂在同一路输出上那动态调压时就会互相牵制低功耗策略基本没法做。2.2 I2C接口是这套方案的灵魂PCA9422和PIC32MZ1024EFK144之间最关键的连接不是电源而是I2C。因为有了I2CMCU才能读取PMIC的状态寄存器知道哪路输出正常、哪路出问题动态修改输出电压实现DVFS动态电压频率调节在进入低功耗前关闭某些电源域通过中断引脚响应PMIC的异常事件PIC32MZ1024EFK144本身有多个I2C外设选一个空闲的即可。注意一点I2C总线的上拉电阻要接在PMIC和MCU都上电之后仍然存在的电源域上否则可能出现一边断电、总线被拉死的尴尬情况。我一般会把上拉接到常开的3.3V上而不是某路可关闭的输出上。2.3 中断和状态引脚别浪费PCA9422通常有中断输出引脚能上报过温、欠压、输出异常等事件。很多人图省事不接这个脚结果调试时PMIC明明报了故障MCU却一无所知只能靠万用表一路路量。把中断脚接到PIC32MZ的外部中断输入上然后在中断服务程序里读状态寄存器这是标准做法能省下大量调试时间。3. 硬件连接那些原理图上容易画错的地方3.1 输入电源和去耦PCA9422的输入一般来自电池或适配器电压范围要覆盖它的工作区间。输入端的去耦电容不是随便放一个就行大容量储能电容和小容量高频电容要搭配。我见过有人只放一个10uF结果负载瞬变时输入电压塌陷PMIC直接复位。稳妥的做法是输入端放一个10uF以上的陶瓷或钽电容再并联一个0.1uF。每一路输出的去耦也要按数据手册推荐来。降压输出的电感选型尤其关键电感值、饱和电流、直流电阻都会影响效率和纹波。如果你不确定就按手册的典型应用电路抄不要自己发挥。3.2 上电时序的硬件约束PIC32MZ1024EFK144对上电顺序有要求通常是核心电压先建立IO电压后建立或者两者在某个时间窗口内完成。PCA9422支持通过配置实现输出时序控制但前提是硬件上各路输出的使能关系要设计对。一个常见错误是把所有输出的使能都接到同一个信号上然后指望软件去控制顺序。但软件在MCU还没上电时根本跑不起来所以真正的上电顺序必须由PMIC自己完成。PCA9422的内部时序引擎可以在上电时按预设顺序依次开启各路输出你要做的是把这个顺序配置对而不是用MCU去控制。3.3 地和星型连接模拟地和数字地的处理是老生常谈但在PMICMCU的组合里特别重要。PCA9422的模拟参考地、MCU的AVSS、以及各路的功率地建议在单点汇合避免大电流回路穿过模拟区域。如果你发现ADC读数跳动厉害先查地再查电源纹波。4. 软件配置让PIC32MZ真正管起这颗PMIC4.1 I2C底层驱动先跑通在写PMIC配置之前先把PIC32MZ1024EFK144的I2C驱动调通。建议先用最简单的读写测试向PMIC的某个只读寄存器发起读操作看能不能拿到稳定的数据。如果这一步就不通后面全是空中楼阁。I2C时钟频率不要一上来就拉到400kHz先用100kHz跑通再提速。PMIC的I2C时序要求要看手册有些器件对建立保持时间比较敏感。PIC32MZ的I2C模块配置涉及BRG寄存器计算公式是I2C时钟 PBCLK / (2 * (BRG 1))假设PBCLK是100MHz想要100kHzBRG约等于499。实际配置时取整后要验证一下实际频率别算完就不管了。4.2 寄存器配置的顺序PCA9422的配置不是随便写的顺序很重要。一般建议先读器件ID确认通信正常配置各路输出的电压值配置上电时序和使能关系配置中断掩码最后使能输出如果你先使能输出再改电压可能会出现输出电压瞬间跳变对MCU不利。尤其是核心电压跳变太快可能导致MCU复位。4.3 一个可复用的配置函数框架下面是一个基于常见实践的配置函数框架用C语言写你可以根据实际寄存器地址调整#include stdint.h #include i2c_driver.h #define PCA9422_ADDR 0x60 #define REG_DEVICE_ID 0x00 #define REG_BUCK1_VOLT 0x10 #define REG_BUCK2_VOLT 0x11 #define REG_LDO1_VOLT 0x12 #define REG_ENABLE_CTRL 0x20 #define REG_SEQ_CTRL 0x21 #define REG_INT_MASK 0x30 #define REG_INT_STATUS 0x31 static int pca9422_write_reg(uint8_t reg, uint8_t val) { return i2c_write(PCA9422_ADDR, reg, val, 1); } static int pca9422_read_reg(uint8_t reg, uint8_t *val) { return i2c_read(PCA9422_ADDR, reg, val, 1); } int pca9422_init(void) { uint8_t id 0; if (pca9422_read_reg(REG_DEVICE_ID, id) ! 0) { return -1; } /* 根据实际ID判断通信是否正常 */ if (id 0x00 || id 0xFF) { return -2; } /* 设置核心电压假设目标1.8V具体编码查手册 */ pca9422_write_reg(REG_BUCK1_VOLT, 0x18); /* 设置IO电压3.3V */ pca9422_write_reg(REG_BUCK2_VOLT, 0x30); /* 设置LDO输出 */ pca9422_write_reg(REG_LDO1_VOLT, 0x30); /* 配置上电时序 */ pca9422_write_reg(REG_SEQ_CTRL, 0x05); /* 配置中断掩码使能需要的故障上报 */ pca9422_write_reg(REG_INT_MASK, 0xF0); /* 使能输出 */ pca9422_write_reg(REG_ENABLE_CTRL, 0x07); return 0; }这段代码的重点不是寄存器值本身而是流程先确认通信再配电压再配时序最后使能。寄存器地址和电压编码一定要以你手上的数据手册为准我这里只是示意。5. 上电时序与低功耗策略的配合5.1 上电阶段PMIC主导MCU旁观在系统刚上电时MCU还没启动这时候PCA9422必须自己完成所有电源轨的建立。你要做的是在PMIC的配置里把时序定好比如T0BUCK1核心开启T02msBUCK2IO开启T04msLDO开启这个时间间隔不能太短要给每路输出的软启动留时间。太短会导致输入电流冲击大太长则影响系统启动速度。2ms左右是比较常见的折中。5.2 运行阶段动态调压省电当MCU跑起来之后就可以通过I2C动态调整电压了。比如系统负载轻的时候把核心电压从1.8V降到1.5V同时降低主频。这就是DVFS的基本思路。PIC32MZ1024EFK144支持频率切换配合PCA9422的调压能实打实地降低动态功耗。但要注意降频和降压的顺序是先降频再降压升回来的时候是先升压再升频。顺序反了MCU可能在低压下跑高频直接死机。5.3 休眠阶段关掉不必要的电源域进入低功耗模式前可以通过PCA9422关闭外设电源域只保留MCU核心和唤醒所需的电路。这一步能显著降低静态功耗。唤醒时再按顺序恢复。这里有个坑如果你把I2C总线的上拉电源也关了那MCU就没法通过I2C去唤醒PMIC了。所以上拉电源必须来自常开域或者至少要在休眠期间保持。6. 调试实录我踩过的那些坑6.1 通信不上先查地址和上拉第一次调PCA9422时I2C死活读不到数据。排查顺序是先量上拉电阻两端电压发现只有0.2V说明总线被拉死。再查发现上拉接到了某路可关闭的输出上而那路输出默认是关的。把上拉改到常开3.3V后通信立刻正常。这个坑很典型硬件设计时没考虑电源域归属软件怎么调都没用。6.2 电压配置对了但输出不对有一次配置完寄存器读回来也对但实测输出电压就是不对。后来发现是反馈电阻网络的问题——PCA9422的输出电压不仅取决于寄存器还和外部反馈电阻有关。如果你用的是可调版本反馈电阻算错寄存器配得再对也没用。所以调试时一定要同时核对寄存器值和实际电压。6.3 上电时序不对导致MCU偶尔不启动最头疼的问题是偶尔不启动。查了很久最后用示波器抓上电时序发现IO电压有时比核心电压先到。虽然只差几百微秒但足以让MCU内部电路进入不确定状态。调整PMIC的时序配置让核心电压明确先建立后问题消失。这个经历告诉我上电时序这种事不能靠应该没问题必须用示波器多通道抓波形确认。6.4 中断引脚没接故障排查全靠猜还有一次系统运行中偶尔复位但没有任何日志。后来把PMIC的中断脚接上才发现是某路输出触发了欠压中断。如果早点接中断脚能省下至少两天时间。7. 把这件事做稳的几个关键习惯7.1 先做电源树再画原理图电源树就是把所有用电的器件、需要的电压、电流、上电顺序列清楚。这一步花半小时能省后面几天。PCA9422的每一路输出对应哪个电源域必须在这张表里定死。7.2 保留测试点每一路电源输出、I2C的SCL和SDA、中断脚都要留测试点。调试时你会感谢自己。尤其是PMIC这种多路输出的器件没有测试点基本没法查。7.3 配置寄存器前先读手册的时序图PCA9422的寄存器配置不是孤立的很多位之间有依赖关系。比如使能某路输出前必须先配置好它的电压和时序。手册里的状态机和时序图要认真看不要只抄别人的配置值。7.4 低功耗策略要实测不要估算休眠电流这种指标估算和实测能差一个数量级。每关掉一路电源域就用电流表量一次。你会发现有些以为关了的域其实还在耗电比如某个上拉电阻、某个LED指示灯。8. 关于这套组合还能怎么扩展PCA9422和PIC32MZ1024EFK144的组合基础功能跑通之后还有不少可以深挖的方向。比如结合MCU的ADC去监测各路电源的实际电压做闭环健康管理比如利用PMIC的中断做故障日志存到MCU的Flash里方便现场问题回溯再比如在电池供电场景下根据电池电压动态调整系统工作模式。我个人在实际项目里的体会是PMIC这东西硬件设计占一半软件配置占一半调试占另一半。三者缺一不可。PCA9422的可编程性给了你很大的灵活度但灵活度也意味着更多配置项和更多出错可能。把电源树理清楚把时序用示波器确认把中断用起来这套方案就能跑得很稳。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →