我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

PCA9422与PIC18F66K40组合实现低功耗电源管理完整方案

PCA9422与PIC18F66K40组合实现低功耗电源管理完整方案 这两年做便携类和低功耗嵌入式项目的电源方案时我反复绕不开同一件事PCA9422 和 PIC18F66K40 的组合实现完整电源管理。这颗 PMIC 和这枚 8 位 MCU 搭配起来既能覆盖动态调压、多通道时序又能把静态功耗压得很低。这篇文章我从芯片选型到电路设计、固件流程、时序安排、实测排查从头到尾捋一遍直接给出可复用的工程方案。先交代一下背景PCA9422 是多通道电源管理芯片集成降压 DC-DC 和 LDO内置 I2C 可编程输出、状态监测、错误标志等非常适合做主控板的电源分配PIC18F66K40 则是低功耗 8 位单片机自带 MSSP 模块I2C/SPI、ADC、运放和固定参考电压有 XLP 低功耗技术可以在系统休眠时保持极低功耗。两者组合后单片机不仅负责设备的业务逻辑还兼任电源管家上电时序、电压调节、掉电保护、休眠唤醒全都能管。这篇文章适合正在做电池设备、MCU 核心板、传感器节点电源设计的朋友也适合那些想把 PMIC 真正用起来、而不只是当稳压器用的人。1. 整体设计思路为什么是这对组合1.1 分立方案的问题很多工程师一开始做电源习惯用“LDO TPS 系列的 DC-DC 逻辑控制”这种纯分立方案。分立方案的优点是人人都熟手册多、参考设计多调试路径也清楚。但放到完整电源管理的场景里问题就出来了多路电源需要分别设计反馈电阻网络电压调整靠换电阻动态调压不方便各路电源上电时序靠 RC 延时或逻辑门硬搭修改时序就要改板子整体功耗数据分散电压电流监测要另加 ADC 采样电路一个系统里芯片型号五花八门BOM 管理复杂贴片麻烦。如果你只是做一个固定电压、单一上电顺序的简单板卡分立方案完全够用。但当系统有“核心电压需要随负载变化”“某些外设要晚于主控启动”“休眠时大部分电源要关断”这些需求时分立方案的成本和复杂度会迅速上升。1.2 PCA9422 能替你做掉哪些事PCA9422 的核心价值就是把多路电源和它们的控制逻辑集中到一颗芯片内。I2C 接口可以直接改写各路输出目标电压不用动硬件。启动时的默认电压、上下电顺序、关断使能等都可以通过寄存器设置配合 MCU 的 GPIO 和 I2C时序控制从“硬件搭”变成“软件写”。实际项目中我最常用它来管理主核电压 VCore动态调压比如 1.0V~1.2VIO 电压 VIO固定 3.3V 或 1.8V模拟 LDO 输出给传感器或 ADC 参考电路供电其它外设电源轨这种方式下硬件只需要保证 PMIC 输入电源正常、电感电容选型正确剩下的电压策略全部放在固件层改电压像改配置一样简单。对批量产品来说后期做性能调整时不用重新投板能节省不少成本。1.3 PIC18F66K40 在电源管理里的角色PIC18F66K40 在这个方案里不是“顺便用一下”它必须完成这些工作通过 I2C 对 PCA9422 的寄存器进行读写完成电压配置、状态读取在系统启动时按照时序开启或关断各路电源利用内置 ADC 采集关键电压/电流点判断电源是否正常在休眠时进入低功耗模式必要时用外部唤醒或 PMIC 中断唤醒 MCU处理异常状态比如过流、过热、欠压时做保护动作。选它而不是其它系列的原因是功耗和集成度均衡。XLP 技术的休眠电流可以做到纳安级别同时片上自带运放和固定参考电压这让电源监测电路的 BOM 可以进一步简化。I2C 通信对 8 位 MCU 来说完全不是负担处理速度也足够。2. 核心电路设计与引脚级要点2.1 PCA9422 外围元件选型PMIC 用得好不好一半看代码一半看外围。PCA9422 的降压通道对输入输出电容、电感的选型有明确要求原理图设计时必须按照手册推荐值先搭再根据实际纹波测试结果微调。我一般这样选输入电容22uF 陶瓷电容 0.1uF 高频去耦放置在 PMIC 输入引脚附近输出电容每路降压输出 22uF 或 47uFX5R 或 X7R 材质不能选 Y5V电感按每通道额定电流选择饱和电流裕量通常选额定电流的 1.5 倍以上DCR 越小效率越高LDO 输出10uF 输出电容即可注意噪声敏感负载最好加一个小 RC 滤波I2C 上拉电阻通常 2.2k 到 4.7k 均可取决于总线上挂几个设备和通信速率。核心细节PCA9422 的默认输出状态由启动时的配置决定。用 MCU 管电源的系统第一次上电时 PMIC 先按默认配置输出安全电压MCU 起来后再通过 I2C 重新写目标电压。默认电压可能和最终工作电压不一致但必须保证默认状态能让 MCU 正常启动否则就会出现单片机活不过来、I2C 没人配的“鸡生蛋”问题。2.2 PIC18F66K40 与 PCA9422 的连接关系PIC18F66K40 的 MSSP 模块可以配置为 I2C 主机。连接时SCL 接 PMIC 的 SCLSDA 接 PMIC 的 SDA两者都需要外部上拉到 VIO 电平PMIC 的中断输出引脚可以接一个 GPIO用于捕获电源异常PMIC 的使能/复位引脚由 PIC 的 GPIO 控制用于强制复位 PMIC 或完整关断。电平匹配是这里最容易踩的坑。PCA9422 的 I2C 电平以 VIO 为参考如果 PIC18F66K40 的 I/O 电压域和 VIO 不一致就需要加电平转换。很多工程师图省事直接接上结果通信时好时坏或者电流倒灌都是电平不匹配导致的。因此原理图阶段就要确认 VIO 到底是什么电压与 MCU 的 VDD 是否同一个网络。2.3 通道分配策略通道分配没有标准答案但有个基本逻辑先看负载对电压和噪声的要求再看电流大小。以我最近做的一个传感器采集节点为例电源轨电压负载分配通道说明VCore1.0V~1.2VMCU 核或 FPGA 核DC-DC1需要动态调压VIO3.3V外设、逻辑电路DC-DC2固定电压AVDD3.0V模拟前端、ADC 参考LDO低纹波隔离噪声VBAT3.7V~4.2V电池输入输入端多通道共用输入这样分配的原则是核电压用 DC-DC 因为电流大、需要效率模拟部分用 LDO 因为纹波小、噪声低固定数字电源用 DC-DC 兼顾效率。电源轨间不要共用输出电容防止上电瞬间互相耦合。3. 固件实现I2C 控制与动态调压3.1 I2C 读写协议PCA9422 的寄存器空间按通道划分写一个输出配置需要在指定寄存器地址填入目标电压编码。PIC18F66K40 作为主机使用标准的 7 位地址写/读流程。需要注意的是某些 PMIC 支持“寄存器自动递增”如果连续配置多个通道可以利用这个特性减少通信次数。下面是 PIC18F66K40 主机写一个字节的基础代码片段void i2c_write_byte(uint8_t dev_addr, uint8_t reg_addr, uint8_t data) { // 发送起始位 I2C1CON1bits.SEN 1; while (!I2C1STATbits.SEN); // 发送设备地址 写标志 I2C1TXB (dev_addr 1) | 0; I2C1CON1bits.TXEN 1; while (!PIR3bits.I2C1IF); // 发送寄存器地址 I2C1TXB reg_addr; I2C1CON1bits.TXEN 1; while (!PIR3bits.I2C1IF); // 发送数据 I2C1TXB data; I2C1CON1bits.TXEN 1; while (!PIR3bits.I2C1IF); // 发送停止位 I2C1CON1bits.PEN 1; while (!I2C1STATbits.PEN); }这个函数看起来简单但工程上要做两件事超时和重发。I2C 通信一旦 PMIC 没准备好主机会一直等。所以至少要加一个超时计数超时后清总线、报错误、重试三次。我在项目里踩过打嗝式启动问题就是 PMIC 上电未稳定时 MCU 就开始配寄存器结果写入被忽略后面系统行为变得很诡异后来靠“启动延时 读回校验”解决的。3.2 输出电压的计算与配置每个通道的目标电压对应寄存器里的一个编码不一定等于电压数值本身可能是 LSB 权重乘以整数值。以常见 VOUT 计算公式为例某通道输出电压 基准电压 (电压档位 × 步进值)假设步进值是 10mV基准是 800mV那要配到 1.1V 时档位 (1100 - 800) / 10 30寄存器写入 30。代码里不建议硬编码最好做一层映射函数uint8_t voltage_to_code(uint16_t mV, uint16_t base_mV, uint16_t step_mV) { return (uint8_t)((mV - base_mV) / step_mV); } uint16_t code_to_voltage(uint8_t code, uint16_t base_mV, uint16_t step_mV) { return base_mV (uint16_t)code * step_mV; }实际使用时配置完寄存器后必须读回校验。如果不一致要么是 I2C 电平不稳要么是 PMIC 在忙。读回校验这个习惯能帮你省掉大量项目后期排查时间。3.3 动态电压调节的固件策略动态调压是 PCA9422 方案的优点但调压不能简单“写一个新值就完事”。负载对大步进电压突变很敏感瞬间压差可能造成过冲轻则系统复位重则损坏负载。我采用的方式是“阶梯调压”先读取当前电压编码计算目标编码差值的绝对值如果差值超过允许的最大单步步进比如 50mV就分多次写入每次写入后延时 1ms~5ms等电源稳定后再写下一档全部完成后读回最终值确认。举个例子从 1.0V 调到 1.2V允许步进 50mV代码会依次写 1.05V、1.10V、1.15V、1.20V。这个过程中负载一直处于有效供电状态不会出现掉电窗口。实际测试中这种调压方式配合足够的输出电容核心电源几乎没有可观察到的电压塌陷。另外在调压期间最好暂停 PMIC 中断处理或对中断做好标记防止频繁的电压变化触发不必要的报警。4. 上电与掉电时序电源管理的核心价值4.1 为什么时序极其重要很多 MCU 和外设对电源上电顺序有硬性要求。比如 FPGA 的 IO 电源先于核心电源上电可能会导致 IO 引脚闩锁多路电源同时上电也可能引起大电流冲击让 PMIC 触发过流保护。时序设计本质上就是给每个电源轨划定“启动窗口”按顺序来。上电顺序不是以为“把默认使能打开就完事”而是从硬件默认状态和 MCU 控制两个层面共同保证。如果只用硬件默认使能PMIC 上电可能所有通道一起起来那是硬件设计时就要避免的。正确的做法默认状态只有一两个关键通道输出其它通道全部保持关闭由 MCU 通过 I2C 或 GPIO 逐个开启。4.2 上电顺序设计还是以那个采集节点为例顺序电源轨电压开启方式说明1VIO3.3VPMIC 默认输出MCU 供电先起来2AVDD3.0VMCU 写 LDO 使能模拟部分稳定3VCore1.1VMCU 写 DC-DC 使能核心电压最后给4外设轨3.3VMCU GPIO 控制外部外设等主控就绪第 1 步很关键MCU 要运行它的 VDD 必须先起来。第 3 步放在模拟电源之后是因为核心电压通常带动态调压先起来外设轨会把噪声引到敏感负载上。第 4 步由 MCU 的 GPIO 控制是给外设单独加一层保护万一主控还没配好外设状态外设不会提前上电乱跑。上电延时我用的是软件延时加等待电源稳定。最稳的方式是读 PMIC 的状态寄存器确认对应通道已经 output good再开启下一路。4.3 掉电顺序与低功耗休眠掉电顺序通常和上电顺序相反先断开外设轨再关核心电压最后关模拟电源。很多人容易忽略的一个点是如果 MCU 所在的 VIO 先掉电而其它电源还带电芯片引脚可能通过内部二极管倒灌电流轻则功耗异常重则损坏 MCU。所以 MCU 的电源轨一定最后掉。休眠场景的处理策略是MCU 进入休眠前先把外设轨和模拟电源关掉只保留 VCore 或 VIO 用于唤醒。唤醒后 MCU 再按正常上电顺序把各电源轨依次打开。这样处理的好处是静态功耗可以做到很低比“所有电源一直开着”的方案省电得多。我实测过一个用例保持所有电源轨开启系统休眠电流约 3.2mA关闭外设和模拟电源后休眠电流降到 40uA 以下效果非常明显。对电池供电的产品来说这个优化比 MCU 休眠本身还重要。5. 实测数据、常见问题与排查方法5.1 关键测试点与实测参考电源管理做得好不好不能只看能不能开机。我列一下必测项目和参考数据测试项测试方法参考结果各轨电压精度万用表测 PMIC 输出端±1% 以内输出纹波示波器 AC 耦合20MHz 带宽 30mVpp调压响应时间动态切换档位观察波形100us 内稳定上电时序间隔多通道同步抓取按设计延时执行休眠电流串电流表整板休眠与预估一致I2C 通信稳定性连续读写 1000 次无错误纹波是最直观反映板级设计水平的数据。如果纹波超了先看电感有没有选合适饱和电流裕量是否足够再看输出电容是否放在靠近芯片输出引脚的位置。这一步省不了电源布局不是玄学是实打实的规则。5.2 常见问题与排查方法我整理了实际项目里遇到过的几类问题按出现频率排序现象可能原因排查方法I2C 写不进去上电未完成、地址错误、电平不匹配抓 SDA/SCL 波形确认地址加启动延时电压输出偏高反馈网络错误、寄存器配置不生效读回寄存器检查电压编码计算公式上电后 MCU 没起来VIO 默认输出未开或默认电压不足测量 MCU VDD 电压波形检查 PMIC 默认配置动态调压时复位电压步进太大、输出电容不足改用阶梯调压增大输出电容休眠电流降不下去外设电源没关闭或引脚倒灌检查每个电源轨使能状态测各路电流PMIC 温度高电感饱和、布局散热不良测电感电流波形检查 PCB 铺铜有一个很隐蔽的问题PMIC 进入错误状态比如过压、欠压后寄存器可能锁存或者行为异常。此时仅靠 I2C 写恢复不一定有效最好的办法是用 MCU 控制 PMIC 的复位引脚做一次硬件复位再重新配置。所以设计时不要把复位引脚省掉关键时刻能救命。5.3 PCB 布局建议电源芯片周围的布局真得花心思同样一颗 PCA9422布局不同实测数据能差出一截。具体注意几点输入电容和输出电容必须贴近对应引脚不要通过过孔绕远路电感的反馈采样点要靠近负载端不是电感的输出引脚模拟 LDO 输出和数字电源轨走线保持距离避免耦合噪声PMIC 底部和 MCU 之间要有完整地平面至少不要被信号线切断热敏引脚或者焊盘要开阵列过孔辅助散热尤其多路 DC-DC 同时大电流输出时。经验是电源部分先布局把关键环路画好再让信号线去绕。如果先放 MCU、外设再随便找个地方塞 PMIC后期纹波和 EMI 问题会让你很头疼。6. 多项目扩展这套方案还能怎么用这套“PMIC MCU”架构的适用面不窄扩展思路基本一致把电源策略集中到 MCU 里通过 I2C 和 GPIO 统一调度。稍微花点心思就能在原有方案基础上扩展出更多玩法多负载多策略同一块板子上MCU 跑低功耗任务时降核电压切到高性能模式时升核电压。这个只用改寄存器值流程复用上文阶梯调压的逻辑故障记录利用 PIC18F66K40 的 Data EEPROM 记录 PMIC 错误状态后续分析设备失效原因非常有用看门狗联动PIC 内置看门狗如果超时可以主动把 PMIC 复位这样异常状态能自动恢复提升无人值守设备的稳定性电池电量管理PCA9422 支持监测电源轨电压/电流的话可以结合 MCU 的 ADC 采集电池数据做简单的电量估算。我做过的某传感器项目中这套组合从原型到量产只动过一次外围参数——把某路 LDO 输出电容从 10uF 加到 22uF用来压低模拟前端噪声。其它电源策略调整全部通过固件版本控制完成这也是这个组合最让人省心的地方。如果你正准备做便携设备、电池供电检测设备或者想把手头多个分立电源整合成单芯片方案PCA9422 加 PIC18F66K40 是一个值得实际验证的选择。硬件如果严格按照手册推荐值设计固件从一开始就带上血校验和阶梯调压你会少走很多弯路。最后再提醒一次拿到芯片后第一件事不是画原理图而是把数据手册里的寄存器默认值全部读一遍搞清楚尤其是各通道默认使能状态。这个动作能帮你提前发现一半以上的启动问题。
返回列表