资讯详情

资讯详情

PCA9422与TM4C1294的完整电源管理方案解析

第一次看到这个组合的时候我也愣了一下PCA9422 这颗 PMIC 分明是给某系列跨界处理器做配套的TM4C1294NCZAD 则是经典的 Cortex-M4F 网络 MCU这两颗芯片放在一起看起来像主板厂商硬凑的混搭套餐。但实际把电源树画完、I2C 链路调通之后我发现这个搭配其实相当顺手——PCA9422 并不挑主控它通过 I2C 把电压配置、上电时序、故障标志和低功耗模式全部开放给主机而 TM4C1294NCZAD 本身又是一颗外设丰富、适合当整板控制中心的大管脚 MCU。这篇文章就是我把这套完整电源管理方案从画原理图到实测跑通的记录适合正在给板卡选 PMIC、以及想把电源时序和故障保护做成软件可管可控的嵌入式工程师参考。1. 一次跨芯片家族的混搭PCA9422 为什么能管 TM4C1294 的整套电很多工程师一看到 PMIC 型号带某跨界处理器配套字样就默认它只能和原厂 MCU 一起用。这是固有思维。PMIC 本质上是一个可编程的供电服务器只要输入电压范围匹配、输出轨足够、控制接口通用它完全可以服务任何一颗外部主控。PCA9422 的 I2C 从机接口不会因为对面站着的是 TM4C1294NCZAD 就拒绝通信硬件上它只认 SDA、SCL、INTB、EN 这些通用信号。1.1 PCA9422 不是专用胶水而是一台可编程供电服务器PCA9422 内部集成多路同步降压转换器Buck和 LDO输入电压范围覆盖单节锂电到 USB 5V这对便携设备和开发板都很友好。和普通 DC-DC 芯片最大的区别在于它的输出目标电压、启动顺序、故障阈值、待机行为全部可以通过 I2C 寄存器改变。也就是说你可以在不换物料的情况下把某一路 Buck 从 3.3V 改成 3.0V或者把某一路 LDO 在系统休眠时关掉这是普通电源芯片做不到的。这类 PMIC 原厂设计它的初衷确实是给自家高性能应用处理器做配套电源管理因为那些处理器有多路电源域、复杂上电时序和动态调压需求。但这不代表它只认自家主控PCA9422 对外的接口就是一组标准控制信号加一组电源输出。TM4C1294NCZAD 作为整板控制中心完全可以扮演电源管家的角色通过 I2C 去读 PMIC 状态、写电压配置、响应故障中断。我评估过它能不能用在这块板子上只需要看三件事输入电压范围是否覆盖板卡输入输出电流是否满足各路负载峰值以及 I2C 时序是否兼容 TM4C1294 的硬件 I2C。这三点满足之后剩下的就是软件配置问题。从工程角度说跨厂家的 PMIC 搭配只要电气参数对齐就没有什么兼容性玄学。1.2 TM4C1294NCZAD 的真实供电需求3.3V 为主VBAT 单独说TM4C1294NCZAD 这颗 MCU 的电源需求很容易被低估因为它的主要供电就是 3.3V。VDD 是数字电源VDDA 是模拟电源这两个域都必须稳定供电。很多新手会问既然都是 3.3V为什么不直接并在一起严格来说模拟电源域对纹波和噪声更敏感最好从输出纹波更干净的一条轨道引出或者至少用磁珠做一级隔离。在实用层面VDD 和 VDDA 同一时刻上电不要制造出先后窗口否则芯片内部 ESD 二极管可能进入正向导通状态造成异常电流。VBAT 是容易被忽略的一路。TM4C1294 的 Hibernate 模块使用 VBAT 供电主电源断电时VBAT 要为内部 RTC 和唤醒逻辑维持供电。VBAT 不能悬空常见做法是直接接到主 3.3V或者通过二极管从电池供电。如果板卡需要极低待机功耗VBAT 必须由独立的电池或常供 LDO 供电而不是等主 Buck 关闭后再想办法。还有一个容易误解的点TM4C1294 虽然有内部 LDO 产生内核电压但它的 VDDC 引脚只需要外部接去耦电容不需要、也不应该由外部电源去驱动。很多人看到内核电压 1.2V 就想着去接 PMIC 的 1.0V 轨这是会把芯片搞坏的。PCA9422 的多路输出中给 TM4C1294 用的其实主要就是 3.3V 轨和 VBAT 常供轨剩下的 Buck/LDO 是给板上其他器件用的。1.3 我这次定的管理目标四件事缺一不可把 PCA9422 放到 TM4C1294 板卡之后我给自己定了四个必须达成的目标这也是完整电源管理的真正含义第一多路电压轨统一管理每一路 Buck/LDO 的输出电压、开启顺序都由 MCU 通过 I2C 配置而不是靠硬件电阻硬编码。第二上电时序可控保证 MCU 和外设在电源稳定之前不会进入不定状态。第三故障闭环过压、过流、过温、输入欠压这些异常发生时PMIC 能通过中断通知 MCUMCU 执行保护策略。第四低功耗协同系统进入休眠时 PMIC 关掉不必要的外设轨唤醒时快速恢复。这四个目标不单是为了一块板子也代表一类通用需求硬件上把电源做成可被软件治理的单元而不是一堆无法反馈的固定电压源。接下来各部分就是围绕这四个目标展开的。2. 电源树设计多路 Buck/LDO 如何分配到整板电源树是整个项目的地基。PMIC 有多少路输出并不重要重要的是每一路输出服务于哪类负载、是否允许被突然关断、对噪声是否敏感。我先把板卡上的负载按特性分成几组再去匹配 PCA9422 的 Buck 和 LDO这样分配起来就有依据了。2.1 把板卡负载按电流大小、噪声敏感度、是否可以掉电分类板卡负载大致可以分成三类。第一类是常供核心负载包括 TM4C1294 的 VDD/VDDA、以太网 PHY、USB PHY。这类负载电流不小对稳定性要求高不允许在正常运行时被突然断电纹波要控制在 MCU 数据手册要求的范围内适合用纹波性能较好的 Buck 供电。第二类是外设负载包括 SD 卡、RS485 收发器、按键扫描电路、状态指示灯。这类负载可以随系统进入休眠而关闭唤醒后再恢复供电。它们对电压纹波不敏感可以共轨也可以由独立 Buck 单独控制。第三类是模拟和小电流负载包括传感器、EEPROM、电平转换器、RTC 域。电流小但噪声敏感度差异大适合用 LDO 供电尤其是对模拟传感器供电LDO 本身的低噪声优势比 Buck 明显得多。把负载分类之后再去数 PCA9422 的路数是否够用而不是反过来拿着 PMIC 输出硬凑。我的原则是Buck 优先给大电流负载LDO 优先给小电流敏感负载常供轨和可断轨必须物理分开。2.2 具体的 rail 分配表与选型理由下面是我这块验证板上最终的电源轨分配直接给出一张总表电源轨来源目标电压服务对象是否常供上电顺序3V3ABuck03.3VTM4C1294 VDD/VDDA、以太网 PHY、USB PHY常供13V3BBuck13.3VSD 卡、RS485、LED、按键可关断21V8ALDO01.8V传感器、EEPROM、电平转换可关断3VIO_CORELDO10.9V~1.05V 动态板载 FPGA 内核可关断4VBAT外部电池/3V3A 隔离3.3VTM4C1294 HIB 模块常供上电前有效3V3A 用的 Buck0 是整板最重要的轨。TM4C1294 的 VDD 和 VDDA 都挂在这条轨上所以我特意让同一路 Buck 同时给两个域供电避免出现 VDD 先到、VDDA 后到的窗口。以太网 PHY 对电源瞬态有要求挂在同一个 Buck 上也没有问题前提是 Buck 的峰值电流余量要留够我按负载峰值再加至少 30% 的裕量来选。3V3B 是外设轨和主轨分开的好处是休眠时可以单独关闭SD 卡和 RS485 在系统待机时就不会偷偷漏电。1V8A 由 LDO0 提供传感器这类小电流负载用 LDO 比 Buck 干净而且 LDO 关断后几乎没有静态电流。VIO_CORE 是我特意拿来做动态电压调节演示的 FPGA 内核轨用 LDO1 配合 DVS 功能后面会细说。2.3 布局与去耦PMIC 到 MCU 的距离决定成败电源轨分配做得再好PCB 布局不行也是白搭。PMIC 的开关节点是强噪声源Buck 电感应该靠近 PMIC 输出引脚并且开关节点的铺铜面积要尽量小减少天线效应。TM4C1294 的 VDD 引脚是最好的处理器电源旁路位置但处理器大管脚封装引脚多、分布广一个共用的 3.3V 网络必然会有较长走线这时候就要在网络的关键尽头各放一组 0.1uF 陶瓷电容而不是只在电源入口放一颗大电容了事。我踩过的实际教训是一开始把 PCA9422 放在板子一角TM4C1294 在另一角3V3A 的长走线沿途没有加电容结果以太网 PHY 发包时瞬间拉低电压MCU 偶发复位。后来在 MCU 电源引脚附近补了多组高频陶瓷电容并把反馈采样点改到负载端问题才消失。对于带反馈端的 Buck采样点一定要放在负载端而不是 PMIC 输出端否则线上压降会让 MCU 实际电压低于设定值。还有一点PWM/PFM 模式的跳变会导致输出电压纹波突变轻载时如果 MCU 运行在对电压敏感的模拟采样任务建议强制 PMIC 进入 PWM 模式牺牲一点轻载效率换取稳定的纹波。这个可以通过 PCA9422 的模式寄存器配置不用改硬件。3. TM4C1294 通过 I2C 接管 PMIC控制链路的完整搭建PMIC 提供再多的电源轨如果不能被主控读取和修改也只是个高级 DC-DC。真正让整套系统变成可管理的关键是 TM4C1294 与 PCA9422 之间的 I2C 控制链路。这里我从引脚分配、读写验证、驱动骨架到常见通信故障把整个链路搭建过程完整拆开。3.1 引脚分配与电平匹配PCA9422 的 I2C 引脚是 SDA 和 SCL另外还有中断输出 INTB、使能引脚 EN。TM4C1294 这边我选了一组硬件 I2C 外设引脚具体引脚号取决于板子布线重点是电平匹配问题。PCA9422 的 I2C 工作电平受其内部接口电源支配我把 PCA9422 的接口电源脚接到了 TM4C1294 的 3.3V这样两边逻辑电平完全一致不需要额外电平转换。INTB 是漏极开路输出低电平有效所以必须接上拉电阻到 3.3V。这个上拉电阻不能省略否则 INTB 永远浮空MCU 读到的电平无意义。EN 引脚用来控制 PMIC 的全局开关我把它接在 TM4C1294 的一个 GPIO 上这样 MCU 可以通过软件把整个 PMIC 置为 standby 或恢复工作。I2C 总线本身的 SDA/SCL 也需要上拉电阻。上拉电阻小会让信号边沿更陡但会使静态电流变大上拉电阻太大会在总线电容大时拉不陡。我按 400kHz 快速模式来设计使用 4.7kΩ 上拉总线总电容预估控制在 200pF 以内。如果后续要跑 1MHz 快速模式以上需要重新计算上拉电阻和总线电容。3.2 寄存器读写与通信验证PCA9422 的 I2C 从机地址由硬件引脚配置决定默认值通常在 0x20 附近具体以手册为准。我建议软件里把地址定义成一个宏后续如果 ADDR 引脚改了地址只需要改一个宏定义。通信验证不要急着去配置输出第一步先读芯片版本标识或厂商 ID 寄存器。读不到预期值后面所有写操作都是盲写。我遇到过 I2C 能 ACK 但读回全是 0xFF 的情况那多半是接口电源没接或者地址搞错了。下面是一个极简的 I2C 读写函数骨架方便你快速验证通信#define PMIC_ADDR 0x20 uint8_t pmic_read_reg(uint8_t reg) { uint8_t val 0; // 启动条件发送从机地址 写位 // 发送寄存器地址 reg // 重新发送启动条件发送从机地址 读位 // 读取一个字节 val发送 NACK停止条件 return val; } uint8_t pmic_write_reg(uint8_t reg, uint8_t val) { // 启动条件发送从机地址 写位 // 发送寄存器地址 reg // 发送数据 val // 停止条件 // 返回 ACK 状态0 表示成功 }这里的重点是每次修改 PMIC 关键寄存器后一定要回读确认。PMIC 寄存器写入不是瞬时的如果电压配置寄存器写入后立即读状态读到的可能是旧值要加一个微小延时再回读。3.3 驱动代码骨架查询状态、配置电压、处理中断把 I2C 基础打通之后就可以构建真正的电源管理驱动了。我通常把它拆成四个函数初始化、读状态、写电压、中断处理。初始化里做芯片 ID 校验、默认故障屏蔽配置、各路输出电压设定读状态函数把 PCA9422 的故障标志读回来并转成系统可读的结构体写电压函数专门用于 DVS 调压内部包含更新目标电压、等待稳定、回读校验三步。中断处理函数是整个闭环的核心void PMIC_INT_Handler(void) { uint8_t flags pmic_read_reg(PMIC_FLAG_REG); if (flags PMIC_FAULT_OVP) { // 过压记录事件检查是否误报必要时关断对应 rail } if (flags PMIC_FAULT_OCP) { // 过流先保存现场尝试关断外设轨 } if (flags PMIC_FAULT_OTP) { // 过温降低负载必要时进入散热模式 } if (flags PMIC_FAULT_UVLO) { // 输入欠压准备进入掉电流程保存关键数据 } pmic_write_reg(PMIC_CLR_REG, flags); // 读后清标志 }这里有个很重要的习惯清标志不要直接写 0xFF 清全部而是要把刚才读到的 flags 原样写回。因为如果同时发生了两个故障你读到的 flags 是两者的或值直接清全部可能把还没来得及读取的标志也清掉导致漏处理。3.4 抓错必看I2C 通信不 ACK 的三种原因I2C 调试中最常见的现象是主机发送地址后收不到 ACK。我总结下来原因主要有三种。第一种是 PCA9422 的接口电源没上电导致从机根本没有 I2C 电平基准SDA 拉不低。第二种是从机地址不对尤其是 ADDR 引脚悬空或接法不同导致地址偏移解决方法是示波器抓地址字节对比手册里的地址表。第三种是总线上有其他设备也在同时通信多个主机冲突或者从机地址冲突。还有一种情况比较隐蔽PCA9422 在某些低功耗模式下会关闭 I2C 响应。如果 MCU 尝试在 PMIC stand by 状态读写设备可能不 ACK。此时必须先通过 EN 引脚唤醒 PMIC等待其内部状态机回到正常模式再发起 I2C 通信。这个坑在低功耗联调时很容易遇到后面低功耗章节还会再提到。4. 上电时序与 MCU 复位联动防止MCU 醒了却吃不饱电源管理里最容易翻车的就是上电时序。很多工程师只关注最终电压值忽略了电压出现的先后顺序。MCU 的复位引脚是靠外部上拉维持高电平的如果电源还没稳定就释放复位MCU 内部的 POR 检测电路会在电源跌落时进入不明确状态轻则启动失败重则引脚驱动冲突。4.1 为什么时序窗口比电压值更致命芯片在上电过程中内部寄存器、IO 驱动、模拟模块会逐个进入工作状态。如果有的电源轨已经到 3.3V有的还是 0V芯片内部的 ESD 二极管会成为意外的导通路径。TM4C1294 的 VDD 和 VDDA 尤其需要注意模拟电源域如果比数字电源域晚到模数接口区域的钳位二极管会产生可观电流时间长了还可能损伤引脚。这个问题之所以被称作窗口问题是因为真正危险的只是上电瞬间那几毫秒到几十毫秒。有的工程师在单板上电调试时示波器看到两路电源最终都到了 3.3V就觉得时序没问题其实他没有观察中间过程。正确做法是让多路关键 rail 要么严格同步上升要么按手册规定间隔依次上升不能出现交叉。4.2 我用 PCA9422 的启动顺序寄存器搭出的时序PCA9422 这类 PMIC 通常会提供上电顺序控制功能可以配置每路输出的启动延时。我把 Boot 过程设计成四步第一步输入电压有效后VBAT 常供域立刻建立TM4C1294 的 HIB 模块有电。第二步延时几毫秒后 Buck0 启动3V3A 主轨上升同时保持 MCU 复位为低。第三步3V3A 稳定后单片机复位释放TM4C1294 开始执行启动代码。第四步MCU 启动完成后通过 I2C 主动开启 Buck1 和 LDO让外设轨和传感器轨上电。这里的关键设计是外设轨不是靠 PMIC 硬件顺序自动开启的而是由 MCU 在软件启动后期主动打开。这样做有两个好处一是 MCU 可以检查外设的存在性再决定是否供电二是系统复位时外设不会跟着一起反复上下电减少了 SD 卡和 RS485 这类对外设的异常冲击。4.3 PG/复位信号的接法RC 延时为什么不可靠很多老式设计喜欢用 RC 延时电路来控制 MCU 复位电容慢慢充电到阈值MCU 才开始运行。这种方案在简单板卡上能用但在多路电源轨系统中非常不可靠因为 RC 延时只是从上电时刻开始计时它并不知道电源轨到底有没有稳定。正确做法是使用 PMIC 的 Power Good 信号。PCA9422 的 PG 输出会等到对应输出轨进入合格范围后才拉高这个信号天然反映了电源状态而不是简单计时。我把 PG 信号经过整形后接到 TM4C1294 的复位引脚并配合一个开漏复位芯片做隔离确保 3V3A 未达标时 MCU 一直处于复位状态。这里有个细节要注意PG 信号本身可能是漏极开路输出需要上拉。如果你把 PG 的上拉电阻接到了它要监控的 3V3A 轨上那么电源轨没起来时 PG 也没有上拉电压永远拉不高MCU 永远复位。PG 上拉应该接到一个始终有电的电源或者干脆用 PMIC 的内部上拉否则就会出现看起来接法没错但 MCU 一直在复位的怪问题。4.4 用示波器验收整套时序时序设计得好不好最终要用示波器验收。我用四通道示波器同时测 VIN、3V3A、3V3B、复位信号设置第一个上升沿触发。验收标准不只是看四路波形最终是否都到正确电压还要看3V3A 上升到 90% 的时间点是否早于复位释放时间点3V3B 是否在外设初始化时才开启VIN 跌落时各路是否按照逆序关闭。在测试过程中有个非常重要的小习惯把示波器时基调大覆盖从首次上电到 MCU 开始运行的全过程同时把电压探头衰减倍率校准一致。不要只截取某一路的上升沿因为很多时序问题发生在几十毫秒之后比如 Buck0 已经稳定Buck1 启动瞬间把 VIN 拉低导致 Buck0 发生跌落这个现象只有在多通道同屏观察时才能发现。另外上电斜率也不能太慢。PMIC 的输出电容决定了很多时候斜率是天然的但如果为了降低浪涌电流故意把软启动拉得特别长反而可能导致 MCU 的 POR 阈值迟迟不满足表现为上电时间很长但 MCU 一直不复位。我建议按照 PMIC 默认软启动时间测试一次只有在实际出现浪涌过流时才去调整软启动参数。5. 故障保护状态机从 INTB 中断到自动断电的闭环电源管理不能只会在正常状态下工作还要能在异常状态下自保。PCA9422 会把多种故障通过 INTB 引脚通知主控但中断只负责通知真正决定系统如何响应的是 TM4C1294 里跑的保护状态机。这一节我就讲怎么把这个闭环做扎实。5.1 PMIC 常见的故障类型与标志位PCA9422 这类 PMIC 常见故障标志包括输出过压、输出过流、芯片过温、输入欠压、Buck 工作状态异常。每一类故障都会在状态寄存器中留下标志位部分故障还会通过 INTB 引脚拉低来提醒主控。过压通常意味着反馈环路异常或者外部注入例如热插拔、DC-DC 的反馈采样点断开这类故障一旦发生继续运行可能会烧坏负载系统应当尽快执行保护。过流相对复杂Buck 在过流时可能进入打嗝模式反复尝试重启此时输出电压出现周期性通断必须由 MCU 读取状态后决定是降低负载还是彻底关闭。过温则和板卡散热强相关芯片内部温度超过阈值后可能降额甚至关断MCU 需要区分是可恢复还是必须停机冷却。输入欠压是最容易被忽略的。便携系统里电池电压逐渐下降当电量接近耗尽时PMIC 会在掉电前的最后阶段发出中断。此时 MCU 应该把重要数据写入非易失存储、关闭外设、做好掉电准备而不是等到输入完全中断后被动丢电。5.2 TM4C 中断入口怎么设计才不会漏事件INTB 是低有效中断TM4C1294 的 GPIO 需要配置成下降沿触发并且使能内部上拉。中断服务程序里做的第一件事不应该是执行保护动作而是尽快读取状态寄存器把故障快照保存下来因为 PMIC 的部分故障标志可能在芯片复位后自动清除。我在实际项目中的做法是GPIO 中断里只做三件事读取状态寄存器并保存、清除中断标志、设置一个事件标志通知主循环。真正复杂的保护策略放在主循环里处理因为中断里做延时和 I2C 长事务都不合适。这里有一个经验值中断服务程序里 I2C 读取不超过两个寄存器其余都留给主循环这样就不会干扰其他中断的响应。中断抖动也要注意。故障发生时电源轨可能出现快速振荡INTB 会随之反复拉低。如果 GPIO 配置成了电平中断而不是边沿中断MCU 可能被中断风暴困住。用边沿触发加事件标志再加上主循环里的消抖延时就能避开这个问题。5.3 处置策略限流、分级关断、完整重启保护策略没有一个万能的答案我按照危害程度把处置方式分成了三级。第一级是局部限流降载。当检测到过流或过温时先关闭非关键外设轨比如 SD 卡、RS485、传感器电源观察故障标志是否恢复。如果恢复系统继续以降级模式运行。第二级是安全关断。当故障持续存在或者检测到过压时按逆序关闭外设轨保留 3V3A 主轨和 VBAT让 MCU 有足够时间保存现场。第三级是完整掉电重启。当故障涉及输入欠压或 PMIC 自身保护时MCU 保存关键数据后主动通过 EN 引脚让 PMIC 进入待机等待外部条件恢复后再重新启动。这种分级策略的核心思路是不要一遇到故障就把整板断电。很多瞬态故障比如 SD 卡插入时的浪涌其实是可以通过一级处置恢复的粗暴断电反而会把系统可用性做得很差。5.4 一个让我查了整晚的故障标志坑这里说一个让我印象非常深的坑。第一次把故障状态机跑起来之后板子每隔几秒就触发一次 INTB 中断读到的标志是过压但输出电压明明稳定在 3.3V怎么查都查不到原因。后来我用逻辑分析仪抓 I2C 波形才发现问题出在清标志的时机上。我原来的处理流程是中断读标志、执行保护、最后清标志。但 PMIC 的故障标志在过压条件消失后本来就会自动清除一部分当我执行完保护回头再清标志时清掉的其实是下一次新产生的事件标志。正确的流程应该是读到标志后立即原样写回清除然后记录快照再执行保护这样才不会把新事件当成旧事件处理。这个坑虽然小但对状态机的可靠性影响很大。写保护逻辑的时候一定要想清楚标志是谁产生、谁清除、什么时候清除否则就会出现系统一直在响应一个已经不存在的故障的诡异现象。6. 低功耗与动态电压调节从 Duty 到 Hibernate 的实测完整电源管理最后要看的是低功耗。TM4C1294 本身有多种低功耗模式PCA9422 也支持 PFM、关轨、待机等省电手段两者配合才能真正把整板功耗压下来。这一节我以三个典型工况为主线讲清楚 PMIC 侧做了什么、MCU 侧做了什么以及 DVS 动态调压的正确操作顺序。6.1 三种运行态的电源需求差异整板正常运行时3V3A、3V3B、1V8A、VIO_CORE 全部开启此时关注的是满载效率和纹波PMIC 工作在 PWM 模式。系统进入轻度空闲时MCU 可以进入 Sleep 或 Deep Sleep外设轨理论上不需要全开着这时把 3V3B 关掉能省掉 SD 卡、RS485 这些外设的静态电流。进入 Hibernate 模式时TM4C1294 的主电源甚至可以被关掉只剩下 VBAT 给 HIB 模块供电。不过我在这个项目里没有把 3V3A 完全切断因为 Tiva 的 HIB 电流已经很低保持主轨可以大幅简化唤醒路径。如果非要追求极致低功耗就要让 PMIC 进入 standby 模式并把唤醒源设计在 PMIC 的 EN 引脚上而不是等 MCU 醒了再去拉 EN否则会出现全板断电、MCU 唤不醒的死局。三种运行态的差异本质上是对 PMIC 不同模式的调用运行态用 PWM 波保证性能空闲态切 PFM 或者直接关外设轨休眠态只保留最小供电域。电源管理的价值就是把这些切换做成软件可配置的自动流程。6.2 PMIC 侧的低功耗手段PFM、关轨、standbyPCA9422 在轻载条件下可以切入 PFM 模式降低开关频率和开关损耗轻载效率比固定 PWM 高很多。但 PFM 模式有一个副作用输出纹波比 PWM 模式大。如果系统只是待机纹波大点无所谓如果待机时还挂着模拟采样任务就需要强制 PWM。关轨是第二板斧。I2C 可以直接关闭不需要的 Buck/LDO 输出轨我通常把 3V3B 和 1V8A 当作可关轨Hibernate 时全部关闭只保留 3V3A 和 VBAT。这样做的好处是外设的静态电流被彻底切断而不是靠外设自己进入省电模式省电效果稳定可预期。standby 是第三板斧。让 PCA9422 整体进入低功耗待机状态DCDC 全部停摆只保留内部小电流电源。这个模式适合整个系统深度休眠的场景但要注意进入 standby 之前一定要确认 TM4C1294 的 HIB 模块已经配置好唤醒源否则 MCU 自己可没法再从 standby 拉回来。6.3 DVS 调压的正确顺序先降频还是先降压DVS 动态电压调节是本项目里比较有意思的一部分。VIO_CORE 是板上 FPGA 内核轨工作频率高时需要 1.05V低负载时只需要 0.9V。如果只看最终电压值调压的时机也很重要。正确的顺序是降载时先让 FPGA 降频然后通过 I2C 把 LDO1 输出目标电压改到 0.9V等待电压稳定后再让 FPGA 在低频段运行。升载时反过来先提高目标电压到 1.05V等 PG 或者延时确认电压稳定后再让 FPGA 升频。如果顺序反了高频段的时序要求配上低压供电FPGA 内部逻辑可能立刻出现时序违规板子直接进入异常状态。DVS 切换的时间参数也要关注。PMIC 从一个电压斜坡到另一个电压需要时间这个时间受输出电压差和压摆率控制。我实测后为这块板子加了一个 1ms 到 5ms 的稳定等待窗口如果负载变化更频繁需要用 PG 信号而不是固定延时来判断电压是否真正到位。6.4 实测数据与一个容易被忽略的唤醒路径下面是我在验证板上测到的三种典型工况整板电流数据包含 PCA9422 自身静态功耗和所有挂载负载可以当作参考运行状态整板电流关键说明满载运行全部 rail 开启约 280mA3V3A 3V3B 1V8A VIO_CORE 全开PWM 模式空闲待机外设轨关闭约 45mA3V3B/1V8A 关闭MCU Deep SleepPMIC PFM 模式HibernateVBAT 保持约 1.2mA3V3A 保持主电源几乎全部关闭RTC 运行从 280mA 降到 1.2mA对电池供电的产品来说就是续航从一天变成两周的量级差距。这个结果不是单靠 MCU 省电模式拿到的PMIC 关轨和 PFM 切换贡献了一大半。最后提一个容易被忽略的唤醒路径问题如果 MCU 进入了 Hibernate它醒来之后第一件事是执行启动代码。如果你把 3V3B 外设轨的开启逻辑放在很后面的初始化里而唤醒中断源本身挂在外设上就会遇到设备已经发出唤醒事件但外设轨还没供电的先后矛盾。我的做法是把外设轨开启放到启动代码最前面至少在中断源使能之前完成否则唤醒事件会被直接丢掉。电源管理做到这个程度才算真正完整正常状态下多路供电稳定异常状态下有闭环保护休眠状态下功耗可接受唤醒路径上不会出现电源和外设互相等待的死结。这套基于 PCA9422 和 TM4C1294NCZAD 的方案到这一步就基本落地了。
觉得有用,分享给同行:

为您的企业打造数字门面

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

立即咨询 →