ARTICLE DETAIL

资讯详情

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

STM32与eFuse实现工业电源路径可编程保护的设计实践

STM32与eFuse实现工业电源路径可编程保护的设计实践 一块带着多路传感器供电的工业主控板车间操作员把 24V 接线端子误插到 36V 电源上整板烧毁。这是我早年做嵌入式项目时真实遇到过的事。后来重新设计产品时我在 12V 母线进入系统负载前加了一颗 TPS259483AYWPR 电子保险丝让 STM32F722VE 这颗主控实时盯着电源路径上的电流镜像信号和故障输出整个电源路径保护终于从烧毁后维修变成了可限制、可监测、可恢复的受控环节。这篇文章就是我当时从选型、原理图、固件到实测的完整记录适合正在用 STM32 做工业板卡、想给电源路径加一道可编程保护的朋友参考。1. 为什么要在工业环境里专门保护一路电源路径1.1 工业现场电源总线的真实威胁工业现场那根 24V 或者 12V 电源总线环境远比实验室恶劣。感性负载关断时会在母线上叠加反向尖峰同一条母线上变频器启动会把噪声灌进来更常见的是维护工人误接线、接插件氧化松动或者后端某个继电器线圈短路。如果只是给单片机供电一颗 LDO 也许能扛住但一旦后面挂的是电机驱动、无线模块、多路传感器任何一路故障都可能让整块板子的母线电压瞬间跌穿把所有正常工作的电路一起拉下水。传统方案不是不能用只是它们几乎没有信息输出。玻璃管保险丝动作之后你只能拿万用表去量通断故障原因永远是个谜自恢复保险丝虽然能复位但动作电流随温度漂移明显精度基本靠猜。更重要的问题是当系统里已经有一块 STM32F722VE 这样的主控电源路径的状态却完全没有接进来这相当于家里装了空气开关却没人知道是哪个房间跳闸了。设备坏了之后靠客户报修、靠工程师现场猜成本高得离谱。1.2 eFuse 和主控的互补分工TPS259483AYWPR 这类集成的电子保险丝把传统分立方案里的功率开关、限流比较器、过压保护、欠压锁定、热关断全部集成到一颗芯片里。它能做的硬保护包括限制浪涌电流、精确限流、超压切断、反向阻断、过热关断。这些动作都在微秒到毫秒级完成不需要软件参与这是它最可靠的地方。但硬件保护只能做切做不了判断和恢复。STM32F722VE 在这里负责的是感知、记录和策略决策通过故障引脚知道芯片动作了通过电流监视输出知道负载电流是多少然后用固件决定是立即重启、延时重试、还是锁死等人来修。硬件负责物理层的快速保护软件负责策略层的智能管理这套组合的最大价值就是把保护这件事从单点动作变成了一个闭环系统。2. TPS259483AYWPR 关键特性与选型逻辑2.1 为什么这个系列的 eFuse 适合嵌入式路径TPS25948x 系列是 TI 电子保险丝家族里覆盖面很广的一档典型输入范围能够覆盖工业常用的 12V 和 24V 母线内部功率管导通电阻低压降远小于传统防反接二极管。对一块额定电流在 1A 到 5A 之间的工业主控板来说这正是它擅长的区间。相比用 MOSFET、采样电阻、比较器自己搭一个限流电路集成方案把几十个元件压缩到一颗芯片加两三颗电阻PCB 面积、寄生电感和设计调试工作量都会明显下降。还有一点容易被忽略这类芯片的信号接口非常嵌入式友好。故障输出通常是一根开漏引脚电平变化直接就能触发 MCU 的外部中断电流监视输出是一个和负载电流成比例的镜像电流外部一颗电阻就能转成 ADC 可采样的电压。我这种习惯了物理量变电平、电平变数值思路的工程师改起方案来几乎没什么学习成本。提醒一下本篇文章里不给出具体电气参数的绝对数值因为每一颗芯片的限流电阻映射、过压基准和使能阈值都必须以你手里那颗 TPS259483 的官方数据手册为准。下面所有计算逻辑用的是该系列 eFuse 的通用做法具体数值请按手册表格代入。2.2 芯片和 STM32F722VE 的接口怎么分以我的实际项目为例TPS259483 的故障输出接 STM32F722VE 的 EXTI 引脚电流监视输出接一路 ADC 通道EN 引脚由 GPIO 控制。在调试阶段我会直接把 EN 拉高让 eFuse 独立工作量产版本则必须由主控统一控制保证上电后由软件决策什么时候才给负载供电。这里有个必须想清楚的细节如果把故障输出只当成普通 GPIO 轮询MCU 在死循环或者被中断卡住的时候会错过关键故障沿。所以我在固件里用了 EXTI 外部中断而不是轮询。另外故障信号的默认电平逻辑要在原理图阶段就确认好因为不同板子上故障输出的上拉电阻取值会影响沿的陡峭度线长了要选更小的上拉电阻。主控选 STM32F722VE 的理由很实际它的 512KB Flash 和 256KB RAM 足够同时跑网络协议栈、文件系统和多路控制算法三个 12 位 ADC 可以同时采集多路电源参数。虽然单纯做电源保护用不到 216MHz 的 Cortex-M7 算力但板子上本来就要用这颗芯片把电源路径保护作为一个模块挂进去是最省事也最合理的架构。3. 硬件的每个关键环节怎么搭3.1 电源树架构和后级摆放顺序画原理图之前先把电源树想清楚。我的项目外部输入是 24V经过隔离 DCDC 变成 12V再进入 TPS259483输出到继电器组和无线模块同时 12V 再降压出 5V给 STM32F722VE 和逻辑电路供电。这里有意把 eFuse 放在 DCDC 之后而不是 24V 输入口原因是输入口需要优先解决浪涌和 EMIDCDC 本身已经扛了一轮电压波动eFuse 放在 12V 这一级主要是为了把后级开关性负载的短路和故障隔离开不连累前级 DCDC。还有一个布局层面的铁律STM32F722VE 的供电绝对不要从 TPS259483 的被保护输出端取。如果后端负载短路eFuse 一旦关断输出端电压消失MCU 自己也会掉电那它拿什么上报故障、拿什么记录日志第一版设计我就是把主控供电挂在保护输出后面后来做短路实验时 MCU 直接黑屏才意识到这个错误。3.2 三个最容易被算错的关键电阻原理图环节最容易翻车的是限流电阻、过压阈值电阻、使能阈值电阻这三组。先说限流电阻。TPS25948x 系列通常用 R_ILIM 设定过流保护点数据手册会给出限流点和阻值的对应关系表。我的目标负载额定电流是 2A限流点选 2.7A 左右按手册查表得到阻值后又留了 20% 左右的裕量。温度升高时内部限流比较器的精度会偏移千万别把限流点卡在额定电流的 105%否则夏天一热就频繁跳闸。再看过压阈值。用两颗电阻分压连接到 OVP 引脚目标设为 15.5V因为 12V 母线上一般性的瞬态过压约在 15V 以下。分压比按芯片内部过压基准计算同时我在分压电阻上并联了一个 1nF 小电容滤掉高频毛刺防止误触发。最后是 EN/UVLO 引脚用电阻分压设置最低工作电压我设为 9V低于 9V 直接锁定避免后级在后端电压不稳时反复重启。三个电阻的计算逻辑可以用一句话总结先定保护阈值再算分压最后按器件精度和温度范围留裕量。这套思路在所有带使能和阈值引脚的电源芯片上都通用。3.3 STM32F722VE 侧接口电路要点引脚分配上我用 PA0 做故障信号输入EXTI0 中断PA4 做 ADC 通道采样电流监视电压PD3 做 EN 控制。PA0 必须配置成外部上拉输入因为故障引脚是开漏输出上拉电阻选 10kΩ 还是 4.7kΩ要结合板卡内部走线长度来定走线长选 4.7kΩ保证沿更陡。如果现场电磁干扰很强可以在 PA0 对地并联一个 1nF 电容但这时候故障沿会变缓需要实测确认不会漏掉短脉冲。ADC 链路这里STM32F722VE 的 12 位 ADC 对 VDDA 的纹波比较敏感。我把 VDDA 用磁珠和 10μF 电容独立滤波电流监视信号先串一个小电阻接地转成电压再并一个 100nF 电容组成低通滤波。这个滤波器的截止频率大约 1kH 就够用了因为电源保护关心的不是高频信号而是几十毫秒级别的过流趋势。还有一点很多人容易忽略IMON 的采样地线必须单独走线到 MCU 的模拟地绝对不能和继电器、电机驱动的大电流地共享。第一版板子我就是没注意这一点导致 ADC 在小电流时读数全是噪声简直没法看。4. 固件让 MCU 真正接管这路电源的策略4.1 模块化代码结构怎么切我习惯把电源路径保护写成独立的 power_path 模块头文件里只暴露初始化函数、周期任务函数、事件回调函数三个接口。内部维护一个状态机、一组成阀值配置、一个故障计数结构。业务代码不需要关心 eFuse 的引脚细节只需要在初始化时调用power_path_init()在 1kHz 定时器里调用power_path_periodic()当状态变化时回调一个power_path_event()给上层。这种分层方式最大的好处是方便移植。同一套代码换一颗 eFuse只需改底层引脚映射和阈值配置换一块主控板业务层完全不用动。用 HAL 库还是 LL 库都随意我工程上一般用 LL 库因为电源保护代码要快速响应LL 的代码更直接没有多余的抽象层。4.2 初始化顺序和软启动时序初始化顺序写出一个固定模板void power_path_init(void) { gpio_fault_input_init(); // PA0 EXTI上升沿/下降沿都触发 gpio_en_output_init(); // PD3 输出默认拉低确保 eFuse 关断 adc_imon_init(); // PA4 扫描模式 DMA 环形缓冲区 bool fault_flag gpio_read_fault_pin(); if (fault_flag) { power_path_set_state(POWER_PATH_FAULT); } else { power_path_set_state(POWER_PATH_OFF); } }上电后先保持 EN 为低等 MCU 自身系统稳定再调用power_path_enable()拉高 EN。拉高之后 eFuse 会按照内部软启动曲线给负载电容充电IMON 电压会从零逐渐爬升到目标值。这时候固件千万不要把这个斜坡误判成过流否则一上电就误报警。我的做法是EN 拉高后先等 50 毫秒再开始做限流判定这个启动窗口根据软启动时间和负载电容大小调整。4.3 周期监控和故障响应状态机周期任务在 1kHz 定时中断里执行读取 DMA 缓冲区中的 IMON 平均值和两个阈值比较。一个叫软告警阈值设成额定电流的 80%超过就累计时间并记录日志一个叫硬阈值设成额定电流的 110%超过就主动通过 EN 关断防止故障状态持续太久。注意 eFuse 自身的过流保护阈值比软硬阈值都高这里 MCU 做的是主动策略层面的保护两者有冗余但不冲突。当 /FLT 引脚触发 EXTI 中断时说明芯片已经自己动作了。此时固件第一件事不是清中断、重新使能而是立刻读取当前的输入电压和 IMON 值根据这些信息判断芯片动作原因。把这些信息存进一个 RAM 结构体加上时间戳然后进入恢复决策逻辑。伪码大概是这样void exti_fault_isr(void) { record_fault_snapshot(); power_path_set_state(POWER_PATH_FAULT); } void power_path_periodic(void) { uint16_t imon adc_get_average(); if (imon HARD_THRESHOLD) { power_path_disable(); record_fault_manual(FAULT_OVER_CURRENT_SOFT); } if (power_path_state POWER_PATH_FAULT) { handle_recovery_policy(); } }状态机我分成四个状态OFF、STARTING、ON、FAULT。OFF 到 STARTING 需要软件调用 enabled 指令STARTING 持续 50 毫秒后进入 ON任何硬件故障或软件硬阈值触发都会进 FAULT在 FAULT 状态下固件按策略决定是延时重试还是直接锁定。4.4 故障记录和恢复策略工业现场需要的是一次瞬时扰动能自动恢复反复故障要人工干预。我的做法是维护一个滑动窗口记录最近 10 分钟内的故障次数。如果单次故障后重新上电能正常工作窗口清零如果 10 分钟内故障次数超过 3 次说明后端大概率有真实病态进入 LOCKED 状态板载 LED 报错只有人工按键或者上位机指令才能解除。同时每次故障都会把故障类型、时间戳、IMON 峰值写入芯片内部 Flash 的一个日志扇区。掉电不丢失现场回来后可以直接解析数据看趋势。这个功能在客户那边特别好用很多时候对方一句不知道怎么回事就跳闸了我拉出日志就能定位到是凌晨某次电压跌落引起的过流。5. 实测、调试和避坑记录5.1 我踩过的四个坑第一个坑是 IMON 链路噪声。打样时我把采样电阻放得离功率电感太近结果负载电流为零时 ADC 读数就有 50mV 的跳变折算成电流就是 200mA 的虚假值。后来把采样点改到芯片输出引脚附近并且单独走线到模拟地噪声才压到 5mV 以内。第二个坑是 EN 上拉电阻。最开始设计想让 eFuse 默认导通把 EN 经 10kΩ 上拉到 VINMCU 再通过 GPIO 下拉。结果上电瞬间 MCU 的 I/O 还没初始化引脚呈现高阻eFuse 按内部软启动就给负载充电了。负载电容大的时候涌入电流照样触发了硬件限流。改成MCU 输出高电平才导通并用 100kΩ 下拉保证默认关断之后问题才消失。第三个坑是故障信号误报。故障引脚是开漏输出MCU 的 PA0 如果没配置内部上拉芯片正常工作时引脚电平不确定EXTI 会随机触发。这个属于 GPIO 配置级别的低级错误但排查起来很容易怀疑芯片坏了。第四个坑比较隐蔽我把 eFuse 放在了 DCDC 后端大容量电解电容的后面上电瞬间前级给一堆电容充电启动电流全部叠加到 eFuse 的限流点上偶尔就触发一次过流。解决办法是调整软启动时间或者把一部分输入电容挪到 eFuse 输出侧根据实际允许的浪涌电流做取舍。5.2 常见问题速查表故障现象可能原因定位方法解决手段上电后没有输出EN 阈值设错、后端负载短路示波器量 VIN、EN、VOUT调整 EN 分压电阻排除后端短路正常工作时随机跳闸输入过压尖峰、EN 毛刺示波器抓 VIN 尖峰输入加 TVSEN 加 RC 滤波IMON 读数为零或为负采样电阻接地不良、ADC 通道映射错误万用表量采样点电压复查原理图和 CubeMX 配置故障后无法恢复锁存模式配置、固件进入 LOCKED检查锁存引脚电平查故障日志按策略配置自动重试或人工解锁负载一启动就跳闸浪涌电流超过限流点看启动波形计算负载电容充电电流增大软启动电容或提高限流点5.3 示波器波形和短路测试怎么测调试阶段我重点盯四个信号VIN、VOUT、IMON 电压、/FLT。用一截跳线做短路注入测试时必须控制占空比不能连续短路否则设备本身会被热量堆死。我通常会做三次单次短路每次间隔 10 秒确认 VOUT 下降沿干净、没有二次过冲同时记录 /FLT 的脉冲宽度验证芯片动作时间和数据手册一致。短路测试通过之后再测试准确度接一个 1A 电子负载测 IMON 电压反推 ADC 分辨率下的量化误差。我的板子最终在小电流时误差在 3% 以内大电流时约 1.5%。对于电源保护场景这个精度足够判断趋势了。6. 一些经验心得与后续扩展6.1 把电源路径当成一个受控对象来设计这套 TPS259483 加 STM32F722VE 的组合用到现在最让我满意的不是某一项参数有多强而是它改变了整个系统的设计方式。电源路径不再是一个只能靠万用表去猜的哑巴模块而是一个有状态、有反馈、能被软件策略干预的受控对象。一台设备如果能在发生故障时自己记录现场、尝试恢复恢复不了再把自己安全地锁住那它对用户来说就是省心的对售后工程师来说就是可诊断的。6.2 后续可以怎么扩展后续我把同样的框架扩展到了同一块板上另外两路电源输出用一颗 STM32F722VE 统一管理三颗 eFuse每路独立的故障中断和 ADC 通道。扩展时只需要在 power_path 模块里加一个实例编号把配置数组化即可。更进一步还可以把每路的 IMON 数据和故障日志通过网口上报到上位机做远程健康管理。但那是另一个项目的话题了。最后分享一个小技巧调试这类电源保护方案绝对不要只坐在电脑前看代码。把示波器抓的波形、电子负载的电流设定、ADC 原始值和最终状态机转移记录下来形成一个完整的对照表格。这个习惯会帮你在跳闸问题上百思不得其解的时候省下整整一个通宵。
返回列表