ARTICLE DETAIL

资讯详情

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

eFuse+STM32:工业电源路径保护的设计实战与解析

eFuse+STM32:工业电源路径保护的设计实战与解析 去年在给一台工业网关做电源整改时客户现场反馈最多的就是“保险丝又烧了”和“上电瞬间后级直接挂了”。原来的设计是保险丝加分立MOSFET的方案看着简单实际上保护阈值分散、响应速度慢根本扛不住热插拔浪涌和感性负载反冲。后来我把输入保护换成了TI的TPS259483AYWPR电子保险丝搭配STM32F107VC做监控管理整套电源路径保护才算真正落地。这个项目的核心思路不复杂用eFuse做毫秒级以内响应的硬保护让STM32F107VC负责状态监控、故障诊断和恢复策略。硬件快速切断软件做善后管理两个角色分工明确。这套方案对做嵌入式电源管理、工业控制板卡、电池供电系统、以及网关类设备的人来说都很有参考价值下面把选型、计算、电路、固件到调试的完整过程复盘一遍。1. 为什么电源路径保护要单独设计而不是靠保险丝1.1 工业环境电源的常见痛点先说说我在实际项目中遇到的几个真实场景。工业网关挂在现场电源来自24V直流母线但母线上的电压并不是稳定的24V。电机启停会产生几百毫秒的电压跌落感性负载关断会产生高压尖峰热插拔维修时输入端还会出现很大的浪涌电流这些干扰对后级的DC-DC、MCU和通信模块都是致命打击。传统玻璃管保险丝的问题在于它是一次性的烧断之后必须人工更换而且动作特性受温度影响很大。同一个额定电流的保险丝在低温环境下可能要超过1.5倍额定电流才断在高温环境下又可能提前断。自恢复保险丝虽然能复位但动作速度慢漏电流大动作后的残余电阻也会影响后端供电稳定性。更关键的是这两类保险丝都只能提供过流保护对过压、欠压、反向电流这些情况完全无能为力。eFuse这一类电子保险丝就是为解决这些问题出现的。它用内部的功率MOSFET作为开关通过模拟比较器实时监测输入电压、输出电流和芯片温度一旦检测到异常能在微秒到毫秒级的时间内切断通路。而且它体积小、可编程、可复位还能输出故障状态信号这些都是传统保险丝不具备的能力。1.2 eFuse加MCU的分层保护思路很多人一听到MCU就会问为什么不用STM32直接做保护。这里必须把这个问题说透电源保护是硬实时任务短路故障从发生到烧毁器件往往只有几十微秒的时间窗口STM32F107VC虽然主频有72MHz但ADC采样、比较、GPIO翻转这条软件链路走下来响应时间通常在几十到几百微秒遇到瞬时短路根本来不及。TPS259483AYWPR这类eFuse内部是用模拟电路完成检测和动作的响应速度是纯硬件级别不管MCU有没有初始化、有没有死机它都能独立完成过流、过压、欠压和过温保护。这是整个方案的底层保障。而STM32的角色是“管理”而不是“保护”它负责读取输入电压、输出电压和负载电流记录故障原因决定是否允许自动重试以及把电源状态上报给上位机或远程监控平台。在实际项目里我把保护链路分成三层。第一层是TPS259483的硬件保护覆盖过流、短路、过压、欠压、过温这些突发情况。第二层是STM32的监控层通过ADC采样和FLT中断做软判断比如电流长期偏高、电压缓慢漂移这类硬件保护没动作但存在隐患的情况。第三层是系统级策略比如故障记录、重启计数、看门狗联动。这三个层次各司其职缺一不可。1.3 整体架构与信号流向这块板子的电源路径大致是这样走的外部24V输入经过EMC滤波后进入TPS259483AYWPR的VIN引脚从VOUT引脚输出到后级负载。TPS259483的EN引脚连接STM32的PB0FLT引脚连接PB1并配置为外部中断输入IMON电流监测输出经过电阻转换后连接到STM32的ADC通道。同时输入电压和输出电压都经过电阻分压后送到ADC采样。STM32F107VC通过读取这些信号能实时得到电源路径的工作状态。正常情况下MCU只是周期性采样并向上位机汇报。一旦FLT引脚出现下降沿MCU进入中断处理保存当前故障状态和时间戳然后根据预设的恢复策略决定是立即重启还是保持关断。这个架构最关键的优点在于即使MCU完全死机TPS259483依然能保护后级电路而如果TPS259483因为参数设置不合理导致误保护MCU又能通过诊断信息帮助定位问题。2. TPS259483AYWPR核心特性与保护参数设定思路2.1 eFuse的工作原理一个看得见电流和电压的高速开关可以把eFuse想象成一个带仪表盘的高速开关。它内部有一个低导通电阻的功率MOSFET串联在电源路径上正常情况下这个MOSFET完全导通压降很小。同时IC内部有多个比较器一直盯着关键参数输入电压是否超过过压阈值是否低于欠压阈值输出电流是否超过限流点芯片温度是否超过热关断阈值。一旦某个参数超过阈值内部逻辑会快速控制MOSFET关断或限制电流从而保护后级负载。和分立电路相比eFuse把采样、比较、驱动、状态输出集成在了一颗芯片里寄生参数小得多响应一致性也更好。以TPS259483为例它的输入电压范围能覆盖常见的5V、12V、24V工业电源轨内部导通电阻在毫欧级别正常工作时的损耗远比传统保险丝加MOSFET方案低。这里要特别强调一点很多工程师把eFuse当成普通电源开关来用只接了EN和输入输出忽略了ILIM、dV/dt这些配置引脚这其实是浪费了eFuse的核心能力。限流点、启动压摆率、过压欠压阈值这些参数都直接影响保护效果必须按负载特性逐个设定。2.2 关键引脚连接与信号链设计TPS259483AYWPR的引脚不算多但每个引脚都值得认真对待。VIN和VOUT是功率路径要保证足够的铜皮面积。EN引脚控制芯片的开关我用STM32的GPIO驱动并且在引脚附近加了RC滤波避免由于控制线干扰导致芯片反复通断。FLT引脚是开漏输出需要外接上拉电阻到MCU的IO电压域我在板上选了10kΩ上拉到3.3V。ILIM引脚是设定过流阈值的通过外部电阻到地。这里需要根据数据手册中给出的电流监测比例关系来计算电阻值我后面会专门说。dV/dt引脚接一个电容到地用来设定输出软启动的压摆率这个电容的值直接决定上电时浪涌电流的大小。IMON引脚是电流监测输出通常是电流源形式需要外接一个电阻把电流信号转换为电压信号再经过RC滤波进入STM32的ADC。关于OVP和UVLO的设定我按TPS259483数据手册的典型应用电路通过外部电阻分压网络来设置过压、欠压保护点。分压电阻的选择要特别注意精度和温漂我选了0.5%精度的金属膜电阻这样阈值不会随温度变化产生明显漂移。布局上这些电阻要靠近芯片引脚放置避免走线过长引入噪声。2.3 保护阈值设定的实际计算过程这一部分我踩过不少坑所以多说几句。参数计算的第一步是明确负载需求。我这个项目的后级是一块工业网关主板正常功耗约12W电源输入为24V换算下来正常电流约0.5A。但主板上有多个DC-DC启动瞬间输入电容充电需要很大的浪涌电流所以限流点不能只按稳态电流设。限流点的选择逻辑是这样既要给浪涌留出充分的电流余量又要在后级发生短路时能快速切断。我最终把目标限流点定在2A。接着查TPS259483数据手册中ILIM引脚相关曲线和公式把目标电流值代入得到对应的ILIM电阻值再选择最接近的标准电阻。这里要提醒一下不同批次和不同丝印版本的芯片ILIM比例系数可能有差异一定要以官方数据手册为准用TI官网配套的eFuse计算工具复核一遍再定电阻。软启动压摆率的计算也很关键。dV/dt引脚的电容决定输出从0上升到设定电压的时间内部会有一个恒定电流源给这个电容充电。压摆率越低浪涌电流越小但启动时间越长。如果启动时间过长后级DC-DC可能会因为输入电压上升太慢而反复重启。我在这个项目里选择了大约1ms左右的上电斜坡时间对应的电容值是根据手册中的推荐表选取的实测启动时输入电流峰值被限制在1.5A以内效果很好。我整理了一张这个项目的关键参数表方便大家对照参考参数目标值设定方式关键器件输入电压24V直流UVLO/OVP分压精密电阻分压欠压锁定约18V分压网络R_UVLO上/下电阻过压保护约30V分压网络R_OVP上/下电阻限流点2AILIM电阻R_ILIM启动压摆率约1V/msdV/dt电容C_dV/dt输出去耦22uF100nFVOUT对地MLCC3. STM32F107VC在系统里的角色监控、诊断与恢复3.1 为什么选择STM32F107VC作为控制核心选STM32F107VC不是因为它是性能最强的而是它在这个场景下性能够用、外设匹配度高、开发成本可控。它基于Cortex-M3内核主频最高72MHz用来做电源监控、状态机处理和协议上报绰绰有余。它有256KB Flash和64KB SRAM跑个小型嵌入式任务加一段故障记录缓冲区非常从容。更关键的是它属于STM32F1互联型产品集成了双CAN控制器和以太网MAC这在工业应用里是极大的优势。电源管理模块做出来不是孤立的它要把故障信息和运行状态上报给PLC或远程监控平台。STM32F107VC可以直接用CAN总线把电源事件发出去也可以挂以太网PHY做网络化监控。普通M0级别的芯片虽然便宜但外设资源有限后续扩展协议栈就会很吃力。另外STM32F107VC有多个12位ADC可以实现多通道同步采样。我在这个项目里同时采集输入电压、输出电压和IMON电流信号三个通道轮流采样不需要外扩ADC芯片加上DMA搬运数据CPU负担很低。3.2 引脚分配与外设配置引脚分配上我遵循一个原则控制信号和采样信号分开走线避免功率路径的噪声串扰到MCU侧。EN输出用PB0FLT中断输入用PB1这两个GPIO靠在一起方便布局。ADC采样通道选了PA0、PA1、PA2分别对应输入电压、输出电压和负载电流。UART1留作调试串口输出格式化好的电源状态信息。模拟采样电路做了两层处理。第一层是电阻分压把24V输入降到3.3V以内分压电阻同时兼顾输入阻抗不能选太大否则ADC采样误差会增大。第二层是RC低通滤波截止频率设在10kHz左右既能抑制电源开关噪声又不会滤掉有用的变化信号。所有进入MCU的模拟信号都加了钳位二极管防止异常高压损坏IO。FLT引脚的中断配置需要特别说一下。TPS259483的FLT是开漏输出正常时高电平故障时被拉低。我在STM32里配置成下降沿触发的外部中断并且开挂了内部上拉。由于实际环境中电源干扰可能导致FLT出现很窄的毛刺我在中断服务程序里做了一个软件去抖计数连续采样到3次低电平才确认故障有效。这个处理帮我避免了不少误报。3.3 监控逻辑与恢复策略实现电源状态监控本质上是一个有限状态机。我把系统的电源状态划分为OFF、PRECHARGE、RUN、FAULT、RETRY共五个状态。OFF状态下TPS259483的EN为低输出关闭。此时MCU会周期性检查是否有开机指令比如来自按键、上位机命令或上电默认开机选项。收到开机指令后进入PRECHARGE状态EN拉高芯片开始软启动输出压摆率受dV/dt电容控制。这时MCU监测VOUT引脚电压如果在一个超时时间内VOUT没有上升到设定阈值判定为启动失败或负载短路进入FAULT状态。RUN状态是正常工作状态MCU周期执行ADC采样、软件滤波、阈值判断和状态上报。如果FAULT引脚出现中断先记录FLT时间戳再通过读取IMON和输入输出电压判断可能的原因输入电压如果明显低于阈值可能是欠压电流异常大可能是过流VOUT瞬间掉电可能是输出短路。根据故障原因进入不同的恢复策略比如欠压可以在电压恢复后自动重启过流则先增加重启次数计数如果连续重启多次仍失败就进入锁定状态需要人工复位。恢复策略我通过一组可配置参数来实现包括最大重启次数、重启间隔时间、是否允许自动恢复等存储在Flash里。实际项目运营中客户最关心的是“故障后能不能自己恢复”而不是“故障了多少次”。所以我把自动恢复的间隔时间设成了可调的初始版本是3秒重试一次连续5次失败后锁定等待人工介入。4. 关键电路设计与PCB布局避坑指南4.1 原理图设计的几个关键点原理图设计阶段最容易忽略的是输入输出电容的选取。TPS259483的VIN和VOUT引脚旁边必须有足够的陶瓷电容来吸收瞬态能量。我在输入端放了一颗22uF/50V陶瓷电容加一颗100nF高频电容输出端同样配置。这里的陶瓷电容建议用X7R材质X5R在直流偏压下容量衰减严重如果按标称容量设计电容值实际效果会打折扣。EN引脚控制时序也要设计好。STM32的GPIO在上电瞬间默认是浮空状态如果TPS259483的EN引脚悬空有些芯片内部下拉会使芯片默认关闭但如果外部干扰耦合导致EN电平不确定输出就可能出现抖动。我在EN线上加了一个10kΩ下拉电阻确保MCU初始化之前芯片保持关闭状态等MCU程序跑起来后再主动拉高。FLT引脚的上拉电阻选择也要考虑电平匹配。如果MCU供电是3.3V上拉电阻就接到3.3V不能用5V上拉否则会通过开漏引脚往回灌电流。我实际遇到过FLT引脚因为上拉电平过高导致MCU引脚输入超压的问题后来统一把上拉电平改成MCU的VDD才解决。关于分压电阻和采样电阻的取值我用的是1%精度的0603金属膜电阻。温度系数要求不高的场合普通厚膜电阻也能用但如果设备工作环境超过60℃并且对阈值精度有要求还是建议选温漂系数50ppm以内的电阻。分压电阻阻值不宜过大控制在几十kΩ级别否则会受PCB漏电流影响。4.2 PCB布局的关键优先级PCB布局直接决定eFuse方案能否稳定工作。这块板子走了四层板顶层为主要功率路径第二层为完整地平面第三层为信号走线底层为辅助电源和低频信号。功率路径的布局优先级最高。TPS259483的VIN到VOUT之间的铜皮要短、要宽我铺了2mm宽的铜皮并且尽量不打过孔。WCSP这类小封装芯片的散热主要靠焊接在PCB上的焊盘和过孔阵列向下传导所以芯片底部对应的铜皮区域我打了9个0.3mm的过孔连接到第二层地平面这样可以把功率MOSFET产生的热量快速散开。实测满载工作半小时后芯片表面温度大约比环境温度高25℃在可接受范围内。采样走线和功率走线必须分开。ADC采样线远离VIN和VOUT的功率铜皮避免高频开关噪声通过寄生电容耦合进来。我在采样线路上加了串联电阻和并联电容组成的低通滤波器滤波器靠近芯片引脚放置采样信号在进入MCU之前先被清洗一遍。去耦电容的摆位也很有讲究。输入电容要紧贴TPS259483的VIN引脚输出电容要紧贴VOUT引脚中间不要穿过任何过孔。如果电容离引脚远了回路电感变大瞬态响应会变差。我曾经因为输出电容摆放太远在动态负载测试时看到VOUT出现了明显的振铃尖峰后来把电容挪近后波形干净了很多。5. 基于STM32的状态机固件与故障处理实现5.1 固件分层与核心模块固件我按模块化思路写分成了驱动层、业务层和存储层。驱动层负责GPIO、ADC、UART、外部中断的底层操作业务层实现电源状态机和故障策略存储层负责把故障记录写入Flash。代码结构清晰的好处是后续维护方便不必每次改逻辑都要翻底层寄存器。主程序流程很简单系统时钟初始化、GPIO初始化、ADC和DMA初始化、UART初始化、读取上次保存的故障记录、然后进入死循环执行状态机任务。状态机的刷新周期设定为10ms这个时间粒度对电源监控足够了。ADC采样则用DMA连续模式每次转换完成自动搬运到内存CPU在状态机里读取最新的平均结果。关键代码如下typedef enum { PWR_STATE_OFF 0, PWR_STATE_PRECHARGE, PWR_STATE_RUN, PWR_STATE_FAULT, PWR_STATE_RETRY } pwr_state_t; static pwr_state_t pwr_state PWR_STATE_OFF; static uint8_t fault_count 0; static uint8_t retry_limit 5; void pwr_control_task(void) { float v_in adc_read_volt(VIN_CH); float v_out adc_read_volt(VOUT_CH); float i_out adc_read_current(IMON_CH); switch (pwr_state) { case PWR_STATE_OFF: EN_LOW(); if (global_cmd_enable) { pwr_state PWR_STATE_PRECHARGE; } break; case PWR_STATE_PRECHARGE: EN_HIGH(); if (FLT_IS_DEASSERTED() v_out 0.9f * target_output_volt) { pwr_state PWR_STATE_RUN; fault_count 0; } else if (FLT_IS_ASSERTED()) { pwr_state PWR_STATE_FAULT; } break; case PWR_STATE_RUN: if (FLT_IS_ASSERTED()) { save_fault_record(v_in, v_out, i_out); pwr_state PWR_STATE_FAULT; } else { report_power_status(v_in, v_out, i_out); } break; case PWR_STATE_FAULT: EN_LOW(); if (fault_count retry_limit) { pwr_state PWR_STATE_OFF; } else { pwr_state PWR_STATE_RETRY; } break; case PWR_STATE_RETRY: HAL_Delay(3000); fault_count; pwr_state PWR_STATE_PRECHARGE; break; } }这段代码里值得注意的地方是PRECHARGE状态的条件判断。我不仅要看FLT引脚是否正常还要看VOUT实际电压是否爬升到位。如果只靠FLT引脚判断有些芯片在限流状态下FLT不一定立即翻转输出电压可能悬在半山腰后级电路会进入未定义状态。5.2 FLT外部中断的处理细节FLT中断服务程序里我尽量只做两件事置标志位和记录时间戳。真正的原因分析、状态切换和恢复策略全部放到主循环里执行。中断里如果做太多事情一方面会阻塞其他中断另一方面Flash写入这类耗时操作会拉长中断响应时间导致新的中断丢事件。void EXTI1_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_1)) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1); flt_pending_flag 1; flt_timestamp HAL_GetTick(); } }主循环里检测到flt_pending_flag后再执行故障处理流程。这个设计在生产测试中验证过即使FLT连续抖动多次也不会丢失事件因为标志位会在主循环确认后清除如果再次触发会重新置位。这里还有一个经验FLT引脚的中断优先级不要设成最高因为如果和其他关键通信中断抢优先级可能引起通信异常。我把FLT中断优先级放在中间档位保证基本功能的同时不干扰通信。5.3 软件层面容易踩的几个坑软件方面第一个坑是ADC采样的噪声问题。直接读ADC原始值做判断数值跳动非常剧烈特别是在电源开关瞬间采样值可能偏离真实值20%以上。我用了均值加中值滤波的组合先连续采样8次去掉最大最小值再对剩余6个值求平均。这样既滤除了尖峰脉冲又保留了真实的电压变化趋势。第二个坑是看门狗喂狗位置。我把喂狗放在电源状态机里结果发现当系统进入FAULT状态时如果固件在等待Flash保存故障记录IWDG可能会超时复位。后来把喂狗移到主循环最外层并加上超时保护逻辑确保任何子任务都不能阻塞主循环超过预设时间。第三个坑是Flash擦写次数。故障记录如果每次都写Flash很快就会耗尽Flash寿命。我在设计里把故障记录放在一小块环形缓冲区内并且采用“先擦后写、写入后校验”的方式实际跑下来写几万次才需要重新擦除完全满足工业设备的使用寿命要求。6. 实测调试记录与常见问题排查速查表6.1 我实测中遇到的三个典型问题第一个问题是启动时误触发过流保护。第一次调板时只要一上电TPS259483就立刻进入限流状态输出电压起不来。用示波器抓输入电流波形发现初始充电电流脉冲宽度有几十微秒幅度超过了设定的限流点。原因是后级DC-DC输入电容太大软启动压摆率设置太高导致瞬间充电电流过大。解决办法是把dV/dt电容加大把压摆率从2V/ms降到1V/ms左右同时在后级预留了预充电阻和继电器组合启动时先通过预充电阻给电容充电充满后再全功率接通。第二个问题是FLT引脚在电磁干扰下误触发。现场有电机启停时FLT引脚偶尔出现几十纳秒的低脉冲软去抖后仍然偶尔误报。后面用示波器排查发现干扰是从FLT引脚引线耦合进来的因为FLT开漏输出本身没有驱动能力对噪声很敏感。解决办法是在FLT引脚对地加了一个1nF电容和10kΩ上拉电阻组合成低通滤波器同时把FLT走线从功率走线旁边移开误报率降到了零。第三个问题是IMON电流采样不准确。IMON输出经过电阻转电压后直接进ADC采样值在轻载时偏大满载时又偏小。我一开始以为是电阻精度问题后来发现是PCB走线寄生电阻导致电流测量回路上产生了额外压降。重新布局把IMON的采样电阻紧挨着IC的GND引脚用开尔文连接方式走线问题就消失了。6.2 故障排查速查表这里整理了一份我实际调试时使用的排查表你可以直接拿去参考现象可能原因排查方法解决措施上电后输出完全没有EN未拉高、UVLO阈值设置过高、VIN没有真正到达芯片示波器测EN和VIN波形检查分压电阻数值调整UVLO分压比确认EN控制时序上电时出现限流打嗝dV/dt电容太小、负载输入电容过大抓VOUT上升波形和输入电流波形增大dV/dt电容降低启动压摆率带载后输出电压跌落限流点设置偏低、输入线压降过大测ILIM引脚电压和VIN波形重新计算ILIM电阻加大输入侧线径满载时芯片过热散热焊盘未有效接地、过孔数量不够红外热成像检查芯片温度增加底部过孔阵列加大铜皮面积FLT引脚频繁误触发开漏输出被噪声干扰、上拉电平不匹配示波器测FLT引脚波形加RC滤波缩短FLT走线长度ADC采样偏差大采样网络RC参数不合理、地线噪声对比高精度万用表测量值调整滤波电容采用单点接地6.3 测试方法建议硬件调试完成后不要急着交付测试环节必须做足。我用电子负载做了动态拉载测试负载在0.5A和2A之间以1kHz频率切换观察VOUT电压波动和FLT引脚行为。还做了输出短路测试用继电器控制短路通路分别测试了软短路和硬短路两种情况确认芯片都能在预期时间内切断输出。每个测试过程我都记录了完整的波形包括VIN、VOUT、FLT、EN四路信号。这些波形不仅用于当前调试也是后续产品认证和客户验收的重要材料。示波器探头一定要用短接地弹簧不要用长鳄鱼夹地线否则测到的全是地弹噪声容易把真正的信号淹没掉。我个人在实际操作中的体会是电源路径保护方案最难的不是电路本身而是参数设计要符合真实负载工况。TPS259483AYWPR的数据手册给出了大量典型波形但每个项目的负载特性都不一样照搬典型值是远远不够的。做这个项目时我前前后后改了三次dV/dt电容和两次ILIM电阻都是因为一开始照着手册例子设直到接上真实负载才发现不匹配。最后再分享一个小技巧调这类eFuse电路时建议把输入电压源设置为逐步上升而不是直接猛拉。先设置在10V输出缓慢升压观察芯片在各个电压点的状态确认UVLO和OVP分压网络动作符合预期后再把电压源调到目标值做满载测试。这样能把保护阈值验证和负载启动问题分开排查定位问题的速度会快很多。
返回列表