
做嵌入式设备这些年我有个改不掉的毛病拿到一块新板子先不看主控性能能跑多复杂的算法先看电源树怎么画的。去年做一个智能家居网关的时候主控选了一颗自带以太网MAC和PHY的经典单片机PIC18F97J60需求上有锂电池充电、USB供电切换、多路电压输出、按顺序上下电、还要能在休眠时用网络报文唤醒。一开始想着用分立的DC-DC加LDO堆一版结果发现逻辑越堆越复杂后来换成了带I2C可编程接口的电源管理芯片PCA9422整套系统才真正理顺。这篇文章就把我从选型、画板、写驱动到实测踩坑的全过程记录下来。如果你正在做带以太网的低功耗联网设备比如智能家居中控、工业传感器网关、小型协议转换器又担心电源方案翻车这篇文章应该能帮你少走不少弯路。1. 选型逻辑为什么用 PCA9422 和 PIC18F97J60 组合而不是分立电源1.1 我最初为什么想用分立方案以前做简单板子一颗LDO或者两颗DC-DC就能解决问题电源树一眼看穿。但这个网关不一样它要接12V/5V适配器要接锂电池要输出3.3V给主控和以太网部分还要有一路给传感器和无线模块另外需要电池充电管理。分立方案大概长这样一颗DC-DC把输入降压到5V一颗LDO把5V降到3.3V给主控另一颗LDO给传感器供电独立的锂电池充电芯片一个复位监控芯片负责上电时序几个分压电阻和MOS管做电源路径切换这一套下来BOM表多出十几个料号layout面积也吃紧。更麻烦的是上电时序。PIC18F97J60虽然是一颗8位机但它内部集成了以太网PHY对电源稳定性和复位时序有要求。如果传感器先上电I2C总线上可能有关联器件提前跑起来主控还没起来总线状态就乱了。拿RC延时去卡时序改一次板调一次实在不是聪明的办法。1.2 PCA9422 在系统里扮演什么角色PCA9422这种带I2C的电源管理芯片PMIC和普通DCDC最大的区别是它本身就是一个可以编程的“电源外设”。输出几路电压、电压值是多少、上电顺序怎么排、每路限流多大、有没有Power Good信号这些都可以通过寄存器配置。MCU运行起来之后甚至能动态改电压、读回芯片温度和输入输出状态。这就把电源从“硬件一次性定型”变成了“软件可维护”。我调试时不必换电阻换电感来调电压直接写寄存器就行。系统要低功耗待机时主控可以通过I2C把一路不用LDO关掉把DCDC切到PFM模式下次要唤醒时再写寄存器打开整套逻辑非常顺。具体到这颗芯片它的资源对这类中等规模MCU系统来说够用多路降压变换器加一路LDO、电池充电路径管理、I2C编程、低功耗模式支持。用一颗PCA9422替代原来那五六个器件的活儿板面一下就清爽了。1.3 PIC18F97J60 为什么是这套组合里的合适主控PIC18F97J60 是一颗很有年头但很扎实的单芯片以太网MCU。它的特别之处在于集成了10M以太网MAC和PHY外部只需要一颗网络变压器加RJ45座就能把设备接上网。对智能家居网关、工业数据采集器这种不需要高带宽、但需要稳定联网的场景来说10M以太网完全够用而且单芯片方案省掉了“MCU加独立以太网控制器”两颗芯片的麻烦。不过这颗芯片也有它娇气的地方。以太网PHY的模拟前端在工作时有瞬态电流网络变压器中心抽头要稳定供电整个芯片对3.3V电源的质量比较敏感。如果电源纹波大、动态响应慢可能会出现网络时断时续、芯片复位之类的诡异问题。这也是我后来把电源方案从“随便一颗LDO”升级成PMIC完整管理的重要原因。下面这个表是我当时对自己做个方案对比的记录对比维度分立电源方案PCA9422 PMIC方案电源相关器件数量6-8个1颗PMIC加少量外围上电时序调整方式改RC或改外部复位芯片I2C寄存器配置电压调节方式换反馈电阻软件动态配置电池充电与路径管理另加充电芯片内置低功耗切换能力需额外MOS和逻辑寄存器直接控制输出开关故障诊断能力基本没有可读回状态寄存器结论很明显分立方案适合电压轨少、时序要求低、出货量很大且方案已经完全成熟的场景。而对这种带以太网、带电池、需要低功耗管理的设备PMIC方案的整体调试成本更低交付节奏也更容易控制。2. PCA9422 核心特性拆解这颗PMIC到底能做什么2.1 多路输出的内部结构PCA9422 内部集成了多路电源输出不同的型号配置略有差异。我用的这颗配置是两路Buck加一路LDO。三路输出各司其职Buck1主输出给PIC18F97J60的3.3V主供电Buck2给外设比如温湿度传感器、LCD背光或者无线模块LDO给对噪声敏感的模拟部分比如以太网PHY模拟供电的辅助路径、ADC参考电压等这种分路设计对嵌入式系统很友好。以前一颗LDO给所有负载供电传感器启动时的浪涌会拉低主控电压摄像头或者电机一转主控跟着复位这种问题我踩过好几次。分开以后各路输出有独立的反馈环路和限流保护相互之间的干扰小得多。2.2 可编程上电时序的重要性可编程上电时序是我选这颗芯片的最大原因。类似FPGA和复杂SoC需要严格的多电压轨时序PIC18F97J60这种MCU本来没有苛刻到那个程度但整个板子有外设、有以太网变压器中心抽头电源轨谁先谁后直接影响系统起来之后是否稳定。我用PCA9422的时序配置做了这么一组顺序适配器插入后先稳定输入路径然后Buck1上电主控开始工作主控起来之后再通过I2C打开Buck2给传感器上电。这样传感器和无线模块就不会在主控初始化前去抢总线、留错误状态。配置方式是设置芯片内部的时序寄存器把每路输出的启动延时拉开几十毫秒。板子调试阶段试了三组参数最后定下启动延时顺序完全不用动PCB。这里需要多说一句有些朋友第一次接触可编程电源芯片容易有个误区觉得“反正能编程先全上电再说”。但如果外设里有个EEPROM或者实时时钟芯片先于主控上电它可能会以默认状态抓取I2C总线。主控起来之后发现总线忙查了半天居然是上电顺序的问题。所以时序这步别省。2.3 电池充电与路径管理做锂电池供电的设备充电管理躲不开。PCA9422内置了充电管理通路对单节锂电池的充电流程进行了整合。我在参考设计里配置了一组常规的充电参数预充电电流、恒流充电电流、恒压截止电压、充电完成阈值。比充电本身更关键的是路径管理。以前用过独立的充电芯片加负载开关适配器插入时系统到底是“适配器直接供电加同时充电”还是“电池供电”需要额外逻辑切换。PCA9422内部路径管理会优先让适配器给系统供电富余电流再给电池充电。这个逻辑对延长电池循环寿命很重要因为系统大动态负载时不会反复拉扯电池。拔掉适配器时又能无缝切换到电池供电不会让MCU瞬间掉电。我在样机上验证过热插拔适配器主控全程没有复位。2.4 寄存器编程带来的调试优势PMIC的调试优势用一次实际经历最能说明。有一次我把Buck2的输出电压设置写错了整整0.3V外设模块死活不工作。按以前分立方案的做法得拆板子换反馈电阻然后重新测试。用PCA9422只花了不到两分钟I2C命令改写目标电压寄存器重新上电问题解决。调试效率不在一个量级。当然寄存器方式也有它的麻烦所在后面我会单独列一节说比如上电复位期间的I2C时序问题比如电压切换时负载会瞬间掉电的问题。3. PIC18F97J60 的功耗画像以及它对电源设计的具体要求3.1 以太网PHY才是电源设计的隐形难点很多朋友看PIC18F97J60是一颗8位MCU直觉上认为功耗不大随便一个LDO就能带。这个直觉对“MCU核心”部分成立但对“以太网PHY”部分不成立。以太网PHY在发送数据时模拟前端需要较大的瞬态电流尤其是发送长报文、背靠背报文时电流变化非常快。如果供电链路动态响应差电压会被拉出明显跌落。数据手册上允许3.3V有纹波范围但PHY对电压跌落很敏感电压一旦掉了轻则丢包重试重则PHY状态机错乱表现为网络断断续续看起来像协议栈问题实际是供电问题这种问题最隐蔽。我调试的时候用一个电流探头同时抓PHY发送时3.3V的电压波形能看到发送突发时电压有几百毫伏的跌落。换成分立LDO甚至会更严重所以这活还是得交给动态响应好的DCDC来做。3.2 电源域怎么分才合理我在原理图上把电源分成了三个域每个域都有各自的滤波和小电压分割电源域负载供电来源说明数字主域PIC18F97J60核心和IOBuck1输出的3.3V主要功耗来源模拟/PHY域以太网PHY模拟部分、网络变压器中心抽头LDO输出或者3.3V加磁珠/LC滤波对噪声和动态响应最敏感外设域传感器、无线模块、指示灯Buck2输出3.3V或按需设置可独立关断之所以单独区分PHY域是因为以太网变压器中心抽头的供电质量直接决定信号质量和雷击浪涌的耐受能力。PHY模拟前端对噪声也比较敏感如果和高速开关的DCDC输出直接混在一起信号眼图很难看。我用了一颗LDO专门给这部分供电噪声隔离效果明显。3.3 平均功耗预算表做电池供电功耗预估必须落在数字上。我整理了一张当时用的功耗估算表给新项目一个参考起点。具体数值会因为代码行为和外设不同而变化别直接抄但思路可以参考系统状态以太网状态外设状态估算电流满速运行10M持续发包传感器周期工作80-120mA空闲运行链路连接但不收发传感器关断25-40mA浅睡眠PHY掉电保留RAM全关5-15mA深度休眠PHY完全掉电全关1mA上下这里需要特别指出浅睡眠和深度休眠的区别不只是电流大小还牵扯唤醒方式。浅睡眠我要保留以太网链路PHY得继续供电PIC的以太网模块才能检测唤醒帧所以不能全断电。深度休眠则完全断开靠外部GPIO或者定时器唤醒。具体怎么做我在软件状态机那一节详细说。3.4 为什么不能只靠一颗LDO从功耗预算也能看出来浅睡眠时电流只有十几毫安运行时会冲到一百毫安以上动态范围接近十倍。如果只用LDO在适配器12V输入降到3.3V时压差太大白白烧掉好几瓦功率发热非常可观。用DCDC效率能到90%以上同时动态响应更好这是LDO做不到的。另外PIC18F97J60虽然整体功耗不算高但IO翻转和以太网发送时di/dt很大LDO的低频输出阻抗通常比DCDC高电压跌落更明显。所以我在主供电路径上用了PCA9422的Buck1LDO只处理噪声敏感的模拟域。这一点在选择器件时就算清楚了。4. 硬件连接与参考设计要点4.1 输入侧设计USB适配器加锂电池输入侧我留了两个端口一个USB 5V适配器口一个单节锂电池接口。适配器5V经输入限流保护进入PCA9422的输入引脚电池直接接到电池引脚。两个输入之间由PMIC内部的路径管理逻辑完成切换外部不需要额外MOS管。输入侧有三个容易忽略的点输入ESD保护和浪涌器件要靠近接口放避免浪涌电流进入PMIC。以太网设备常做雷击浪涌测试除了网络口电源口也要过浪涌所以压敏电阻/TVS选型要留够余量。电池输入端的反向保护。锂电池在安装瞬间可能出现反接PMIC本身有一些防护但稳妥的做法是在电池线束端加一颗P沟道MOS管做防反接成本不高能避免整板烧毁。输入电容按手册要求放不能省。PMIC在适配器插入瞬间会有浪涌电流输入电容太小会导致输入电压跌落充电逻辑误判。4.2 PCA9422 与 PIC18F97J60 的接口设计PCA9422和MCU之间用的接口很简单总共就是I2C两条线加一根中断线。我在原理图上安排了如下连接I2C SCL、SDA接到PIC18F97J60的硬件I2C外设引脚两个脚都加上拉电阻到3.3VPCA9422的中断输出引脚接到PIC的外部中断输入脚用来上报输入电源切换、充电完成、欠压等事件使能引脚用PIC的一个普通GPIO控制用于完全关断PMIC实现真正的“硬关机”状态这条中断线的价值非常大。比如适配器拔掉、系统切换到电池供电PMIC会主动拉一次中断MCU收到后可以马上调整外设状态把不必要的负载关掉省电同时避免电池被瞬间拉垮。如果只用轮询寄存器的方式响应会有延迟还有可能错过关键状态。另外我把I2C总线引出端子做了测试点这件事在量产以后帮我大忙。返修板上电没反应时直接飞线挂一个逻辑分析仪到测试点看PMIC有没有正确响应I2C命令马上就能定位是主控没跑起来还是PMIC配置没生效。当初随手加的两个测试点省了不知道多少查板时间。4.3 输出电压采样与远端补偿PCA9422的DCDC反馈补偿引脚要接到真正需要稳定电压的地方。这句话听起来理所当然但非常多人做错。我见过不少设计反馈线直接就近接在输出电容上结果主控那一端的电压已经被PCB走线电阻吃掉了一部分主控供电电压在满载时明显偏低。正确做法是把反馈采样点飞线到主控电源引脚旁边焊接形成远端采样让PMIC直接把主控脚上的电压稳到目标值。对于PIC18F97J60这种功耗不大但瞬态要求高的芯片远端采样能显著改善电压精度。我在PCB上专门从PMIC反馈引脚拉了一根细走线到主控电源引脚附近实测满载时电压比就近采样提高了大约0.1V主控的复位余量明显好了。4.4 PCB布局和关键器件选型布局上PMIC下面要铺完整的地平面散热焊盘过孔要足够不然满载时芯片温度会偏高。电感我选了屏蔽式功率电感饱和电流按最大负载电流的1.5倍以上选DCR越低越好。这个DCR参数很多人不看其实它直接决定满载效率和温升DCR偏高0.1欧姆0.5A负载时就能多烧掉25mW对电池设备来说不可忽略。输入输出电容按手册推荐值尽量选X5R/X7R的MLCC温度特性比Y5V好得多。网络变压器中心抽头的滤波电容尽量靠近RJ45座走线要短粗。以太网差分线保持等长、差分阻抗100欧姆这些老生常谈但真的影响稳定。5. 软件层从休眠到唤醒的完整电源状态机5.1 电源管理状态机设计硬件只是骨架电源管理真正的灵魂在软件状态机。我设计了一个四状态模型每个状态的电源配置如下状态PCA9422 配置MCU状态唤醒源RUN所有输出正常全速运行-LIGHT_SLEEPBuck1开启、Buck2关闭低功耗等待I2C中断、GPIODEEP_SLEEPBuck1开启、Buck2关闭、DCDC切PFM深度休眠GPIO、实时时钟定时中断OFFPMIC关断完全断电外部GPIO唤醒或重新上电这里有个细节DEEP_SLEEP状态下我没有把Buck1也关掉。因为PIC18F97J60一旦完全断电RAM里的配置就没了唤醒后要从头初始化网络协议栈这需要几秒钟对有些需要快速响应的应用不可接受。保留Buck1供电、只让MCU进入深度休眠网络栈还留在RAM里唤醒后能秒回在线状态。代价是休眠电流稍高但换来的是响应速度这笔账划算。5.2 使用PCA9422寄存器切电源状态切换到不同状态的核心操作其实就是通过I2C写PCA9422的几个关键寄存器。我在固件里写了一个电源管理模块大致如下// 伪代码切换电源管理模式 void pwr_set_mode(enum pwr_mode mode) { switch (mode) { case MODE_RUN: pca9422_write_reg(REG_BUCK2_CTL, 0x01); // 打开Buck2 pca9422_write_reg(REG_DCDC_MODE, 0x00); // 强制PWM模式 break; case MODE_LIGHT_SLEEP: pca9422_write_reg(REG_BUCK2_CTL, 0x00); // 关Buck2 pca9422_write_reg(REG_DCDC_MODE, 0x00); break; case MODE_DEEP_SLEEP: pca9422_write_reg(REG_BUCK2_CTL, 0x00); pca9422_write_reg(REG_DCDC_MODE, 0x01); // 切PFM省电 break; case MODE_OFF: pca9422_write_reg(REG_GLOBAL_EN, 0x00); // 关输出 break; } }写这个函数的时候要注意一个顺序问题应该先关闭不用的外设电源再把DCDC切成PFM。如果顺序反了先切PFM再关外设外设关断瞬间引起的负载阶跃会让PFM模式的DCDC反应迟钝电压会有个明显的过冲这个瞬间可能误触发主控的欠压复位。我一开始就是顺序写反跳了几次机后来调整顺序就再也没有出现过。5.3 以太网唤醒链路的处理这个网关有一个很实用的功能远程唤醒。局域网内发一个魔术包设备就能从浅睡眠状态醒过来马上处理请求。实现思路是在LIGHT_SLEEP状态下以太网PHY还在工作PIC18F97J60的以太网模块检测到魔术包后会触发一个中断。MCU从I2C中断和以太网中断中选择合适的唤醒源唤醒后先恢复PCA9422的Buck2输出再继续跑协议栈。整个过程在几十毫秒内完成。调试这个功能时遇到一个问题魔术包唤醒后以太网链路经常要等几秒才通。后来发现是唤醒后以太网PHY没有重新协商完成MCU就开始发包。解决办法是在唤醒流程里加一个等待链路状态寄存器变为连接完成的循环确认链路恢复再发响应。这一点对用自带PHY的MCU做唤醒功能的朋友很有参考价值。5.4 软件抗干扰对I2C写状态的确认PMIC毕竟是通过I2C配置的如果MCU在写寄存器过程中被高优先级中断打断或者I2C总线上有毛刺寄存器可能写入失败。处理办法是每次写关键寄存器后都读回校验不匹配就重试三次。我还在关键操作之间加了小延时避免连续快速写寄存器时PMIC内部状态机来不及处理。这个“写后读”的习惯让我在一次样机调试中直接发现了问题有个批次芯片的I2C时序余量偏小快速写经常失败读回校验能及时报警并重试才没有造成“看起来电源没动静”的难查故障。6. 实测数据与调试中踩过的坑6.1 实测电流记录样机跑起来之后我用一台支持数据记录的功率计抓了一段时间的电流曲线几个关键状态的数据如下状态实测电流说明空闲运行、以太网连着38mA比估算值高一点因为IO有LED在闪满速发包105mA发送突发时电流尖峰明显浅睡眠、保留PHY供电12mA协议栈保留唤醒很快深度休眠、DCDC切PFM0.9mA只留RTC和唤醒逻辑实测数字和估算表差距不大说明设计余量是合理的。这里我想多说一句测电流时不能只看平均值要看峰值。我抓到的发送瞬间电流尖峰有接近150mA如果只按平均105mA选型电感的饱和电流就选小了。峰值和平均都要覆盖。6.2 坑一I2C总线被欠压事件干扰调试中遇到一个很诡异的现象适配器拔掉再插上PMIC偶尔会失去响应I2C读回全是错误主控也出现一次复位。查了很久最后用示波器同时看输入电压、PMIC电源输出和I2C SDA线发现拔掉适配器的瞬间输入电压跌落触发了PMIC的欠压保护保护动作时内部逻辑重新初始化而这时候主控还在试图写寄存器写入到一半被打断寄存器处于半配置状态。解决方法是两层硬件上给输入侧加大电容让适配器拔掉后PMIC还能保持几毫秒的正常工作不让欠压保护这么容易触发软件上主控在电源切换中断到来时先停止访问PMIC等一小段稳定时间再重新初始化寄存器。两个措施同时用上以后这个问题再没有复现过。6.3 坑二BUCK电感啸叫另一个问题是电感啸叫。主控进入浅睡眠负载电流掉到十几毫安DCDC进入PFM模式然后电感开始发出高频吱吱声。这个声音很轻但用户在安静的卧室里能听见这肯定不能接受。啸叫的根源是PFM模式下开关频率落在人耳可听范围内加上电感选型偏激进机械振动传到了PCB上。解决办法有三个方向给电感本体点硅胶固定消除机械传导把PFM模式的最低频率调高避开听觉敏感区或者在浅睡眠保留轻微伪负载让DCDC不进入太深的突发模式。我最后用了“点胶固定加调节最低频率”的组合方案实测安静环境下听不到任何声响。这个问题也提醒我PFM模式不是所有场景都适合用省电和省心之间要权衡。6.4 坑三网络变压器中心抽头供电不规范第三次踩坑和网络通信有关。板子做完以后局域网通信测试正常但一放到现场通过长网线连接偶尔会出现链路断开又自动恢复抓包也看不出应用层报错。后来把示波器探头接到网络变压器中心抽头和RJ45座之间发现电压纹波比在实验室里测的时候大得多现场环境干扰进来导致PHY信号质量劣化。原因是我最初把中心抽头直接接在3.3V主电源上没做充分的滤波隔离。修改方法是中心抽头单独走线加一个磁珠和一个较大的电容组成滤波网络再把PHY模拟域的供电从LDO引出。改版后长网线实测多天没有出现过链路抖动。这个坑不算高级但很典型提醒了我“以太网PHY的电源不是接个3.3V就完事那么简单”。7. 软件之外量产前还要补的功课7.1 参考设计检查清单我整理了一份用于新项目评审的电源检查清单关键项包括输入侧是否有足够容量的储能电容欠压保护是否会误动作每路输出是否有完整的反馈采样点I2C上拉电阻是否连接正确PMIC中断脚是否接到MCU外部中断电感饱和电流是否覆盖最大负载峰值的1.5倍以上反馈电容的放置位置是否靠近PMIC芯片网络变压器中心抽头是否经过隔离滤波电池防反接是否保障到位PCB散热过孔是否足够测试点是否预留比如PMIC的I2C、各路输出电压测试点每次审板都过一遍这个清单能省下大量改版返工的时间。7.2 生产测试项建议小批量试产的时候我加了三项与电源相关的测试上电瞬间监控各路输出是否在指标范围内自动判定时序是否合格I2C回读PMIC状态寄存器确认每个模块都能对话电池充放电循环测试检查充电电流、截止电压、切换逻辑这些测试不需要很昂贵的设备一个可编程电源加一个多路电压记录仪就能搭起来。它们虽然增加了生产线时间但能把电源相关的早期失效拦在出厂之前算下来性价比很高。7.3 电池老化与低温考虑锂电池设备的另一项功课是老化。新电池和库存半年的电池内阻差异很大直接影响系统在峰值电流时的输入电压。我测过同一批电池新旧电池在150mA峰值负载下端电压能差约0.2V这对电池路径管理逻辑有影响。所以量产前要确认PMIC的欠压阈值设置留有余量不能用新鲜电池的参数直接定死。低温环境也要关注。电池在零度以下放电能力显著下降充电电流必须限制否则析锂风险很高。PCA9422的充电参数我做了温度相关限制温度过低时报错停止充电保护电池。这一点对做室外网关产品的朋友特别重要。最后再说几句整套系统跑通以后我对电源管理的理解有了一个变化电源管理不是硬件工程师画完原理图就结束的事情它应该被当成整个系统里的一个软件可控的外设来设计。PCA9422这类PMIC带来的最大价值不是多大的电流能力或者多高的效率而是让电源变成了一条可以被软件读写、被系统动态调整的链路和PIC18F97J60配合之后整个设备的使用体验变得非常完整。如果让我给刚开始做类似项目的同行一个最实在的建议我会说务必把PMIC的I2C总线接出测试点同时在固件里养成写后读校验的习惯。前一个问题——接口引出能让你在量产返修时一眼定位电源状态后一个问题——写后读校验能让你躲过很多寄存器写入失败的暗坑。电源管理这东西看起来是硬件的活最后拼的都是软硬件一起设计的那点细心。