ARTICLE DETAIL

资讯详情

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

嵌入式电源保护:eFuse+MCU应对热插拔浪涌与过流故障

嵌入式电源保护:eFuse+MCU应对热插拔浪涌与过流故障 工控现场待久了你会发现板子烧掉的原因往往不是设计时拍脑袋想的那种大短路而是热插拔瞬间的一串火花、连接器接触不良引起的电弧、或者是负载慢漏电导致的DC-DC过热。上个月在客户那里一块嵌入式控制板刚从包装箱拿出来接上24V电源的瞬间电源入口的滤波电容被浪涌电流打出火花直接击穿了后级降压芯片。后来我把这套方案换成了TI的TPS259483AYWPR电子熔断器配合STM32F410RB做监控策略整个保护逻辑才算真正立住了。这篇文章就从头到尾拆一下为什么会选这两颗料、硬件上怎么接、固件状态机怎么写、实测又会踩哪些坑给打算在嵌入式或工业产品里做电源路径保护的朋友一个可以复用的参考。先声明一下不同批次的芯片参数细节以官方数据手册为准我下面涉及的电阻电容计算都是基于TPS25948x系列这类可编程eFuse的通用设计方法结合实际调试数值给出。原理搞清楚了具体数值换型号也能算。1. 传统保险丝为什么挡不住工业电源轨的高级故障1.1 工业现场最常见的四类电源故障做嵌入式或者工业控制柜的朋友应该都有体会现场的电源故障很少是教科书式的那种干净短路更多是下面这些情况第一类是热插拔浪涌。板卡带着一堆钽电容和电解电容插进背板插头接触的瞬间数百甚至上千微法的电容相当于对地短路冲击电流可以在几十微秒内冲到几十安培。连接器的簧片会被烧黑PCB焊盘会拉弧如果后级没有保护DC-DC的输入耐压很快就会被打穿。第二类是硬短路。后级负载里某个MOS管击穿、线束破皮搭铁、电解电容反向安装爆裂这些情况等效于电源轨直接对地。这时候电流上升速度极快传统保险丝的热熔断时间往往要几十毫秒甚至更久在此之前整条母线上的其他电路已经被拖垮了。第三类是过压瞬态。工业环境里感性负载特别多继电器线圈断电、电机刹车、电磁阀关断这些都会在24V或者48V母线上叠加几百伏甚至上千伏的尖峰。没有钳位和保护后级器件就是一批批地死。第四类是慢过流。线缆绝缘老化、连接器氧化、板子局部受潮漏电电流只是比额定值高了一点点但是长时间工作会让线束发热、PCB走线碳化最终演变成火灾隐患。这四类故障的共同特点是它们要么响应太快要么持续时间太长传统熔断器和PPTC都处理不好。1.2 保护方案选择上的本质矛盾传统的玻璃管保险丝和PPTC自恢复保险丝本质上都是利用热量累积来断开响应时间天然就慢而且精度极差。同一个额定值的保险丝不同环境温度下的实际触发电流能差出一倍。用在实验室直流电源上还凑合放在工业产品里一旦遇到瞬时浪涌保险丝还没反应过来后面的电路已经烧透了。分立MOS管加比较器搭一个保护电路倒是响应快但是分立方案占面积大、参数一致性差、调试难度高。每一路电源都要重新调一遍阈值生产环节很难保证一致性。而且分立方案几乎没有状态反馈保护动作之后你根本不知道是过压还是过流出了问题只能靠猜。这也是为什么我后来转向eFuse这类集成方案。TPS259483AYWPR这种电子熔断器把功率开关、电流采样、限流比较器、过压欠压检测、热关断全部集成在一颗芯片里响应时间能到微秒级电流限制精度比保险丝高一两个数量级同时还能输出故障标志信号给MCU。但纯eFuse也有它的问题它擅长做快速物理保护但不擅长做复杂的策略判断。比如是不是允许自动重试、重试几次、什么条件下锁死、故障发生的时间和当时的运行参数这些逻辑需要一颗MCU来做。这也就是ST的STM32F410RB在这个链路上的价值所在。2. 拆解 TPS259483AYWPR 的保护机制与接口设计2.1 芯片到底提供了哪些保护功能TPS259483AYWPR属于TI的TPS25948x系列是一颗集成功率FET的可编程电子熔断器。我拿到这颗芯片第一反应是它的集成度输入输出之间就是一颗低导通电阻的MOSFET后面挂了一整套模拟保护电路。它的核心保护功能大致可以分这几块输入侧有欠压锁定也就是UVLO。可以用两个电阻分压设定阈值输入电压低于设定点时内部FET不会开启。这个功能特别实用因为很多嵌入式系统在上电瞬间会有一段电压爬升过程如果没有UVLOMOS管会在极低电压下就打开负载电流全部挤到未稳定的输入源上。输出侧有过压保护内部的钳位机制可以在输入出现瞬态过压时把输出拉到一个安全上限以内这对后级DC-DC的生存至关重要。电流限制是这颗芯片最值得说的。它内部集成采样FET和比较器你可以用外部电阻设定限流点。和传统保险丝那种等温度到了才断开的机制完全不同它是在电流超过设定值之后主动把电流卡在设定值附近如果持续超时再进入关断流程。这给了后级电路一个非常可预测的故障行为。软启动也叫浪涌控制。芯片有一个SS引脚接一个电容就能设定输出电压的上升斜率。这样即使后级有巨大的电容负载在上电瞬间电流也是被限制在可控范围内的不会产生火花和冲击。状态输出方面FLT引脚在故障时拉低PG引脚在输出正常时报告电源正常信号。这两个信号直接接MCU的GPIO或者外部中断引脚就能让处理器感知保护动作的发生。2.2 以12V输入、3A限流为例的参数计算设计的时候我习惯先定工作条件再反推外部元件。这里以12V输入、正常工作电流2A、目标限流点3A为例来算一遍。UVLO电阻分压是最先要确定的。芯片内部有一个基准电压通常在0.5V到1.2V之间具体看手册。假设内部基准是0.5V我们希望输入电压低于9V时禁止开启高于9V后恢复那么分压比就是0.5/9约等于0.0556。如果选上分压电阻100kΩ下分压电阻按比例算是大约5.9kΩ。实际设计时我会选两个1%精度的电阻再在调试时用滑阻验证一下阈值点。限流电阻的计算一般遵循ILIM约等于K除以RILIM的规律K是芯片内部设定的增益系数具体数值需要查数据手册。我用的这颗芯片在手册里给了典型系数按目标3A反推限流电阻大概在几十千欧量级。这里有一个调试细节电阻精度直接决定限流精度所以必须用1%或者更高精度的电阻不能随手拿个5%的碳膜电阻顶上。软启动电容的选择要结合后级总电容来计算。假设后级有200μF电容我们希望在5ms内把输出从0拉到12V那么充电电流就是C乘以dV除以dt也就是200μF乘以12V再除以5ms算出来大约0.48A。这个电流明显低于限流点3A所以软启动电容的值应当让充电电流保持在安全范围以内。2.3 与STM32F410RB的接口定义我实际项目的STM32F410RB和TPS259483AYWPR之间的连接大概是这样EN引脚接MCU的一个普通GPIOMCU做上电时序控制比如等到自己初始化完成、确认输入电压稳定之后再打开电源路径。FLT引脚用开漏输出外接10kΩ上拉到3.3V然后接MCU的EXTI外部中断引脚。这样芯片一进入保护状态MCU立刻能感知到不需要软件轮询。PG引脚接MCU的另一个GPIO用来做输出就绪判断。MCU在软启动结束后等PG拉高再往后级负载发出运行使能信号保证负载不会在输出电压还没有建立起来的时候就开始工作。如果选用的TPS25948x型号带I2C遥测接口还可以把SCL、SDA接到F410RB的I2C外设上读取芯片内部的电流、电压和温度数据。我第一批板子用的是基础型号只保留了硬件保护引脚后面升级版才用上遥测。3. STM32F410RB 在保护链路中到底管什么3.1 为什么需要一个MCU来做策略层很多人觉得芯片已经把过压过流短路全保护了为什么还要再接一颗STM32F410RB这就涉及保护和策略的区别。TPS259483AYWPR负责的是微秒级、毫秒级的物理保护电流超了立刻限制电压超了立刻关断。它像一个反应极快的保安看见危险就动手。但它不知道这个危险是一次性的还是重复性的也不了解整台设备的历史运行状态更没有能力把故障信息传到上位机。STM32F410RB负责的是慢决策确认故障类型、记录故障现场、决定是否让芯片重新启动、如果反复故障就把设备锁死并报警。它像是一个调度员保安把情况报上来之后调度员决定是恢复生产还是停机检修。这种分工在实际项目里非常有效因为工业现场最难处理的恰恰是间歇性故障。负载偶尔过流直接锁死设备会让产线停摆但如果允许反复自动恢复又可能导致故障扩大化。MCU的参与让我们能精确控制这种平衡。3.2 STM32F410RB的资源分配与采样电路STM32F410RB这颗MCU的定位很有意思Cortex-M4F内核主频100MHz带浮点运算单元片上还有12位ADC、I2C、SPI、多路UART功耗控制做得又很好。用来做电源路径保护的监控大脑性能和成本都非常合适。我在设计里的外设分配是这样的ADC1的三个通道分别采样输入电压、输出电压和负载电流。输入输出电压都用电阻分压之后再进ADC因为12V电平直接给MCU引脚就是找死。分压电阻用100kΩ加10kΩ的组合把12V缩到约1.09V留出安全裕量。分压点加一个0.1μF的滤波电容再用一颗小阻值电阻串联组成RC低通滤波。负载电流的采样我优先用芯片的电流监视输出引脚IMON它可以输出一个和流过FET的电流成正比的电流经过采样电阻后进ADC。如果芯片不带这个引脚就只能在功率回路上加采样电阻或者霍尔传感器成本和体积都会上来。GPIO方面EN、FLT、PG各占一个引脚一个LED指示运行状态一个蜂鸣器引脚指示报警一个UART口接调试终端打印状态信息。这里有一个非常关键的电路设计原则STM32F410RB自身的供电最好不要直接从TPS259483AYWPR的输出端取电。我见过很多设计把监控MCU的LDO接到了被保护的回路上结果故障时eFuse保护动作输出断电MCU也跟着死掉别说记录了连故障报警都发不出去。正确做法是从输入电源前端取电加一个小LDO单独给MCU供电这样即使保护路径被切断MCU还能活着记录和上报。3.3 用便宜MCU做保护的收益有人会问既然有I2C遥测为什么不在后端放一颗更复杂的主控芯片来做管理原因之一是被保护的对象本身可能就是一个嵌入式系统主控负责业务逻辑电源管理如果也塞进去业务一卡顿就会影响保护响应。单独分一颗F410RB出来专管电源策略主控崩溃了它照样能把电源拉闸这就叫故障隔离。4. 固件状态机从冷启动到故障恢复的完整实现4.1 状态定义固件我把整个过程建模成状态机不是简单的if-else堆逻辑。因为电源保护涉及多种故障输入、多种恢复路径一旦状态乱了现场排查会非常痛苦。状态可以分成这样几个系统上电后进入INIT状态MCU初始化时钟、GPIO、ADC、UART读取上次EEPROM里保存的故障记录然后自检。自检发现供电正常就进入STANDBY此时eFuse还是关着的。STANDBY状态里MCU做一件事持续采样输入电压。确认输入电压在UVLO设定范围以上并且持续200ms没有抖动然后拉高EN引脚进入SOFT_START状态。SOFT_START状态下MCU盯着PG引脚和ADC电压采样。正常情况下输出会在几毫秒内爬升到目标值PG拉高进入RUNNING状态。如果这段时间内FLT被拉低说明启动过程中就触发了保护按启动失败处理。RUNNING状态下MCU循环处理故障事件。FLT中断来了先记录时间戳和当前输入输出采样值再根据故障类型做处置。电压采样连续低于阈值且超过去抖时间判定为掉电进入故障处理流程。FAULT状态是核心决策点。MCU检查当前故障发生次数如果少于设定次数进入RETRY状态等待500ms后重新拉高EN。如果连续故障次数达到上限直接进入LATCH状态切断EN点亮报警LED锁死设备只能人工复位。4.2 状态机骨架代码代码我用类似HAL的伪代码结构方便大家移植到自己的工程里typedef enum { ST_INIT, ST_STANDBY, ST_SOFT_START, ST_RUNNING, ST_FAULT, ST_RETRY, ST_LATCH } sys_state_t; static sys_state_t g_state ST_INIT; static uint8_t g_fault_count 0; static uint32_t g_fault_timestamp 0; void power_protection_task(void) { switch (g_state) { case ST_INIT: periph_config(); g_state ST_STANDBY; break; case ST_STANDBY: if (read_vbus() VBUS_OK_THRESHOLD) { gpio_set_en(1); g_state ST_SOFT_START; } break; case ST_SOFT_START: if (flt_pin_asserted()) { g_state ST_FAULT; } else if (pg_pin_asserted()) { g_state ST_RUNNING; } break; case ST_RUNNING: if (flt_pin_asserted()) { g_fault_timestamp get_ticks(); g_fault_count; g_state ST_FAULT; } break; case ST_FAULT: if (g_fault_count MAX_RETRY_COUNT) { gpio_set_en(0); g_state ST_RETRY; } else { gpio_set_en(0); led_set_alarm(1); g_state ST_LATCH; } break; case ST_RETRY: if (get_ticks() - g_fault_timestamp RETRY_DELAY_MS) { gpio_set_en(1); g_state ST_SOFT_START; } break; case ST_LATCH: // 只能掉电复位或人工干预 break; } }这段骨架没有加具体驱动函数实现但状态转移的逻辑是完全可以直接套用的。实际工程里还要在FAULT状态里加一个故障类型判断区分过流、过压、过温因为不同类型的故障恢复策略不一样。比如瞬时过流可以允许重试三次过温必须等温度降下来才能重试输入过压则应该直接锁存等待人工检查。4.3 故障恢复策略的核心原则这里的几个参数都是调出来的不是拍脑袋定的。MAX_RETRY_COUNT设置成3次重试间隔500ms。三次的目的是容忍偶发性的负载冲击比如电机启动瞬间的电流尖峰。但如果连续三次都触发保护说明大概率不是偶发问题锁死设备比反复撞墙安全得多。去抖时间也很关键。FLT引脚不能一拉低就立刻处理工业现场电磁干扰很常见一个毛刺就能让MCU误判。我在中断里先记录状态然后在主循环里做20ms的去抖确认确认确实处于故障状态再进FAULT。重试之前必须确认输入电压还在正常范围。有些故障发生在输入侧比如上游电源跌落此时重试没有意义应该等输入恢复再说。5. 实测与排错记录5.1 实测环境和结果先把测试环境列一下。我用一台30V可调直流电源作为输入源电子负载作为后级负载示波器同时监测输入电压、输出电压、输出电流和FLT信号四通道正好。另外准备了一把热风枪做温度升高的模拟。热插拔测试是最直观的。给后级接了一个200μF的电解电容然后把端子直接怼到带电的电源轨上传统方案会打火花这套方案里输出电压非常平滑地爬升电流没有超过设定的3A限制。实测下来软启动的时间大约是4.8ms和计算值吻合。短路测试直接用电子负载调到恒流短路模式相当于后级直接对地拉大电流。示波器抓到的是电流被卡在3A左右保持了一段芯片内部的超时时间之后迅速关断FLT信号拉低。从短路发生到FLT拉低大约几百微秒这个速度保险丝根本做不到。5.2 踩过的坑和排查思路第一个坑是限流点设得太低。最初我把限流电阻按额定电流的1.2倍来算结果板子一上电就触发保护原因在于上电瞬间后级DC-DC的输入电容充电需要额外的电流额定2A的板子启动瞬间电流能冲到2.5A以上。排查的时候不要盯着稳态电流看要把示波器探头掐在采样电阻上看瞬态电流波形。我后来把限流点抬高到额定电流的1.5倍启动就正常了。第二个坑是FLT上拉电阻选得太大。我用了一个100kΩ上拉结果在电磁干扰强的环境下FLT引脚频繁被干扰拉低导致误报警。排查时一度怀疑是芯片误动作把示波器戳上去才发现是引脚电平被空气中的干扰打穿了。换成10kΩ上拉然后在靠近MCU引脚处加一个1nF的电容到地问题消失。开漏输出必须用合理的上拉电阻不能为了省功耗选过大阻值。第三个坑是ADC采样电压判断抖动。输出正常的时候ADC读出来的电压每秒跳十几个LSB导致软件里偶尔误判输出电压异常。一开始想用更复杂的滤波算法后来直接在逻辑里加了3%的滞回窗口电压高于阈值加3%才算正常低于阈值减3%才算异常。这种处理比滤波器简单可靠得多。第四个坑是MCU自身供电设计。第一版原理图直接图省事从TPS259483AYWPR的输出端取电给F410RB的LDO结果一短路MCU就断电什么故障信息都留不下来。现场只能靠指示灯猜故障原因。后来改成从输入端取电用一颗宽压LDO直接给MCU供电故障记录再也不丢了。电源监控的监控自己的供电必须先保证。第五个坑比较隐蔽是软启动电容和后级电容的配合。最初软启动电容选得偏小输出上升时间快但后级接了200μF电容之后启动瞬间还是会进入限流状态。排查后把软启动电容加大输出爬升时间从2ms拉到5ms启动电流正好落在限流点以内。这里有一个规律后级总电容加倍软启动时间也要跟着加倍否则浪涌电流还是会触发芯片的过流保护。5.3 排错方法论手上一块板子保护动作不确定的时候我习惯用示波器四个通道同时看输入电压、输出电压、输出电流、FLT信号。波形出来之后先看顺序如果是FLT先拉低说明是芯片内部的比较器先触发了问题大概率在负载或者限流配置如果是输出电压先跌落FLT后拉低说明是输入侧先出了问题要往前查电源。如果示波器显示一切正常但MCU还是报警那就把MCU的采样值打出来和示波器实测值对比。很多时候问题出在分压电阻的精度或者ADC参考电压的偏差上软件看到的值和真实值根本不在一个水平线上。6. 可靠性设计的几个进阶提醒6.1 周边器件的配合比芯片本身更重要TPS259483AYWPR再厉害也是孤木难支。输入端必须有合适的TVS管来吸收雷电浪涌和感性负载突断产生的尖峰否则几微秒的瞬态高压就能打穿芯片的输入引脚。输出端的大容量电容要靠近芯片的输出引脚放减少寄生电感。PCB布局上功率路径的走线要尽量短和粗大电流回流路径要和信号地分开走。我有一次发现限流精度和预期不一致最后定位到是限流电阻的参考地线被功率电流串扰了把限流电阻的地线单独走到芯片的地引脚精度立刻恢复正常。6.2 多路电源路径的联动策略工业设备通常不止一路电源核心CPU的1.1V、外设的3.3V、接口的5V、背板的12V每路都加一颗eFuse成本略高但关键路必须加。更进一步的方案是多路eFuse的FLT信号接到同一颗F410RB上MCU根据哪一路报警、报警的先后顺序、各路之间的关系判断故障源头。比如主板上的12V和3.3V同时报警大概率是主板内部出现短路只有某一路报警那就针对那一路的负载排查。这种联动判断能力是普通保险丝方案想都不用想的。6.3 一点个人心得这套方案跑下来我最满意的一点不是某个具体指标而是可诊断性。以前设备坏了只能拆开看焦糊味从哪来现在MCU里存着故障时间戳、当时的电压电流采样值、已经重试了多少次现场维护人员按几下按键就能把信息导出。这种让故障可见的能力在工业维护场景里价值大于一切花哨的功能。如果你也在做类似的嵌入式和工业电源保护建议先在一路电源上摸透芯片的保护行为参数调稳了再推广到整个系统。电源路径保护是最后一个应该出问题的环节但它往往是最先暴露设计短板的地方。
返回列表