尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

eFuse+STM32实现工业电源路径保护设计实战

eFuse+STM32实现工业电源路径保护设计实战 去年在调试一台工业控制器的接口板时我因为没给电源入口加保护差点把一块价值不菲的逻辑板送走。板卡从背板热插拔的瞬间面板电源指示灯猛闪两下紧接着板载5V电源走线直接冒烟。拆开查了半天问题出在热插拔瞬间的浪涌电流把前面板的12V电源轨拉垮继而导致后级逻辑电源反灌。那次之后我在所有可能热插拔、带长线供电或容性负载较大的板卡上都加了一级电源路径保护。这篇文章要讲的正是我目前在实际项目里使用的一套组合用 TPS259483AYWPR 做功率路径上的电子熔断器用 STM32F439ZG 做监控和策略大脑用来保护嵌入式和工业应用中的电源入口。如果你在做的板卡有热插拔、过压欠压、过流短路或者电源倒灌方面的担心这篇文章应该能给你一个完整可落地的参考。这套方案适合做嵌入式硬件、电源设计、STM32开发的工程师也适合刚入行但想理解电源路径保护到底在保护什么的初学者。我会从需求拆解、硬件设计、软件实现一直讲到实测波形和调试时踩过的坑。1. 需求拆解与整体方案设计1.1 电源路径保护到底要解决什么问题很多工程师对电源保护的理解还停留在加个保险丝、加个TVS管的阶段。等你真做过几个工业项目就会知道传统保护方案在复杂场景下远远不够。工业板卡常见的电源威胁有四类。第一类是热插拔浪涌板卡插入背板时输入端的旁路电容瞬间充电充电电流可达几十安培直接把电源轨拉垮。第二类是过流和短路负载老化、接线错误、后级器件击穿都会导致电流异常传统保险丝熔断速度慢而且在短路瞬间已经足够烧坏PCB铜箔。第三类是过压和欠压工业现场电源波动大稳压器输出异常、热插拔时的振铃、感性负载关断的反电动势都可能让输入电压超出正常范围。第四类是反向倒灌当输出端电压高于输入端时电流会从输出端倒流回输入轻则干扰其他板卡重则烧毁电源模块。传统保险丝解决不了全部问题。保险丝是一次性的保护动作后需要人工更换而且它无法区分是瞬间毛刺还是真实故障。分立式的MOS管保护电路虽然可以自恢复但阈值、响应时间、软启动斜率都很难做准确调试周期长量产一致性差。1.2 方案架构eFuse做硬保护MCU做软策略TPS259483AYWPR是TI的TPS25948x系列电子熔断器它内部集成了功率MOSFET、电流采样、比较器和驱动逻辑可以看成一颗智能保险丝。它能在纳秒到微秒级别响应的硬件层面完成过流、过压、欠压、短路、反向电流保护还支持软启动斜率配置避免热插拔时的浪涌冲击。硬件保护的速度是软件永远比不了的所以功率路径上的硬保护必须下放到这颗芯片上。STM32F439ZG在这里不是去替代eFuse的保护功能它的角色是策略大脑。它通过GPIO监控FLT故障输出、PGOOD电源良好信号通过ADC采集输出电压和负载电流通过EN引脚控制电源路径的使能。当故障发生时MCU记录故障日志、决定是否自动恢复、尝试几次恢复后是否需要彻底锁死报警、怎么把状态上报给上位机。这样分工的好处是硬保护永远快速可靠软策略灵活可调两者各司其职。整体的信号流很清晰12V电源从输入端进来经过TPS259483AYWPR的功率路径送到负载eFuse检测到异常时自行切断路径同时把FLT信号拉低通知MCUMCU收到中断后读取当前状态执行恢复策略并把状态记录在内部Flash里用于后续分析。2. 硬件设计TPS259483AYWPR为核心的电源路径保护电路2.1 功率预算和关键引脚规划我这次设计的是工业控制器接口板的电源入口部分输入是背板12V最大连续负载3A。选择TPS259483AYWPR是因为它的封装和电流规格适合这个场景同时具备我需要的OVLO、UVLO、ILIM、dVdT这些可配置引脚。引脚规划是整个硬件设计的第一步。建议先列一张表格把每个引脚的连接关系定下来再开始画原理图这能避免后期改板。引脚/网络方向功能连接对象VIN输入功率输入12V电源入口、输入陶瓷电容VOUT输出功率输出输出电容、负载EN输入使能控制STM32 GPIO兼容3.3V电平FLT开漏输出故障指示低有效上拉到3.3V接STM32 EXTI引脚PGOOD开漏输出输出达到阈值指示上拉至3.3V接STM32 GPIOOVLO模拟输入过压检测阈值设置分压电阻网络到VINUVLO模拟输入欠压检测阈值设置分压电阻网络到VINILIM模拟输入过流限值设置电阻到GND并联小电容dVdT模拟输入软启动时间设置电容到GND这里有个容易被忽略的细节FLT和PGOOD都是开漏输出必须加上拉电阻。上拉电阻的一端接3.3V而不是12V这样才能和STM32F439ZG的GPIO电平直接对接。上拉电阻阻值我习惯用10kΩ如果信号线上有强干扰环境会换成4.7kΩ增强下拉能力。2.2 过压与欠压阈值计算UVLO和OVLO引脚的电压来自VIN的分压电阻网络内部比较器会把这个电压和基准电压比较。不同后缀的TPS25948x内部基准电压可能略有差异我建议打开数据手册确认。这里以手册基准电压VREF来推导整个计算方式是一样的。假设我需要欠压保护点设在8.5V过压保护点设在16V。电阻分压关系是[ V_{th} V_{REF} \times \frac{R_{up} R_{down}}{R_{down}} ]其中 (R_{up}) 是引脚连接到VIN的上分压电阻(R_{down}) 是引脚连接到GND的下分压电阻。如果 (R_{down}) 固定为10kΩ那么[ R_{up} R_{down} \times (\frac{V_{th}}{V_{REF}} - 1) ]把目标阈值代入即可。需要注意UVLO和OVLO是两个独立引脚需要分别计算两组分压电阻。我通常在原理图上给上分压电阻设计成一个固定精密电阻加一个可调电阻串联的形式这样在实测时可以微调不用重新打板。2.3 限流设置ILIM电阻的选择ILIM引脚通过外部电阻设定过流保护阈值。TI官方常用的做法是查数据手册里的ILIM引脚电流关系式或者设计工具。我习惯直接用TI官网提供的eFuse设计计算器填入目标限流值工具会直接给出推荐电阻同时还会列出最小、典型的限流范围用来确认设计余量。我这次的负载最大3A限流值设定在4.5A左右。选择4.5A而不是3A是因为要给启动瞬态和负载波动留出余量。如果把限流值卡得太死正常负载的电流尖峰就可能触发保护导致系统频繁掉电。ILIM引脚旁边需要放一个1nF左右的小电容到GND用于滤除高频噪声。这个电容不能省否则在强电磁干扰环境下ILIM引脚上的毛刺会引发误触发。我遇到过两次误触发最后都是因为PCB布局时ILIM走线太长感应了开关电源的噪声加了小电容就好了。2.4 软启动配置与输出电容搭配软启动是TPS259483的核心价值之一。dVdT引脚外接电容的大小决定了输出端电压从0爬升到目标电压的速度。电容越大启动时间越长浪涌电流越小。工业板卡热插拔场景下我一般把启动时间设置在10ms到15ms之间这样输入端电容充电电流可以被限制在比较合理的范围。输出电容的选择也需要配合软启动。我在这块板的输出端放了220uF陶瓷电容主要给负载提供瞬时能量。陶瓷电容ESR很低高频特性好适合做负载瞬态支撑。搭配软启动后热插拔瞬间的冲击电流从无保护时的十几安培降到了限流值以内效果非常明显。需要特别提醒的是dVdT电容不要选得过大启动时间过长会让系统上电变得很慢影响一些对时序有要求的应用。也不要选太小的电容否则软启动几乎不起作用等于没有保护。十几毫秒是一个比较均衡的经验值。2.5 STM32F439ZG接口电路设计STM32F439ZG的工作电压是3.3VTPS259483工作在12V电源域接口电路需要注意电平匹配。FLT和PGOOD都是开漏输出通过10kΩ上拉到3.3V后可以直接接STM32的GPIO。FLT建议接到带有EXTI中断能力的引脚这样故障发生时MCU能立刻响应。我把FLT接到了PA0配置成下降沿触发中断。EN引脚用于控制使能。STM32用推挽输出的GPIO直接驱动即可。判断EN是高有效还是低有效要看你手上芯片的具体版本数据手册里写得很清楚。我在代码里用宏定义封装了EN的有效电平比如EN_ASSERT和EN_DEASSERT万一换芯片版本只需要改两个宏不用改逻辑代码。模拟量采集部分STM32F439ZG自带3个12位ADC采样率足够高。我用ADC采集输出电压用电流采样电阻加运放采集负载电流电流采样信号经过RC滤波后进MCU的ADC引脚。采样电阻放在低边也就是负载和GND之间这样可以避免高压直接进入MCU的采样回路。3. 软件实现STM32F439ZG侧的状态管理与保护策略3.1 软件状态机设计硬件保护是快软件策略是稳。我在这块板上实现了一个简单但好用的电源路径状态机包含五个状态IDLE、STARTUP、RUNNING、FAULT、RECOVERY。IDLE状态是系统上电后的初始状态此时EN引脚是去使能的电源路径关闭。收到启动命令后进入STARTUP状态MCU置位EN然后等待PGOOD信号变为有效。PGOOD有效后进入RUNNING状态系统正常运行。如果FLT信号拉低进入FAULT状态MCU记录故障类型和时间戳尝试按预设计数恢复。恢复尝试达到上限后进入RECOVERY状态MCU选择是否自动重启或者保持锁死等待人工干预或上位机命令。这个状态机的核心思想是eFuse做了一次硬保护但MCU知道这次保护是偶发毛刺还是真实故障。如果是偶发毛刺比如电机启动瞬间的电流尖峰MCU可以尝试恢复如果连续多次故障必须锁死并且报警避免反复重启损坏硬件。3.2 GPIO、EXTI和ADC配置示例软件部分基于STM32 HAL库。GPIO和中断的初始化代码大致如下#define EN_PORT GPIOB #define EN_PIN GPIO_PIN_0 #define FLT_PORT GPIOA #define FLT_PIN GPIO_PIN_0 #define PGOOD_PORT GPIOA #define PGOOD_PIN GPIO_PIN_1 /* 根据具体芯片版本调整有效电平 */ #define EN_ASSERT GPIO_PIN_RESET #define EN_DEASSERT GPIO_PIN_SET static void PowerPath_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* FLT: 开漏输出下降沿中断 */ GPIO_InitStruct.Pin FLT_PIN; GPIO_InitStruct.Mode GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(FLT_PORT, GPIO_InitStruct); /* PGOOD: 输入上升沿表示输出电源良好 */ GPIO_InitStruct.Pin PGOOD_PIN; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(PGOOD_PORT, GPIO_InitStruct); /* EN: 推挽输出 */ GPIO_InitStruct.Pin EN_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(EN_PORT, GPIO_InitStruct); HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_GPIO_WritePin(EN_PORT, EN_PIN, EN_DEASSERT); }中断回调处理故障事件static volatile uint8_t power_fault_flag 0; static volatile uint32_t fault_timestamp 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin FLT_PIN) { power_fault_flag 1; fault_timestamp HAL_GetTick(); HAL_GPIO_WritePin(EN_PORT, EN_PIN, EN_DEASSERT); } }主循环里检查故障标志结合状态机做恢复策略。ADC采样部分我直接用了轮询方式采样完成做多次平均值static uint16_t adc_read_average(uint32_t channel, uint8_t times) { ADC_ChannelConfTypeDef sConfig {0}; uint32_t sum 0; uint16_t raw 0; sConfig.Channel channel; sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLETIME_84CYCLES; HAL_ADC_ConfigChannel(hadc1, sConfig); for (uint8_t i 0; i times; i) { HAL_ADC_Start(hadc1); if (HAL_ADC_PollForConversion(hadc1, 10) HAL_OK) { sum HAL_ADC_GetValue(hadc1); } HAL_ADC_Stop(hadc1); } return sum / times; }3.3 保护联动与自动恢复策略真正让这套方案变聪明的是MCU端的恢复策略。我的策略是这样的收到FLT中断后立即关断EN记录故障次数。如果故障次数小于3次延时500ms后重新使能电源路径。如果连续3次都故障就不再自动恢复通过UART把故障日志发给上位机同时点亮告警LED。自动恢复的时间间隔不是固定的。第一次恢复等待500ms第二次等待1秒第三次等待3秒指数退避的方式可以避免故障在短时间内反复冲击电路。每次恢复后如果正常运行时间超过10秒就把故障计数清零算作一次偶发保护。这里有一个重要经验不要对FLT信号做太长的软件消抖。eFuse的FLT是硬件快速保护的结果延时消抖会把快速保护变成慢速保护失去意义。正确的做法是中断里立刻响应恢复策略里的延时放在重新使能之前而不是放在FLT信号的判断上。看门狗也建议加上。STM32F439ZG内部有独立看门狗主循环里喂狗。万一程序跑飞看门狗复位后会自动重新进入状态机电源路径会按照新的启动流程重新上电。这在无人值守的工业设备里非常重要。4. 实测验证与波形分析4.1 热插拔软启动实测板卡打样回来后我首先测的是热插拔场景。用电子负载把输出固定为3A示波器探头夹在输入端电流检测电阻和VOUT测试点上然后手动把板卡插入背板。未加TPS259483时插入瞬间的电流尖峰能冲到十几安培电源轨被拉出一个明显的跌落。加上TPS259483并把dVdT电容设定在约15ms启动时间后VOUT电压从0到12V是一个近似线性的斜坡输入电流被限制在4.5A以内。这个结果比我预期的还好因为软启动把电容充电过程从瞬时冲击变成了匀速注入输入端稳压器的压力小很多。实测时要注意示波器探头的地线夹很容易拾取噪声最好用弹簧地针或者把地线夹缩短到最短否则波形上会叠加很多振铃容易误判。4.2 过流保护与短路测试过流保护测试用电子负载从3A开始逐步往上加。当负载电流超过ILIM设定的4.5A时TPS259483进入限流模式输出电压开始下降FLT信号被拉低。观察电流和电压的关系可以看出限流点的曲线比较平滑没有明显过冲。短路测试更直接在输出端用一个MOS管做开关直接短路到GND。示波器观察VOUT正常时12V短路瞬间电压迅速下降电流被限流FLT同时拉低MCU在中断里记录到故障时间戳。从短路发生到FLT拉低整个过程非常快这是软件完全做不到的保护速度。短路测试有一点必须提醒不要在实验室里直接拿鳄鱼夹线去碰输出端那会拉起很大的电弧容易损坏器件。最好做一个带开关的短路测试治具通过MOS管或继电器控制短路动作保证每次实验的一致性。4.3 过压与欠压触发验证用可编程电源缓慢调节VIN确认硬件保护点在预期范围。我从12V开始每次按0.1V步进往上升压当VIN接近设定的16V过压点时VOUT关闭FLT拉低。保持可编程电源在16.5V板卡不会自动恢复直到我把输入调回12V以下并重新使能EN。欠压测试类似。VIN从12V缓慢下降到8.5V附近时VOUT关闭。这个保护功能在电池供电的嵌入式设备里尤其有用可以防止电池过放导致后级电路工作在不正常状态。4.4 反向电流保护验证反向电流保护是很多工程师容易忽略的功能。我做了这样一个实验系统正常运行VIN是12V然后用外部电源在VOUT端注入一个14V的电压模拟输出端被外部设备反灌的情况。TPS259483检测到VOUT高于VIN后内部功率MOS管被关断VOUT端的高压无法倒灌回VIN端的电路。这个功能在工业设备互联时特别重要。两个设备共用电源总线如果一个设备的输出电容先放电完另一个设备刚上电电压高的那一方会通过电源总线给电压低的一方充电产生很大的电流。没有反向保护的情况下会干扰甚至损坏正在启动的设备。5. 调试中的高频坑与经验总结5.1 常见故障排查速查表这里整理了我调这块板子时遇到的各种问题、原因和解决办法。现象可能原因处理方式FLT一直为低上电后无法启动EN电平配置错误或UVLO阈值设置高于实际输入确认EN有效电平检查UVLO分压电阻限流点明显高于设置值ILIM引脚走线过长引入噪声或电阻精度不够缩短走线ILIM引脚加1nF电容到GND上电瞬间误触发保护dVdT电容太小时启动浪涌过大增大dVdT电容延长软启动时间输出端带载时电压跌落输出电容太小负载瞬态响应不足增加输出陶瓷电容容量检查输入线压降示波器测量波形有明显振铃探头地线太长形成测量环路使用弹簧地针缩短地线夹系统运行一段时间后FLT偶尔触发负载端有间歇性过流或供电电压波动查看MCU记录的故障时间戳比对负载现象恢复后系统无法运行RECOVERY策略里恢复次数用尽被锁死长按按键或上位机命令清除故障锁存5.2 PCB布局与布线经验eFuse的PCB布局直接决定保护电路能不能正常工作。我的布局经验是输入电容、芯片、输出电容放在一条直线上。VIN引脚旁放一个小的100nF高频电容还要放一个大容量的电解电容稳定输入电压。VOUT引脚附近放输出电容电容回流的GND要直接回到芯片底部的散热焊盘。ILIM、dVdT这些配置引脚旁边的小电容和电阻必须靠近芯片引脚放置走线要短粗。这些引脚的测试电压是内部产生的走线过长或者受到开关节点干扰会直接影响保护阈值。芯片底部的散热焊盘要打过孔到内层GND增强导热。连续3A电流的导通损耗不可忽略热量需要通过PCB铜皮传导出去。我在这块板上给芯片底部打了一排过孔实测温升比没打孔时低了近10℃。布局上还有一个禁忌不要在芯片底部的散热焊盘下方走敏感信号线。过孔和焊盘会引入噪声破坏信号完整性。同时输入输出大电流路径要远离FLT、PGOOD这些小信号线。5.3 热设计与降额考虑eFuse内部的功率MOS有导通电阻大电流连续工作时会产生热量。以我现在这套3A负载为例导通损耗按几十毫欧量级粗算P I²R大约在零点几瓦。这个功耗在65℃环境温度下必须认真考虑降额设计。热设计方面我做了三件事。第一确认芯片的允许工作结温范围留出足够余量结温尽量不要超过额定值的80%。第二PCB上给芯片预留散热铜皮增大铜皮面积可以有效降低热阻。第三老化测试时用热电偶贴在芯片外壳上实测温度确认与计算值一致。工业设备可能装在没有风道的密闭机箱里连续满载运行的温升比实验室环境更严重这一步不能省。5.4 选型对比与替代思路如果你觉得TPS259483Y不适合你的应用市面上还有其他选择。我整理了一个简化的对比方案优点缺点适用场景TPS25948x系列eFuse集成度最高保护种类全响应快支持软启动配置电流规格受限于封装高压型号少12V~18V工业板卡、热插拔、电池供电分立MOS管驱动比较器成本低电流可以做得很大设计周期长保护阈值难控制一致性差大批量、低成本、单点保护场景浪涌抑制器适合高压环境能扛浪涌集成度不如eFuse需要外部MOS汽车、工业总线等高浪涌场景具体选择要看系统输入电压、最大连续电流、保护类型要求和成本预算。我当前设计里12V/3A的工况用TPS259483正好合适。还有一点选型经验测试前先明确你手里的芯片是哪个版本。TPS25948x系列有很多后缀不同后缀的EN极性、默认上下拉、内部基准可能不同。看数据手册时重点看订购信息那张表确认后缀含义最好用同一批次的库存做测试。结尾这套TPS259483AYWPR加STM32F439ZG的方案我目前已经应用在两个产品上跑了小半年的老化测试电源路径没有再成为返修高发点。我自己最深的体会是硬件保护必须快软件策略必须稳两者要配合而不是互相替代。eFuse解决的是毫秒甚至微秒级的功率路径安全MCU解决的是什么时候恢复、怎么上报、怎么判断故障类型的决策问题。把这两层分开设计整个系统会清晰很多。最后分享一个个人习惯拿到任何一颗新的eFuse先别急着算电阻画原理图先搭一个最小测试板用可编程电源从0V慢慢扫到目标电压观察启动曲线和保护动作是否干净。这个动作只要半小时但能帮你避免后面至少一天的调试时间。电源路径保护这件事越早验证后面越省心。
返回列表