ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

eFuse+MCU实现嵌入式电源路径保护与故障诊断

eFuse+MCU实现嵌入式电源路径保护与故障诊断 我一直觉得嵌入式系统里最容易被人忽略、但最值得多花心思的就是电源这一路。去年我在做一套工业振动监测节点前级从端子排进来的是24V结果现场接线工人把另一路负载的浪涌引了进来板子回来的时候前级DC-DC已经冒了烟一颗保险丝拦不住瞬时能量切断之后也没告诉我它到底经历了什么。从那以后凡是我经手的板子只要带工业接口或者热插拔场景我都会认真考虑“电源路径保护”这件事而不只是放个保险丝了事。本文想聊的就是我最近一轮设计里用到的组合TI的电子保险丝 TPS259483AYWPR配合 Microchip 的16位MCU PIC24FV32KA304。一个管硬件级的快速切断与限流一个管整个电源路径的时序、监测、故障记录和上报。这套方案解决的是嵌入式和工业应用中最容易踩的几个坑浪涌冲击、过流短路、热插拔瞬间大电流以及故障发生后没法远程定位的问题。如果你是做传感器节点、PLC扩展模块、电机驱动板或者任何带“前面板供电”的设备这篇文章应该能给你一条可以直接落地的思路。1. 为什么嵌入式系统需要“电源路径保护”而不是简单保险丝1.1 这四种故障传统保险丝处理不了很多同事喜欢在电源入口放一颗慢断保险丝觉得“反正电流超标了它会断”。这话没错但它只解决了一种情况持续过流。现实中工业现场的电源故障远不止这一种。第一种是浪涌电压。24V系统上感性负载断开瞬间会产生几十伏的尖峰如果这颗尖峰直接灌进DC-DC输入端MOS管很容易击穿。保险丝对电压尖峰完全无感它只看电流是否超了。第二种是短路。负载侧一旦短路故障电流上升速度是微秒级的在短路初期保险丝熔断需要的时间取决于I²t大多数慢断保险丝根本来不及隔离反而让前端电源被拉垮整条总线上的设备都遭殃。第三种是热插拔。板卡往背板里插的那一瞬间输入端大容量电容要充电瞬间浪涌电流可能高达几十安培这时候保险丝可能没断但连接器和电源轨上的压降已经把逻辑电路打复位了。第四种是“软过流”电流只超了20%持续几百毫秒能量不够熔断但足以让DC-DC过热。这四种情况传统保险丝要么完全无能为力要么动作太慢要么动作之后就永久失效、必须人工更换。在工业现场人工更换保险丝的成本往往比保险丝本身贵几十倍。1.2 eFuse 与传统保护方案的对比电子保险丝eFuse本质上是把高边功率开关管、电流检测、限流环、过压检测、过温检测全部集成到一个器件里。它不是一个“会断的导线”而是一个“每秒检测几百万次、能主动切断或限制电流的受控开关”。方案响应速度恢复方式是否可编程能否提供状态信号成本量级玻璃管/贴片保险丝毫秒级不可自动恢复需人工更换否否最低自恢复保险丝PPTC毫秒级自动恢复但特性会漂移否否低分立MOSFET 限流电路微秒级可软件恢复需自行设计可自行设计中高且调试难度大eFuse微秒级自动或软件控制恢复是是PG、FAULT中每次有人问我为什么不用PPTC我都说PPTC适合“小电流、不频繁故障、能接受恢复时间慢”的场景比如USB口过流保护。但工业24V电源路径上动不动就是几个安培的持续电流PPTC在高温环境下动作阈值会明显漂移而且它没有“主动切断”能力只能靠发热。而分立MOSFET方案虽然灵活但限流环、过压比较器、软启动这些电路自己做下来PCB面积和调试成本早就超过了直接买一颗eFuse。1.3 eFuse 的本质一个带大脑的开关我自己理解eFuse的方式是它像一个训练有素的保安。保安的职责不是“楼塌了再报警”而是“看到有人拿着可疑物品靠近就提前拦住”。传统保险丝更像一个消防喷淋头——温度到了才爆爆完整个房间都淹了还关不上。TPS259483AYWPR 这类器件的内部高边开关管一直在做三件事测量流过自身的电流、检测输入和输出电压的关系、检测结温。一旦任一指标越界它可以在几微秒内把开关管关断或者切到限流模式同时拉低FAULT/PG信号通知外部。这就是为什么我在设计里坚持把“保护”这件事交给硬件器件而不是靠MCU检测——后文我会专门解释原因。2. TPS259483AYWPR的选型逻辑与关键参数配置2.1 我会在什么项目里选这颗eFuse先说结论如果你的项目输入是常见的12V/24V工业电源需要保护的负载电流在几百毫安到几安培这个区间而且对故障可诊断性有要求TPS259483AYWPR 这类带状态输出的eFuse就非常合适。我这次设计的目标是整个节点的供电入口输入额定24V负载最大约2A要求过流时能在百微秒级切断同时把“是否发生过故障”这个信息留给MCU。选它而不是比它便宜的入门级eFuse核心原因有三个一是它的可配置项比较多UVLO、OVLO、限流阈值都能通过外部电阻独立设定二是它提供了电源正常指示信号PG我可以用这个信号来驱动后续的上下电时序而不是靠ADC反复轮询三是它的封装尺寸和热阻能够满足25W级瞬态散热需求在工业温度范围下不会因为热关断过早误动作。2.2 关键配置项与电阻选型思路eFuse的配置看起来只是“接几个电阻”但每个电阻背后都对应一个保护策略值得逐个说清楚。电流限制阈值ILIM是设置短路和过载保护边界用的。我这次根据负载需求先定下2A的保护阈值正常工作电流约1.2A留了大约60%的余量避免瞬时负载波动触发误保护。具体电阻值不要凭感觉按数据手册里的选型表挑对应阻值不同型号eFuse的ILIM引脚内参考电流不同接法也不完全一样。欠压/过压保护阈值UVLO/OVLO是通过输入端的电阻分压网络设定的。这一步决定了“什么电压范围算合格电源”。我这里设的是18V到30V。低于18V说明电源掉电或缺相高于30V说明有浪涌或接线错误。这个窗口的电阻分压计算很简单但注意要选1%精度电阻并且要考虑分压电阻自身的功耗——24V输入下分压链路电流控制在100µA以内比较合理。软启动时间通过dV/dT引脚上的对地电容设定。这个电容决定输出端电压爬升斜率直接关系到热插拔时输入电容的充电浪涌电流。我按手册推荐值起步然后根据实测调整电容越小启动越快但对输入浪涌的限制越差电容越大启动越柔和但系统上电时间会被拖长。在需要与主控严格握手的项目里我通常会故意把启动时间调慢给MCU留足够时间去采样。2.3 最小系统电路与信号连接一颗eFuse最精简的接法输入接电源输出接负载配置脚接电阻电容EN脚如果不需要控制就直接上拉。但在我的系统里不是这么做的我需要它和PIC24FV32KA304联动。我列的这套信号映射是实际用过、验证过的方案TPS259483 信号作用连接到PIC24FV32KA304说明EN使能控制GPIO输出MCU可主动关闭电源路径让系统进入安全状态PG电源正常指示GPIO输入带中断高电平表示输出建立成功可触发后续启动流程FAULT/ILIM相关状态故障指示GPIO输入或ADC用于记录故障发生时间和类型dV/dT脚软启动配置对地接电容不直接和MCU相连由硬件决定启动斜率UVLO/OVLO分压点输入电压监测额外用ADC采样输入电压便于软件记录电压跌落/过压事件我特别想提醒一点PG信号的开漏输出必须要接上拉电阻而且上拉电阻应该接到eFuse的输入侧而不是输出侧。原因很简单一旦输出短路输出电压会跌到很低PG如果靠输出侧供电闸门在关键时刻反而失电处理器就收不到故障信号了。这个细节我一开始做反了调试时吃过大亏后面第6章会讲。2.4 为什么不能只靠MCU实现保护这是我被问得最多的问题“既然PIC24FV32KA304有ADC有比较器为什么还要多买一颗eFuse”因为MCU的检测链路再快也要经过“采样保持、转换、中断响应、GPIO操作”这几步少说要几微秒到几十微秒。而一个快速的短路事件在十几伏电压下产生的故障电流上升速度可能在几微秒内就把开关管推入危险区。eFuse是纯硬件闭环限流误差小、响应速度快不需要跑代码。MCU在这里的角色是“决策和记录”不是“执行保护”。这个分工是整套设计最重要的一条原则硬件保护不能依赖软件软件的职责只是让保护变得更加可观测、可恢复、可管理。3. PIC24FV32KA304的角色定位电源系统的“值班员”3.1 用一颗“闲着的MCU”做电源监控光有eFuse还不够因为它“做了保护却不会说话”。传统eFuse切断后故障原因到底是过压、过流还是过温除非你自己用示波器守在旁边盯着否则根本不知道。这也是我引入一颗独立MCU做电源管理的原因。我选的PIC24FV32KA304是Microchip的PIC24F系列工作电压宽、外设丰富尤其适合做低功耗的监控辅助控制器。它在这套方案里不承担业务逻辑只负责四件事周期采样电源路径上的电压和电流信息控制eFuse的EN引脚下电或复位接收PG和故障信号并据此转移系统状态把故障记录写入Flash并通过串口上报。为什么不用系统里的主控MCU顺带做这件事因为主控通常跑着复杂的业务程序一旦主控死机或被调试器暂停电源管理就跟着瘫了。让一颗独立的MCU管理电源等于把“供电安全”和“业务逻辑”隔离开来这是工业设备上非常合理的故障域隔离思路。3.2 MCU供电策略保护前取电还是保护后取电这是我在原理图阶段纠结最久的一个点。MCU的供电到底是从eFuse的输出侧取还是从输入侧取如果从输出侧取电结构简单MCU天然跟着系统上下电但致命问题是一旦eFuse执行保护切断输出MCU瞬间掉电根本无法记录故障原因。那要这样一颗管理芯片还有什么意义如果从输入侧取电需要考虑输入电压可能是24V的高压需要加一颗小功率LDO把电压降到3.3V。代价是LDO的静态功耗会一直存在待机状态下会多浪费一点点电流但这换来的是eFuse切断之后MCU依然活着可以保存故障日志、点亮告警灯、把故障类型发给上位机。我最终选择的是输入侧取电用一个静态功耗很低的宽压LDO给PIC24FV32KA304供电。实际做下来整套系统休眠功耗在几十微安级别工业设备完全能接受。电源路径保护的“可诊断性”价值远比那一点静态电流值钱。3.3 外设分配与通信方案一颗监控MCU最怕的就是“什么都想做引脚分配一团乱”。我给PIC24FV32KA304做的外设分配如下PIC24 外设连接对象用途ADC通道0输入电压采样点经分压监测VIN是否在允许窗口内ADC通道1输出电压采样点经分压监测eFuse输出是否建立ADC通道2电流检测输出掌握负载电流趋势GPIO外部中断eFuse的PG/FAULT信号故障时快速唤醒MCUGPIO普通EN引脚控制电源路径通断UART调试口/上位机输出状态帧包含电压电流与故障码定时器内部心跳定时、上电延时、重试间隔这里有一个经验让PG信号接到MCU的外部中断引脚而不是靠ADC轮询。PG从低到高的跳变意味着“输出电源已经稳定”这时候再启动负载才有意义如果靠ADC轮询可能在启动瞬间误读输出电压尚未建立的中间值导致时序错乱。3.4 ADC采样与校准PIC24FV32KA304的ADC是12位的取决于具体配置直接采样24V肯定不行要用电阻分压把电压降到3.3V以内。这里有个小坑分压电阻选大了等效源阻抗高会影响ADC采样稳定性选小了静态功耗又上去了。我一般取两到三颗电阻串联总阻值100kΩ左右配合一个100nF采样电容采样结果就很稳定。软件上我会做一次简单的一阶滤波而不是直接拿单次转换结果做判断。下面这段伪代码展示的是我实际用到的滤波逻辑#define ADC_BUF_SIZE 8 uint16_t adc_samples[ADC_BUF_SIZE]; uint8_t sample_index 0; uint32_t adc_sum 0; uint16_t adc_filtered_read(void) { adc_sum - adc_samples[sample_index]; adc_samples[sample_index] read_adc_channel(CURRENT_CH); adc_sum adc_samples[sample_index]; sample_index (sample_index 1) % ADC_BUF_SIZE; return (uint16_t)(adc_sum / ADC_BUF_SIZE); }滤波的意义在于防止瞬时毛刺引起误判但代价是响应变慢。所以在设计状态机时我会把“电源故障判定”分成两类硬件故障由eFuse自己瞬时响应软件层面的趋势告警可以慢慢滤波。两条路径互不干扰这也是我强调“硬件保护不依赖软件”的另一层原因。4. 硬件电路搭建原理图与PCB的关键决策点4.1 整体电源架构先给一张文字版架构图方便大家对照。24V输入端子 ↓ 防反接二极管 TVS管 输入滤波电容 ↓ TPS259483AYWPReFuse配置ILIM/OVLO/UVLO/软启动 ↓ DC-DC降压模块输出5V ↓ 负载电路 输入侧另外分一路到宽压LDO3.3V ↓ PIC24FV32KA304 状态指示灯这个架构的关键决策是eFuse位于输入端子之后、DC-DC之前充当整条电源路径的“总闸”。DC-DC的输出短路、后级负载过流最终都会体现为eFuse输出侧电流上升所以它天然就是最后一道防线。TVS管放在eFuse之前负责吸收浪涌尖峰防反接二极管处理接线失误eFuse负责剩余所有需要主动干预的情况。4.2 eFuse前级的防反接与浪涌设计工业现场最容易出现的错误就是正负极接反。PIC24FV32KA304和TPS259483本身都不具备防反接能力所以必须在输入端串联一颗肖特基二极管或者使用P沟道MOSFET做理想二极管防反接。用二极管最简单压降零点几伏缺点是功耗大用理想二极管电路功耗低但复杂度高。我这次图省事用了肖特基二极管24V输入下压降损失可接受也算一种务实取舍。浪涌吸收方面输入正负极之间并联一颗TVS管选型依据是TVS的钳位电压要低于被保护器件的最高耐受电压同时高于正常输入电压上限。我通常让TVS的“截止电压”比系统最大工作电压高10%到20%避免正常工作时TVS漏电过大。4.3 PCB布局上这几个地方最容易翻车第一个是eFuse的散热焊盘。这类器件在小封装里集成了功率开关管热量主要靠PCB铜箔散发。我在布局时会给它底层铺铜并打阵列过孔把热量导到背面而不是只在器件下方留一个孤立焊盘。试验时手摸都能感觉到区别。第二个是输入电容和输出电容的摆放。输入电容要贴近eFuse的输入引脚和GND引脚输出电容贴近输出引脚。电容离得太远等效串联电感变大瞬态短路时eFuse内部的寄生振荡会更严重甚至导致过压损坏。第三个是ADC采样走线。分压电阻和采样电容必须靠近MCU的ADC引脚采样点要从负载端单独牵线不要跟功率地混在一起。我之前犯过一个错误把采样地和功率地共用一个过孔负载电流一大ADC读数跟着抖排查了整整一个下午。正确做法是采样地单点接到电源地。4.4 上下电时序和MCU供电细节硬件设计阶段就要把时序关系画清楚而不是等固件再去“发明”。我的时序是这样的输入电源插入后TVS和防反接就位宽压LDO立刻给MCU上电MCU启动后先跑初始化采样输入电压确认它在UVLO/OVLO窗口内随后MCU才拉高EN让eFuse开始软启动eFuse输出稳定后PG拉高MCU收到PG跳变再给后级DC-DC发使能信号。这套时序的价值在于后级DC-DC启动时输入侧已经是一个稳定电压不会出现“一上电就互相打架”的电流倒灌现象。尤其是那些没有输入缓启动的DC-DC模块直接从冷启动的eFuse输出取电时冲击电流很容易触发eFuse的限流保护。5. 固件状态机设计上下电时序、故障处理与可诊断性5.1 状态机定义电源管理固件本质上是一个有限状态机只是很多人习惯用if-else硬写最后状态多了就乱。我这次把状态定义写成了结构化的表迁到代码里就是清晰的一组状态。状态进入条件主要动作退出条件POWER_OFF上电复位或主动关机保持EN低电平只做电压监测输入电压在窗口内且收到开机指令STARTUP满足开机条件拉高EN等待PGPG有效后进入RUNRUNPG稳定周期采样电压电流运行看门狗故障触发进入对应处理FAULT_RETRY发生可恢复故障拉低EN等待冷却延时后重新拉高重试成功回RUN超次进入SHUTDOWNSHUTDOWN故障不可恢复或重试超限保持EN低记录故障码上报等待人工/远程恢复或下电状态机的定义要点是每个状态必须有明确的进入条件和退出条件不能有模棱两可的“可能”。我在FAULT_RETRY这个状态里特意加了延时比如发生过流后等待5秒再尝试恢复。这个延时防止了“故障情况还没消失就反复重试”的振荡。5.2 故障分类与自动恢复策略我把故障分成了三个等级。第一级是可恢复的软故障例如瞬时过载超过限流阈值、输入电压短暂跌落低于UVLO阈值处理策略是eFuse切断后等待一段时间自动重试重试次数通常设为3次。第二级是需上报但可以维持部分功能的故障比如输出电压异常MCU记录日志并通知主控但仍保持eFuse断开等待操作员介入。第三级是不可恢复故障比如反复过流、过温保护触发MCU直接锁死到SHUTDOWN状态此时即使你远程发来指令我也不会再拉高EN防止设备带病运行造成二次损坏。这套分级策略的核心思想是自动重试解决的是“瞬时干扰”锁死解决的是“持续故障”。工业现场这两类情况都有一刀切的做法都不合适。5.3 故障记录的保存与上报PIC24FV32KA304内部有Flash可以在线擦写。我设计了一个简单的故障日志结构体四个字节的时间戳一个字节的故障类型码两个字节的故障发生时的输入电压和电流采样值一个字节的CRC校验。每次记录前先擦除一个扇区写完再更新索引。上报方式用的是串口UART以文本帧形式输出方便直接用串口助手看。帧格式类似[EVT][12:03:45][OC][VIN23.8V][IOUT2.1A][RETRY1]。这个格式不花哨但排查问题时极其直观。我在调试现场从来不用在线仿真器追故障直接看最后一条日志就知道发生了什么。5.4 看门狗怎么配合给电源管理MCU配上独立看门狗之后要注意一个矛盾如果看门狗超时复位MCUMCU重新初始化时会重新拉高EN等于把eFuse重新打开。如果此刻外部故障仍然存在就会陷入“复位-再故障-再复位”的循环。我的处理方式是在Flash里保存一个复位原因标志。启动时如果发现上一次复位是由看门狗引起的并且故障寄存器里还有未清除的故障码就不进入STARTUP而是直接进入SHUTDOWN或FAULT_RETRY。这样即使MCU程序跑飞过电源路径也不会无脑重复上电。6. 实测调试中的坑与经验数据6.1 坑1限流阈值太紧一上电就“自锁”第一次运行整套系统时我设定的限流阈值是1.5A比正常负载电流高一点点结果每次都启动失败eFuse输出刚爬升就触发限流然后被切断。当时我第一个反应是负载有问题但单独给DC-DC供电又一切正常。后来才发现问题出在软启动和限流阈值的配合上。后级DC-DC的输入端有一堆输入电容eFuse启动时这些电容充电瞬时电流很容易超过1.5A。虽说软启动电容会限制电压爬升速率但如果负载电容比较大充电电流依然会触碰限流值。解决办法是把限流阈值提到2A同时增大软启动电容让电压爬得更缓。这个教训告诉我设置限流阈值时算的不是“稳态电流”而是“启动瞬间的浪涌电流”。6.2 坑2PG上拉选错了电源轨这个坑前面提过值得展开说。我最初把PG信号的上拉电阻接到了eFuse的输出侧想法很简单输出3.3VPG高电平正好匹配MCU的IO电平。结果做短路测试时发现一触发保护输出电压瞬间掉到0PG电平也跟着被拉到0MCU收到的是“故障伴随掉电”但根本区分不了是输出先掉电还是保护先触发。后来我把上拉改到输入侧经过LDO后的3.3VPG就变成了一个真正“独立于输出状态”的故障信号。短路发生时输出掉电但PG依然能从高到低给出干净的边沿MCU能立刻进入中断处理。这个改动之后故障判断一次就准了。6.3 坑3短路测试后MCU被异常复位在进行输出对地短路的破坏性测试时我发现一个问题模拟短路后PIC24FV32KA304居然自己复位了而它明明是通过输入侧LDO供电的理论上不该掉电。排查后发现罪魁祸首是地弹。短路瞬间大电流流过PCB的地回路在感性路径上产生了很高的地电位差。MCU的电源地或参考地瞬间被抬高导致供电轨相对地出现凹陷触发了单片机内部的欠压复位。解决方法是在MCU供电引脚旁边加了一个额外的高频退耦电容并且把MCU的模拟地引脚和数字地引脚分开走线在电源入口处单点汇合。改完再测同样的短路测试下MCU再也没复位过。6.4 实测波形与关键数据下面是这套方案在实验室条件下的几组关键数据给大家一个量级概念测试项目结果正常工作电流约1.2A 24V输入限流阈值设置值2A实测触发点约2.05A短路响应时间eFuse切断时间约几十微秒级软启动完成时间约12msdV/dT电容选定后热插拔输入浪涌被限制在2.2A以内无过冲故障自动恢复间隔5秒连续3次后进入锁死休眠功耗约40µA3.3V侧短路响应时间这一项用普通万用表根本测不出来我是用示波器看输出波形拍到的。从触发短路到输出跌到接近0大概就几十微秒这个速度是任何软件方案都达不到的也正是eFuse存在的意义。7. 这套电源保护架构还能怎样扩展7.1 多通道eFuse阵列如果系统有很多路独立供电比如一路给传感器、一路给MCU、一路给通信模块可以把这套方案扩展成多通道管理。PIC24FV32KA304的GPIO充足每个eFuse占用“一路EN 一路PG”就够。这样每路电源的上下电时序、故障重试策略都可以单独配置互不干扰。我在背板供电的板卡项目里用过这个思路效果比单一总闸好得多一路故障不会拉垮整块板。7.2 从“保护”走向“遥测”eFuse提供的是保护但电流数据本身很有价值。把PIC24FV32KA304的ADC采样到的输入电压、输出电压、电流值按固定周期打包成状态帧通过串口或者现场总线发出去这套电源系统就从“被动保护”升级成了“主动遥测”。远程的人能看到当前负载电流是否偏高、电压是否波动甚至能预测某一路电源即将过载。更进一步如果选用的eFuse部分型号带有数字接口PIC24FV32KA304也可以直接通过I2C读取器件内部的故障寄存器、电流遥测值连外部采样电路都省了。具体型号是否支持以手里的数据手册为准但整个架构是兼容这个升级路径的。7.3 与系统主控的协作边界最后想说说这套方案里电源管理MCU和业务主控的分工。我的做法是电源管理MCU只负责“电源域”的状态业务主控通过一个简单的双线握手状态请求/应答来获取电源健康信息。业务主控永远不直接控制EN引脚它只能“请求”电源管理MCU去执行开机或关机动作。这样做的好处很实际当业务主控程序跑飞或者被调试器挂起时电源管理逻辑不会被连带干扰。工业设备最怕的就是“一个未知的软件bug导致整机掉电或者保护失效”把电源控制权限独立出来就是给整个系统买了份保险。如果你在做一个可靠性要求不那么高的消费类产品这套方案当然可以简化但如果你做的是7x24小时运行的工业设备我建议你保留这个边界。不管怎么说eFuse加一颗小MCU的组合确实治好了我过去几年在电源保护上的焦虑。以前板子返修回来我只能猜是过压还是过流现在一插串口看日志故障类型、时间、当时的电压电流数值清清楚楚。做嵌入式这一行能把“看不见的故障”变成“看得见的日志”本身就已经赢了一半。
返回列表