ARTICLE DETAIL

资讯详情

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

eFuse加MCU:工业电源路径保护与热插拔安全设计

eFuse加MCU:工业电源路径保护与热插拔安全设计 我之前在做一块双网口嵌入式主板时电源入口用的是分立PMOS加限流电阻的方案结果在一台24V工业电源热插拔测试中连接器直接打火烧黑后端一颗钽电容也鼓了包。后来我把入口保护换成TI的eFuse器件TPS259483AYWPR并用STM32F413RH专门做电源监控和策略控制整个电源路径才算真正稳定下来。这篇文章就把这套“eFuse硬件保护 MCU软件管理”的方案拆开讲清楚包括参数怎么算、固件怎么写、波形怎么看以及我从分立方案迁过来时踩过的坑。这套方案适合做嵌入式Linux主板、工业网关、PLC、传感器节点这类电源入口电压不固定、负载有大电容、需要热插拔的场合。核心思路是让TPS259483负责微秒级响应的硬件保护让STM32F413负责毫秒级以上的配置、时序、恢复和上报。两者一快一慢配合起来才能把电源路径保护做完整。1. 为什么电源路径“保护”不是加个保险丝就完事1.1 从一次热插拔事故说起当时那块板上入口是一个DC座后面直接怼了220uF的电解电容和几个MLCC再往后是DC-DC和LDO。插拔电源座的时候连接器会因为接触电阻产生电弧瞬间的浪涌电流可能几十安培直接把连接器镀层打得发黑严重的甚至能看到火花。更麻烦的是后端DC-DC在输入电压跌落时会突然关断或失控板子上的主控直接复位。加保险丝只能解决“烧断”这个结果解决不了“浪涌造成电压塌陷”和“连接器打火”这些过程问题。工业现场还有一种更隐蔽的情况负载内部轻微短路电流从2A慢慢涨到6A保险丝熔断曲线又慢又宽容等它断掉旁边的MOS管或电容已经热损伤了。1.2 保险丝、PPTC和分立MOS方案各自的短板我列过一张对比表把几种常见入口保护方式放在一起看过方案响应速度限流精度可恢复性状态输出浪涌控制普通保险丝慢毫秒级到秒级差和环境温度强相关不可恢复换件无无PPTC自恢复保险丝很慢动作时间不可控差保持电流受温度影响大可恢复但时间长无无分立PMOSRC驱动中等无闭环限流靠电阻估算可恢复无弱靠RC慢开TPS259483这类eFuse微秒级内部环路高可编程可配置锁存或自动重试PG/FLT引脚可编程压摆率分立PMOS方案还有一个致命问题限流是靠栅极驱动电阻硬抗MOS管工作在恒流区能量全部耗在MOS上。设计者需要自己算SOA安全工作区算热阻稍不留神MOS就烧了。而eFuse把采样电阻、控制环路、功率管、热关断全部集成在里面负载短路时内部钳住电流超过时间再用FLT引脚报警。1.3 eFuse MCU硬件快回路与软件策略层的分工有些工程师觉得“eFuse自己就能保护电源还要MCU干什么”这是没分清保护层级。TPS259483这类器件本质是硬件快回路输入过压、欠压、过流、反向电流、芯片过热都在内部比较器里完成延迟只有微秒级别。但硬件回路有个特点——它只关心“现在有没有危险”不关心“接下来怎么恢复”。比如负载短路硬件立刻限流但短路解除后是要自动恢复供电还是一直锁死直到人工复位热插拔浪涌和真正短路怎么区分这些问题硬件没法自己决定需要MCU来看状态、定策略。STM32F413RH在这里就是策略层它通过GPIO控制EN使能通过PG和FLT引脚感知状态通过ADC回读输入电压、输出电压、电流监控信号然后按照状态机决定上电时序、故障恢复、告警上报。这套分工就是标题里“保护嵌入式和工业应用中的电源路径”的完整含义。2. TPS259483AYWPR 的参数设置与 STM32F413RH 接口设计2.1 器件在电源树中的位置与引脚级连接先说整体电源树。输入从连接器进来后先经过TVS管做浪涌吸收再到输入滤波电容然后进TPS259483的VIN。VOUT出去之后给后级DC-DC、LDO、以及主板负载。关键点在于STM32F413本身不要直接从VOUT取电而是用一个宽压输入的3.3V小LDO从VIN取电因为eFuse在故障动作后会把VOUT切断这时候MCU必须还活着才能执行上报和恢复策略。STM32F413RH和TPS259483之间的引脚连接按我实际用的方案是这样的ENSTM32的GPIO输出控制上电初期保持低电平待机时关断通路。PG电源正常指示开漏输出接3.3V上拉连STM32的外部中断引脚。VOUT到达目标值后PG拉高。FLT故障指示开漏输出接上拉连STM32另一个外部中断引脚。发生过压、过流超时、热关断时拉低。IMON电流监控输出接到STM32的ADC输入加一个RC低通滤波。这个脚输出一个和负载电流成比例的电压采样后可以实时估算电流。如果所选型号带I2C/寄存器配置就把SDA/SCL接到F413的I2C外设上用于配置限流阈值、压摆率、故障模式、写好之后软件也可以实时改参数甚至可以关断再重开只重启VOUT而不动整个系统。要注意因为PG和FLT是开漏输出上拉电阻的供电最好来自MCU侧的3.3V不要直接拉到输入电源。否则在输入电压还没有稳定到标称值的时候上拉电平也在跟着乱跳MCU容易误判状态。2.2 三个必须算清楚的参数限流、过压/欠压、启动斜率第一个是电流限制阈值。TPS259483的限流值通常通过一个外接电阻或者寄存器配置手册会给出换算公式。我设计的目标是系统正常工作最大电流2A考虑DC-DC启动瞬态我把限流点设在3A。计算方式是按照手册的公式把电阻值算出来然后选E96系列的标准电阻同时留出电阻精度和器件精度的余量。实际中我会再保留20%左右的回退空间避免后级瞬间脉冲触发误动作。第二是过压和欠压阈值。以12V系统为例我设OVP为15VUVLO为9V。分压网络从VIN引出分压点接到OVLO/UVLO引脚。假设器件参考阈值是1.2V那分压比就是1.2/15顶部电阻选100k底部电阻按同样分压比算出约8.57k取标准值8.66k。这里有一个重要原则阈值不要卡在系统正常电压的边缘。之前就见过有人把OVP设在13V结果电源纹波大一点就误保护整个板子周期性重启。第三是启动斜率也就是软启动的快慢。eFuse一个重要能力就是可以通过压摆率控制引脚上的电容来设定VOUT爬升速度。这个参数决定热插拔浪涌电流的大小在VOUT上升期间负载电容充电电流约等于C_load乘以dV/dt。比如后级电容总计440uF想要限制充电电流不超过0.8A那就应该把压摆率控制在1.8V/ms左右对应选择合适的外接电容。电容选小了浪涌大选大了上电太慢被狗咬或者上位机超时需要根据实际系统调试。2.3 为什么用STM32F413RH而不是普通MCU做这个管理任务很多人觉得电源管理随便拿个8位MCU或者Cortex-M0就够了但STM32F413RH在这个场景有它独特的匹配点。首先是模拟外设够丰富。F413带的12位ADC有多个通道我可以用独立的通道同时采样VIN、VOUT、IMON而且配合DMA可以做到连续采样不占CPU。之前用普通MCU只有一个ADC采样靠轮询波形数据根本抓不完整排查故障非常被动。其次是内置比较器和运算放大器。我可以在F413内部再搭一套“软件之外的备份保护”比如用比较器直接比较IMON电压和某个阈值超限就把控制负载的GPIO拉低这个响应是MCU外设级别的比CPU跑中断快得多。虽然TPS259483已经有一层硬件保护但冗余一层对于工业场合意义很大。第三是接口能力。F413有多个UART、SPI、I2C、CAN我可以把电源状态日志通过UART发到调试串口同时通过CAN上报到上位机或者PLC。工业网关场景下电源故障日志非常重要这些通信接口不占额外的芯片。而且F413主频100MHz跑状态机和ADC采集只用很少的资源剩下的CPU还可以顺便做温湿度采集和设备联网所以选它做电源管理并不是大材小用而是顺手把“电源管家”和“应用主控”合并了。3. STM32F413RH 的固件设计状态机、故障处理与时序控制3.1 “先使能、等PG、再开后级”的受控上电流程很多嵌入式Linux主板死在启动过程中的电源竞争上多个DC-DC同时使能输入被瞬态电流拉垮eFuse限流又介入电压爬不起来。我现在的做法是严格分阶段上电用STM32F413管理时序。上电时序可以按这样的顺序实现系统上电后STM32先启动此时EN保持低eFuse通路关闭。MCU初始化ADC、中断、I2C读取配置参数。检查VIN是否在正常范围内如果外部电源还没稳定就继续等待。配置TPS259483的限流、压摆率、故障模式如果支持I2C。拉高EN开始软启动。等待PG引脚拉高确认VOUT已经建立。依次使能后级DC-DC和LDO每路之间留10到50ms延时避免同时冲击。进入正常运行状态周期性采集VIN、VOUT、IMON。这个流程放到代码里最典型的实现是用一个状态机而不是直接写顺序if。因为上电过程中任何一个环节都可能卡住比如PG一直不拉高说明后级短路或压摆率太慢。用状态机做的好处是每个状态都有超时退出不会死在某个等待函数里。typedef enum { PWR_INIT, PWR_WAIT_VIN, PWR_CONFIGURE, PWR_ENABLE, PWR_WAIT_PG, PWR_RUN, PWR_FAULT, PWR_LATCH } pwr_state_t; void pwr_state_machine(void) { switch (pwr_state) { case PWR_WAIT_VIN: if (read_vin_voltage() UVLO_THRESHOLD) { config_efuse(); pwr_state PWR_CONFIGURE; } break; case PWR_CONFIGURE: efuse_write_config(); pwr_state PWR_ENABLE; break; case PWR_ENABLE: EN_GPIO_HIGH(); pg_timer_start(50); /* 50ms超时 */ pwr_state PWR_WAIT_PG; break; case PWR_WAIT_PG: if (PG_GPIO HIGH) { enable_dcdc_step_by_step(); pwr_state PWR_RUN; } else if (pg_timer_expired()) { pwr_state PWR_FAULT; } break; case PWR_RUN: monitor_vin_vout_imon(); break; case PWR_FAULT: EN_GPIO_LOW(); report_fault(); pwr_state PWR_LATCH; break; } }3.2 故障状态机锁存、自动重试与上报策略故障处理的核心问题是什么故障需要立即断电什么故障可以等一下再看。我把故障分成几类过压输入立即关断EN并锁存因为电压超限意味着外部电源或接线错误继续工作电气应力过大会损坏负载。持续过流先看是不是启动阶段的容性负载充电如果是容忍它持续一段时间等软启动完成。如果运行中电流持续超限达到故障超时阈值说明负载有异常按策略决定锁存还是重试。短时脉冲过流比如电机启动瞬间几百毫秒的过流是正常的不算故障。eFuse内部的故障超时参数就已经能覆盖这种场景MCU这边不要看见FLT拉低就急着断电。热关断eFuse芯片自己温度过高进入热关断MCU要做的是记录事件等待器件冷却后按策略恢复。锁存模式和自动重试模式的选择我是这样定的电池供电或者要求无人值守的设备选自动重试比如间隔200ms尝试重启一次连续5次失败就锁存工业控制板卡则直接选锁存模式故障后保持关断等待现场人工确认之后再复位。原因很简单工业设备上反复打嗝式重启会对后级继电器、接触器、执行机构造成机械冲击比一次断电还要危险。3.3 ADC采集与软件防抖的细节STM32F413的ADC精度对电源管理场景够用但要注意几个容易翻车的细节。IMON引脚出来的电压比较小可能只有几十毫伏直接采会淹没在噪声里所以要加RC低通滤波时间常数我一般取1kHz截止频率兼顾响应速度和稳定性。VIN和VOUT的分压采样同样要加滤波电容不然会在阈值附近来回触发。FLT和PG两个引脚是开漏输出作为外部中断引脚使用的时候要配成下降沿和上升沿都触发。我踩过的一个坑是软件里没有做防抖FLT引脚因为噪声产生一个很短的低脉冲MCU立刻断电锁存板子就莫名不起机。后来加了20ms的连续电平确认再加上定时器防抖才把这块误报治掉。判断故障类型时不能只靠FLT还要结合ADC读数如果VIN正常但VOUT掉到0并且IMON还在高位大概率是短路或者过流超时如果VIN本身就异常升高那基本是过压故障。把这些判断放在中断回调里统一转成事件给状态机处理代码会干净得多。4. 上电浪涌的经典场景与eFuse软启动机制4.1 浪涌是怎么来的I C*dV/dt 的工程含义任何上电过程只要后级有容性负载就存在浪涌电流。直观类比就是水龙头对空水池注水如果直接把阀门开到最大水会猛烈冲击池底慢慢开阀门水就平稳上涨。电容两端的电压相当于水池水位电流相当于水流而eFuse的软启动电压斜率控制就是那个逐渐开大的阀门。工程上计算浪涌电流用的是I C_load * dV/dt。一个例子嵌入式Linux主板总电容可能超过1000uF如果VOUT在100us内从0冲到12V那浪涌电流就是1000uF乘以120V/秒等于120A。这个电流瞬间流过连接器和PCB走线不仅引起电压塌陷还会产生电火花和EMI。所以压摆率设计的目标就是把电荷缓慢地充进去而不是阻止充电本身。注意这里强调一下如果是纯软件控制MOS管软启动很难把斜率控得那么准因为MOS管的Miller平台和栅极电容都受温度影响而eFuse内部是把恒定电流充到压摆率电容上产生一个线性的电压斜坡稳定性和精度要高很多。4.2 eFuse的软启动环路与故障超时怎么配合TPS259483内部的软启动思路是这样的压摆率控制引脚通过恒定电流给外部电容充电这个电容电压缓慢爬升内部电路把输出驱动参考电压随它一起斜坡上升于是输出MOS管线性开启VOUT跟着线性爬升。当负载电流达到设定的限流值之后内部环路会从“压摆率控制”切换到“恒流控制”VOUT的爬升速度自动变慢电流被钳在设定点上。这个切换过程完全是模拟环路完成的MCU不需要参与所以哪怕STM32F413正在处理别的任务硬件的限流保护依然有效。和软启动配合的还有一个故障超时机制。过流发生时eFuse不会立即关断而是先进入限流状态并开始计时如果流时间超过设定值才判定为真实故障并动作拉低FLT或关断。这个设计是为了区分“电容充电造成的短暂过流”和“负载短路造成的持续过流”。后级电容充电那段时间电流可能确实顶到限流阈值但电容充满之后电流自然下降如果系统一看见限流就锁存整个板子连电都上不了。所以我把限流点选得比最大充电电流略高再把故障超时覆盖电容充电时间这两个参数配合起来才能既保命又不误伤。4.3 哪些负载最容易骗过保护电路最容易造成保护误动作或失效的负载我总结了三类。第一类是启动瞬间有冲击电流的电机、继电器线圈、电磁阀。它们绕组呈现感性启动时电流可能达到稳态的5到8倍持续几百微秒到几十毫秒不等。这类负载不能用太严格的限流配置要留够冲击余量。第二类是板上电源轨非常多的大主板。多路DC-DC如果同时上电每一路输入电容都会参与充电整个VOUT瞬时电流叠加非常恐怖。处理的思路是控制各路使能时序错开让每一路的充电电流峰值错开这样总体电流在限流阈值之内平坦分布。第三类是带“电子负载”特征的受控设备比如LED驱动、功放电源。这类设备为追求效率输入电容通常很小但动态功耗变化剧烈。它们的问题是运行中电流突变容易把eFuse的限流环路突然拉起来。建议是针对这类应用把限流点留足够余量同时把故障超时时间适当调长不要一超限就断。5. 实测与调试从波形到边界状态5.1 测试平台与基本测量方法测试这类电源保护方案我用的基本装备是可调直流电源、电子负载、数字示波器至少100MHz带宽、电流探头或低阻值采样电阻、热像仪。导通测试是整个调试的第一关。先用空载启动观察VOUT是否按设定斜率线性爬升压摆率和计算值是否一致。如果VOUT波形不是直线而是阶梯状典型的斜率电容选小了内部在回退再带100uF、220uF、470uF逐个加电容观察每次是否会触发FLT。第二关是限流精度验证。用电子负载设CC模式从1A开始慢慢往上加记录实际限制电流点。我测过好几次实测定格电流和设定值之间的误差通常都在手册标称精度内这也正是eFuse相对分立方案最大的优势——分立方案的限流点受MOS管和采样电阻温度漂移影响误差能达到30%以上。第三关是过压和欠压。用可调电源从额定电压慢慢往上调记录OVP动作点再往下调记录UVLO释放点。注意要用示波器同时观察VIN和FLT波形确认保护动作延迟是微秒级而不是毫秒级。5.2 三种典型异常波形与定位思路调这块板子的时候我抓到过三种非常有代表性的异常波形每次看到都能很快定位问题方向。第一种是启动时VOUT猛然冲起来同时I_IN有个陡峭尖峰然后FLT拉低。这种多半是压摆率电容没焊好或者取值太小导致软启动太快、浪涌电流超过限流点被判定为过流超时。解法是降低压摆率也就是加大斜率电容。第二种是启动过程VOUT爬升到一半就停下来电流顶在天花板上但FLT没有拉低。这是后级负载电容过大电流已经恒流了但是故障超时还没到系统在努力充电。如果几秒之后还是顶着那就是故障超时设得太长实际后级有短路需要把超时调短或者检查负载。第三种是运行平稳之后FLT偶尔拉出一个几十微秒的低脉冲系统并没有重启。这就是MCU侧没有防抖或者布局上数字噪声串进FLT走线我在软件中加了滤波同时把信号走线从功率回路旁边拉开问题就消失了。5.3 热设计与长期可靠性测试要点热设计这块是最容易被人忽略的。eFuse在正常工作压降很小发热不严重但如果持续限流比如输入24V、限流3AVOUT被拉到很低甚至为0那么芯片上耗散的功率可以接近72W这是一个非常恐怖的数字。绝大多数eFuse在持续限流几百毫秒后就会热关断这正是设计者想要的但也意味着短路测试不能长时间保持否则热应力超出焊点耐受极限器件可能失效。我在热设计上做了几件事PCB在eFuse的焊盘下方打过孔阵列连接到内层铜皮增大散热面积把限流测试改成短时脉冲方式用电子负载设一个1秒的过流窗口关掉自动重试长时间满载老化测试时用热像仪盯着芯片表面温度正常情况下温升不超过40摄氏度才算合格。长期可靠性测试至少要跑1000次上电循环、100次短路故障注入还要做温箱里高低温工作测试发现问题回到参数表上去核。6. 从分立方案迁移到eFuse我踩过的坑6.1 默认使能状态、锁存模式与打嗝模式的选择迁移到eFuse之后我踩的第一个大坑是EN引脚的默认状态。有些型号在EN引脚悬空时默认使能VIN一上来VOUT就有输出这意味着MCU还没起来输出就已经带电了。对于严格的上电时序要求这非常危险后级DC-DC可能在没有PG确认的情况下同时上电。我的解决方案是选支持默认关闭的型号并且在EN上加了100k下拉电阻MCU启动以后显式拉高才使能彻底把“何时上电”的决定权交给软件。锁存和自动重试的选择我在3.2里说了一些原则再补充一个实际体会不要用“自动重试”掩盖真实的硬件故障。之前一块板子反复重启我以为是eFuse打嗝保护在起作用后来抓波形才发现是后级一颗LDO的EN脚没按规格做延时导致每次上电都有瞬间短路。如果当时选锁存模式问题早就暴露了。锁存模式可以逼你去查根因自动重试则会掩盖小概率但真实的问题。6.2 接地、采样与PCB布板的三个教训第一功率地和信号地必须分开然后再单点连接。eFuse的功率回路电流很大如果IMON采样走线和大电流走线共用了同一段铜皮ADC读数会带着明显的阶梯状噪声而且FLT信号也会受干扰跳变。我把功率回路设计成从输入端电解电容直接到eFuse再到输出端信号线上的采样走线单独从器件引脚引出在ADC输入端汇合。第二输入电容和输出电容要紧贴器件引脚中间不要穿太多过孔。我早期布局时输入电容放得比较远结果在瞬态时VIN出现大的振铃一度怀疑是eFuse自激振荡后来拉开布线振铃就没了。开关器件最忌讳的是环路电感输入电容和VIN引脚之间的回路要尽量小。第三短路测试时不要忽略输出电容存储的能量。VOUT电容在断电瞬间会反向放电如果布局上输出电容到GND的回路太长测试时会打坏示波器探头甚至焊盘。我的做法是断开输出负载之后再测短路并且用电子负载而不是直接短接把风险控制住。6.3 成本与量产权衡什么时候该用eFuse最后聊一下大家都关心的成本问题。一颗工业级eFuse比普通保险丝加采样电阻加分立PMOS的组合要贵这是事实。但要把调试周期、误动作返工、板子烧毁风险折算进去eFuse在高可靠场景并不贵。我的权衡标准很简单如果产品要过CE、UL、IEC 61000-4-2这类认证或者客户要求热插拔、过压保护、故障上报那直接eFuse省下的认证返工成本远超器件差价如果产品大批量、低价格、允许简单故障就断电那分立方案还有存在的理由。另一个建议是把eFuse相关代码做成一个独立模块隔离到driver层上层应用只调用模块接口比如pwr_set_limit()、pwr_get_fault_status()、pwr_retry_enable()。这样以后换eFuse型号或者改参数只动一个文件不用把这个逻辑散落在整个项目里。我用这套结构换过一次更低压力的eFuse型号只改了几行配置主逻辑完全没动非常省事。如果你现在还在用PMOS加RC做入口保护试着换一颗eFuse配合一个合适的MCU做策略管理会明显减少排查电源问题的时间。最后再分享一个实用的小技巧把PG和FLT分别接到STM32F413的两个外部中断引脚并在中断服务函数里只置标志位不要在中断里做任何决策具体动作全部丢给主循环的状态机去执行。这样干扰再大也不会因为一个毛刺中断导致系统误断电。
返回列表