1. 这个项目到底在保护什么
1.1 先讲一个我踩过的真实事故
前年给一套工业控制设备做配套板卡,设备本来跑得好好的,结果现场调试时一个电磁阀线圈短路,直接把整个 24V 母线拉到了 1V 左右。我做的板卡虽然不是"元凶",但因为是直接挂在母线上的,瞬间就被殃及:板上的 DC-DC 输入过压、输出跌落、控制芯片复位,最惨的是有一块板子的 TTL 串口芯片直接冒烟了。
事后复盘,根子就一条:我在电源输入端只放了保险丝和 TVS,没有做主动的电源路径保护。保险丝的动作时间是几百毫秒级别,TVS 只能对付瞬态过压,对持续过流、短路、欠压塌陷这些情况基本无能为力。设备又不是一次性淘汰品,现场设备动不动就返修,老板的脸色可想而知。
后来我主导做了一版带电源路径保护的控制器,核心就是标题里这两个芯片:TI 的TPS259483AYWPR作为前端 eFuse,负责硬保护;意法半导体的STM32F373VC作为管理大脑,负责监控、决策和上报。这一版改完以后,同类型的故障再也没烧过板子,而且故障原因能直接在界面上看到,现场维修效率高了很多。
1.2 电源路径保护的三层含义
很多做嵌入式开发的同行,对"电源保护"的理解还停留在"加个自恢复保险丝"的层面。做了这个项目之后,我的体会是:真正的电源路径保护要拆成三个层次,缺一不可。
第一层是硬保护,解决"毫秒甚至微秒级"的灾难。比如负载短路、输入过压、输出过流,这些故障在 1ms 内就能烧掉 MOSFET 或者 PCB 铜箔。这一层必须由模拟电路来完成,靠 MCU 中断轮询根本来不及。TPS259483AYWPR 这类 eFuse 内部门限检测响应在微秒级,短路时能在极短时间内把路径切断。
第二层是软管理,解决"什么时候能开机、什么时候不能开"的策略问题。比如输入电压低于欠压点时不启动、上电时限制浪涌电流、故障消除后自动恢复还是锁存等。这一层非常适合交给 MCU 做,因为策略经常要按客户需求调整,用代码改比改电阻方便得多。
第三层是可观测性,告诉运维人员"刚才到底发生了什么"。传统保险丝断了就是断了,你只能去万用表量。而有了 STM32F373VC 监控母线电压、eFuse 的 FAULT 信号、Power Good 信号,就能在设备端把故障类型、发生时刻、电压跌落幅度统统记下来,通过串口或者 CAN 上报。在这个项目里我明显感觉到,很多时候"知道怎么坏的"比"修好它"更有价值。
1.3 两个主角的分工
TPS259483AYWPR 本质上是一个集成了功率 MOSFET 和保护控制逻辑的"电子保险丝"。它的本职工作包括:可编程的过流限流、输入过压保护、欠压锁定、上电斜率控制(防浪涌)、热关断,以及对外输出 FLT 故障指示和 PG 电源正常指示。对嵌入式系统来说,它就像一个反应极快的保安,在微秒级把危险挡在外面。
STM32F373VC 则负责当"值班经理"。它通过 GPIO 控制 eFuse 的使能引脚,通过外部中断捕获 FLT 信号,通过内部 16 位 sigma-delta ADC 实时采集输入输出电压,再按照状态机逻辑决定重试、锁存还是降级运行。选这颗芯片不是因为算力大,而是因为它的高精度 ADC 非常适合做电源监控——不用在外挂一颗 16 位 ADC 芯片,整板 BOM 更干净,这也符合嵌入式硬件工程师一贯的"能用一颗的不放两颗"原则。
2. 方案选型:为什么是 eFuse + MCU 的组合
2.1 传统保护方案为什么不够用
很多设计人员习惯用分立元件搭保护电路,比如 "PMOS + 采样电阻 + 比较器 + 锁存器" 这种结构。对单功能、单阈值场景也许够用,但一旦要求过压、欠压、过流、斜率控制、状态输出并存,分立方案的器件数量会迅速膨胀,PCB 面积和调试时间都让人头疼。
举个具体例子:用分立方案做可编程过流保护,你需要采样运放、比较器、基准源、RC 延时网络、锁存触发器,再加上供电和电平转换,少说七八颗料;而 TPS259483AYWPR 一颗就全包了,而且还有电源正常指示。此外,分立方案的温度漂移和器件一致性很难控制,限流点会随温度漂移,批量生产时一致性不好保证,这在工业现场是很大的隐患。
传统保险丝更不用说了,它只能"一次性断开"或者"反复断开后自恢复但限流点极不准确",更关键的是它没有状态输出,你没法在系统里知道它已经断了。PTC 自恢复保险丝动作之后还残留高阻状态,对后面 DC-DC 的输入电压稳定性影响很大,实测下来经常出现反复重启的"打嗝"现象。
热插拔场景里传统的方案是专门的热插拔控制器加上外部 MOSFET,精度和功能没问题,但代价是成本和面积,而且大部分型号的集成度不高,调试时还要自己搭栅极驱动。空域上看,eFuse 处于保险丝和热插拔控制器之间:比保险丝智能,比热插拔控制器简单,性价比正好落在嵌入式设备最常用的 5V~24V 区间。
2.2 eFuse 方案到底解决了哪些实际问题
我在这块板子上给 TPS259483AYWPR 设定的工作条件是:12V 输入母线,允许范围 9V~16V,常态负载 1.8A,限流值 3A。围绕这些条件,eFuse 帮我解决了四个实际问题。
第一个是上电浪涌。嵌入式设备后端常常挂着几十甚至几百微法的滤波电容,直接通断 12V 的话,瞬间充电电流可能冲到几十安培,轻则拉垮母线、重则打火。TPS259483 上的 dVdT 引脚接一个电容,就能控制输出电压爬升的斜率,把浪涌电流限制在可控范围。这个功能对我这种"一上电就听到电源模块滋滋响"的老式布线方式,简直是刚需。
第二个是过流限流而不是直接断开。很多人以为保护就是"断",其实在嵌入式系统里,eFuse 首先做的是"限流"——把电流夹在设定值,电压顺势跌落,等短暂延时后才判定为过流并关断。这样做的好处是:对容性负载的短时浪涌、对电机启动的短时大电流,系统不会误保护,只有真正持续的过流才会触发关断。
第三个是过压保护。12V 母线上如果串接其他感性负载,关断时的反电动势很容易把电压抬升到 20V 以上。TPS259483 的 OVP 引脚通过电阻分压设定阈值,一旦输入过压立即关断内部 MOSFET,把后级设备与高压隔开。实测中我在 12V 母线上故意叠加 18V 脉冲,输出纹丝不动,后级 DC-DC 和核心板完全不受影响。
第四个是状态可见性。FLT 和 PG 两个开漏输出直接连到 STM32,MCU 不用自己判断"电源有没有坏",而是让 eFuse 告诉它"我坏了"。这个信号链的可靠性远高于靠 ADC 采样电压再软件判断的方案,因为它在故障发生的瞬间就同步触发中断了。
2.3 STM32F373VC 的价值点不止是"有 ADC"
STM32F3 系列最出名的就是模拟外设。F373VC 上集成的是3 个独立的 16 位 sigma-delta ADC(SDADC),它和普通 MCU 上的 SAR ADC 完全是两种东西。对电源监控来说,这个 ADC 的优势非常明显。
普通 12 位 ADC 在 12V 满量程下,每个 LSB 代表约 3mV 电压,理论上还行,但实际噪声很容易吃掉最末两位,真实有效位数可能只有 10 位。而 16 位 sigma-delta ADC 内部有过采样和数字滤波,有效位数能到 14 位以上,测量母线电压时能分辨 1mV 级别的变化。在这个项目里,我用 SDADC 监视输出侧电压,能在 eFuse 限流动作时观察到输出电压从 12V 跌落到 11.4V 的整个过程,这对分析负载突变和电流余量特别有用。
其次是中断响应。F373VC 的 EXTI 外部中断可以配置为边沿触发,把 eFuse 的 FLT 信号接进来之后,故障发生时 MCU 能在一个中断服务函数里完成故障记录、LED 翻转和通信上报。整个路径的延迟在微秒级,虽然不是硬保护的主力,但比轮询快了不止一个数量级。
最后是通信接口的资源。F373VC 自带 CAN、USART、SPI、I2C,我在设计里留了一路 CAN,设备在现场可以直接接入工业总线,把电源状态作为一条诊断信号上报给主站。这个能力对工业应用来说几乎是"入场券"级别的需求,因为你不可能让维护人员拿万用表去测每一路电源。
3. 硬件设计与关键参数计算
3.1 系统电源架构设计
先画一个总体的电源链路:外部 12V 输入 → 输入端滤波电容 → TPS259483AYWPR → 输出端储能电容 → 后级负载(核心板、传感器、执行器等)。同时,还有一个独立的 3.3V 电源给 STM32F373VC 供电,它不能接在 eFuse 的输出侧,否则 eFuse 关断时 MCU 也断电,故障记录就全丢了。
这是整个设计里最容易犯的错误。我见过有人把监控 MCU 直接挂在被保护路径后面,结果 eFuse 一动作,MCU 跟着掉电,什么故障信息都来不及存。正确的做法是让 MCU 的供电来自独立的辅助电源,保证被保护路径断开时,MCU 依然能醒来"问一句":出了什么事。毕竟监控者不能和被测对象同一根呼吸管。
输入端我放了一个 22µF 陶瓷电容加一个 0.1µF 高频电容,主要作用是滤除母线上的高频噪声,避免 eFuse 内部的 OVP/UVLO 比较器误动作。输出端根据负载需求放了 330µF 的电容组,这既是储能,也参与了 dVdT 斜率控制下浪涌电流的计算,取值要专门算过。
另外输入端别忘了反向保护的问题。TPS259483 这类 eFuse 对反接输入其实不一定有耐受能力,所以我在输入端串了一个防反接的二极管或在设计上留了说明。实际项目里如果用 battery 供电,必须加防反接;如果是电源适配器输出,则至少要在 BOM 评审时确认。
3.2 TPS259483AYWPR 外围电路详解
下面把我在原理图上实际画的关键引脚逐一说明,这些都是照着数据手册加自己实测修正过的,可以直接抄作业但必须根据你自己的输入范围重新算。
输入引脚 IN 与输出引脚 OUT:这是 MOSFET 的源漏两端,在布局上要粗、短、直。IN 侧滤波电容尽量贴近芯片。OUT 侧的 330µF 电容组也不要离芯片太远,否则路径电感在短路时会形成电压尖峰。
限流设置引脚 ILIM:TPS25948 系列的限流值通过 ILIM 到 GND 的电阻设定,公式形如:
I_LIMIT = K / R_ILIM不同器件号的 K 值不同,需查手册。我在 3A 限流点选择时,先按手册推荐值取了一颗 30kΩ 的 1% 电阻,再实测短路时的限流点,根据示波器读数微调,最终落在 3.0A ± 3% 的范围内。这里有一个非常关键的细节:ILIM 电阻必须是低温度系数的,最好用 1% 精度以上的贴片电阻,而且不要使用打过孔返回到地平面的走线,太长会引入额外电阻,导致限流点偏移。
过压保护引脚 OVP:OVP 阈值由外部电阻分压设定。内部比较器参考电压典型值在 1.2V 左右,具体看手册。我设定的阈值是 16V,分压电阻取值如下:上臂 120kΩ,下臂 10kΩ,则 OVP 引脚电压在输入 16V 时为:
V_OVP_PIN = 16 × 10 / (120 + 10) ≈ 1.231V接近内部参考值,触发过压保护。这里要注意电阻的精度直接影响触发点,我全部选 0.1% 薄膜电阻,同时预留了并联位置,方便批量前校准。
欠压锁定引脚 EN/UVLO:这个引脚既能做使能也能做欠压锁定。我用的分压结构是上臂 100kΩ、下臂 20kΩ,对应的启动电压约 7.2V,关断电压约 6.8V(具体还取决于引脚内部电流源带来的迟滞)。迟滞非常重要,没有迟滞的话,输入电压在临界点附近波动会让 eFuse 反复通断,形成振荡。
斜率控制引脚 dVdT:这个引脚对地接电容,电容越大,输出爬坡越慢。我的经验值是:后端 330µF 电容、限流 3A 时,dVdT 电容选 1nF,对应输出斜率大约 1V/ms 量级,启动浪涌电流被限制在 1.5A 左右。这个值需要实测调,不要只看手册。
状态输出 FLT 和 PG:两个都是开漏输出,必须外部上拉。我统一上拉到 3.3V,接 10kΩ 上拉电阻,同时串联 1kΩ 保护电阻进 STM32,防止 MCU 引脚配置错误时拉坏芯片。PG 表示输出已经达到设定电压的阈值,代表"电源起来了";FLT 表示发生了故障,低电平有效。
3.3 STM32F373VC 接口与采样电路
STM32 与 TPS259483 之间我实际连线就 4 根:EN 控制输出、FLT 中断输入、PG 状态输入、以及一个 ADC 采样点。
EN 控制:接 STM32 的普通 GPIO,推挽输出。这里要注意上电时序,MCU 复位期间 GPIO 默认是高阻,eFuse 的 EN 引脚内部有下拉的话,上电默认是关断的,这样最安全。如果想让板子上电默认直通,可以在 EN 上预留一个 100kΩ 上拉电阻,但我建议不要这么干——让 MCU 在自检通过之后再抬 EN,是更稳妥的做法。
FLT 中断:接 STM32 的 PA 口并配置为 EXTI 下降沿触发。FLT 低电平有效,eFuse 发生故障时引脚被拉低。我在 MCU 内部打开上拉作为默认状态,同时外部再并联 10kΩ 上拉,双保险。为了防干扰,中断服务函数里做了简单的消抖:进入中断后延时 50µs 再读一次电平,确认确实为低才进入故障处理流程。
PG 状态输入:普通 GPIO 读取,放在主循环 10ms 周期里轮询。PG 上升沿虽然在多数情况下和 FLT 无关,但它反映的是输出已经建立完成,可以用于启动后级负载的时序控制。比如,等 PG 为高再允许核心板复位释放,可以避免上电瞬间的输出崩落。
SDADC 采样电路:我用两个 SDADC 通道分别监视输入母线电压和输出侧电压。输出电压 12V 必须先分压到 MCU 可接受的范围内,我采用 30kΩ 上臂 + 10kΩ 下臂,把 12V 分到 3V 左右,留出安全余量。分压后再加一级 RC 滤波,取 1kΩ + 100nF,截止频率约 1.6kHz,把高频开关噪声滤掉。SDADC 输入是高阻的,但我的经验是仍不要直接接裸分压电阻,RC 滤波除了降噪,更重要的是防止引脚上的采样电荷注入影响分压点精度。
3.4 PCB 布局与接地设计
电源路径保护的板子,软件写得再好,布局乱了一样白搭。我在这块板子上吃过亏,所以把经验写实一点。
功率路径走线:从输入接口到芯片 IN、再到芯片 OUT、最后到输出接口,这段走线要遵守"最短、最宽"原则。12V/3A 的应用,电源走线宽度我给的是 2mm 以上的铜箔,走线长度控制在 20mm 以内。为什么这么较真?因为任何寄生电感在短路时都会产生 L×di/dt 的电压尖峰,di/dt 可以到几十 A/µs,哪怕 10nH 的电感也能打出 1V 以上的尖峰,足以影响采样精度甚至触发保护误判。
ILIM 电阻的放置:这个电阻必须紧贴 ILIM 引脚,接地端走独立的小铜皮回到芯片的 GND 引脚或者专门的 AGND 点。我第一版板子把 ILIM 电阻接到了板上全局地平面,结果限流值偏高了约 8%,因为地平面上的噪声和直流压降被并入了电阻两端。
eFuse 的散热:TPS259483 封装底部有散热焊盘,必须开足够的过孔阵列连接到内层铜皮。限流保护时 MOSFET 上会消耗不少功率,比如输出短路时,12V × 3A = 36W 都会堆在芯片上,虽然保护逻辑会很快关断,但散热焊盘做不好会让芯片在重复故障时累积过热。我用的是 6×6 的过孔阵列,实测满负荷 3A 持续 30 秒,芯片表面温度 86°C,勉强压得住。
AD 采样走线:SDADC 的输入走线要远离功率路径和电感,我用了一小段包地走线,周围避开 PWM 信号。调试中我发现采样电压在开关电源附近跳了约 20mV,加包地后降到 2mV 以内,效果立竿见影。
4. 软件设计与故障管理机制
4.1 初始化与自检流程
STM32F373VC 的软件我采用裸机结构加一个 10ms 系统节拍,没有上 RTOS——一个电源保护管理任务,跑 RTOS 反而增加复杂度,而且中断响应的确定性更难保证。系统逻辑是这样:
上电后先做硬件初始化:时钟配置到 72MHz,GPIO 初始化为 EN 低电平,FLT 配置为 EXTI 中断,SDADC 配置为 16 位精度、连续转换模式,UART 初始化用于调试日志。然后 MCU 延迟 200ms,等自己的电源稳定,再执行一次自检:读取 PG,确认输出为低;翻转一次 EN 到高电平,观察 PG 是否能在预期时间内拉高——如果 PG 超时未高,说明 eFuse 或后级负载有问题,直接进入 FAULT 状态并打印告警。
这个自检流程是我从一次现场事故中学到的。当时有一批板子因为一颗 eFuse 虚焊,上电后输出根本没有建立,但 MCU 自己正常启动了,系统却毫无察觉,直到后级传感器无响应才发现。让 MCU 主动"确认"电源路径建立完成,而不是默认它一定正常,这个思想对所有带保护电路的嵌入式系统都适用。初期化代码框架大概长这样:
void pwr_protect_init(void) { gpio_init_en_output_low(); gpio_init_flt_exti_falling(); gpio_init_pg_input(); sdacd_init(/* 16bit, continuous */); delay_ms(200); /* 自检: 尝试开启电源路径 */ gpio_set_en(true); if (wait_pg_high(/* timeout50ms */)) { status = PWR_OK; } else { status = PWR_FAULT; log_error("power path self-test failed"); gpio_set_en(false); } }4.2 基于状态机的故障处理
电源管理的核心逻辑我实现为一个简单的状态机,状态包括 NORMAL、FAULT_RECORD、COOLDOWN、RETRY_ENABLE、LOCKOUT。
- NORMAL:正常运行,周期性采样电压,轮询 PG。
- FAULT_RECORD:FLT 中断触发后进入,记录当前时间戳、故障标志、母线电压值,然后切到 COOLDOWN。
- COOLDOWN:等待 5 秒冷却,让 eFuse 内部热保护复位。这个时间是经验值,太短会导致连续故障时芯片过热,太长则现场恢复慢。
- RETRY_ENABLE:尝试重新拉高 EN,等待 PG。如果成功回到 NORMAL,如果又收到 FLT,则记录故障计数并回到 COOLDOWN。
- LOCKOUT:连续重试超过 3 次,不再自动恢复,等待人工复位或者远程指令。连续故障必须锁存,不能无限重试——这是安全设计的基本原则,否则现场负载反复短路,设备永远在"断电→上电→断电"之间循环,最后把整个系统打成筛子。
void pwr_task(void) { switch (state) { case NORMAL: sample_voltages(); /* SDADC 读取 */ check_voltage_alarm(); if (deglitch_flt()) { state = FAULT_RECORD; record_fault(FLT_REASON); } break; case FAULT_RECORD: state = COOLDOWN; start_timer(5000); break; case COOLDOWN: if (timer_expired()) { fault_retry_count++; if (fault_retry_count >= 3) state = LOCKOUT; else { state = RETRY_ENABLE; gpio_set_en(true); } } break; case RETRY_ENABLE: if (wait_pg_high(TIMEOUT)) { fault_retry_count = 0; state = NORMAL; } if (deglitch_flt()) { state = FAULT_RECORD; gpio_set_en(false);} break; case LOCKOUT: /* 等待外部复位指令 */ break; } }这里有个细节很值得说:FLT 中断和轮询状态机的配合。FLT 是 EXTI 中断,它只负责"唤醒",把状态机从 NORMAL 推出去;真正的处理逻辑全部放在主循环里。为什么不在中断函数里处理完整流程?因为在 ISR 里做延时和重试会让整个系统失去响应能力,而且中断里做复杂逻辑容易触发优先级反转和相关 bug。FLT 中断里我做的事情极其有限:只置一个标志位,然后立刻退出。
4.3 高精度采样与软件抗干扰
STM32F373VC 的 SDADC 虽然是 16 位的高精度器件,但实际使用必须配软件处理,否则很容易自我感动。我总结了三条经验。
第一,连续采样 + 中值滤波。我每个通道一次采 16 个样本,排序后取中值。中值滤波比均值滤波更能抵抗偶发尖峰,比如某个开关动作瞬间的耦合噪声。实测下来,12V 母线的测量值波动不超过 3mV,相当于分辨率已经接近压力测试极限。
第二,校准偏移。SDADC 有可编程的偏移校准寄存器,我在初始化时对输入通道做了一次零输入校准,把通道失调电压记下来并在每次转换结果中减去。单片机的 ADC 出厂虽然有一定校准,但温度和电压变化后偏移会漂,专门跑一次软件校准很值得。
第三,阈值判断加迟滞。监控过流动作时,我不直接用"电压低于某值就报警",而是设置两个阈值:进入报警的阈值和退出报警的阈值。比如输出低于 10.8V 判定欠压报警,恢复到 11.2V 才消除报警,中间留 0.4V 的迟滞窗口。这和 eFuse EN 引脚的迟滞是同一个道理,避免系统在临界点反复抖动。
4.4 对外通信与日志记录
这块板子留了 UART 调试口和 CAN 口。UART 在开发阶段输出调试日志,量产时用于本地诊断。CAN 则走工业现场总线,周期上报一帧电源状态,包含输入电压、输出电压、eFuse 温度(如果有)、故障码和重试计数。故障码我定义了一套简单的枚举,比如 0x01 表示过流触发、0x02 表示过压、0x03 表示欠压、0x04 表示热关断,方便主站在 HMI 上直接显示。
通信协议不需要复杂,我用的是自定义的简单帧格式:帧头、长度、设备地址、数据域、CRC16。在这个场景里,复杂协议反而没有意义,关键是故障发生时能第一时间把状态推出去。我在 CAN 发送上做了优先级处理:故障帧使用最高优先级标识符,保证即使总线繁忙,故障信息也能一帧插进去。这个设计在现场非常有用,有一次设备报过流故障,主站 HMI 上瞬间弹出了告警,运维人员直接锁定了故障负载所在回路,省了大量排查时间。
5. 实测结果与避坑实录
5.1 上电浪涌与短路保护波形
整板调完以后,我最先测的是上电浪涌。用示波器电流探头夹在 12V 输入线上,记录从 EN 拉高到输出稳定的过程。在 dVdT 电容 1nF 的配置下,输出电压以约 1V/ms 的斜率爬升,330µF 输出电容对应的充电电流峰值约 1.6A,远低于 3A 限流点,没有触发保护,母线电压纹丝不动。这个波形比直接测短路更有说服力,因为它验证的是"正常路径上的保护不能误动作"。
短路测试则更有意思。我用一个电子负载切换到短路模式,输出瞬间从 12V 跌到接近 0V,电流在几个微秒内冲到限流点附近,然后被 eFuse 夹在 3A 左右,维持几百微秒后判定过流,FLT 拉低,输出被彻底关断。示波器上能看到一个经典的"限流平台"波形,之后输出端电压因输出电容放电缓慢下降。从短路发生到 FLT 拉低,整个过程约 1.5ms——对后级核心板来说,完全来得及在崩溃前被保护住。
5.2 五个最常见的坑
这套方案我从打样到量产经历了两次改版,踩过的坑比手册上写的多得多。挑五个最典型的记录下来,希望能帮同行少走弯路。
第一个坑:ILIM 电阻离地太远导致限流值偏差。第一版样片把 R_ILIM 放在芯片对角位置,走线长了 8mm,实测限流点比设计值高了 12%。原因就是电阻和 GND 之间串入了 PCB 走线电阻,改变了芯片内部的检测电压。解决方法是把 R_ILIM 紧贴芯片引脚放置,地端单独拉短线到芯片 GND。
第二个坑:OVP 分压电阻用了普通 5% 精度,批量时过压保护点漂移。5% 电阻在 120kΩ 上意味着 ±6kΩ 的误差,反映到 OVP 阈值上就是 ±0.8V 的偏差,有些批次的产品在 15.2V 就触发保护了,而设计目标明明是 16V。后来全部换了 0.1% 薄膜电阻,问题彻底消失。如果成本敏感,至少要选 1%,并且在校验时给阈值留 10% 以上的裕量。
第三个坑:dVdT 电容取太小造成启动误保护。一开始我按手册推荐的下限选了 470pF,输出斜率极快,330µF 电容充电电流峰值接近 4A,直接触发限流并进入故障状态,表现就是"上电失败,偶尔成功"。把 dVdT 改为 1nF 后,启动电流降到 1.5A,问题消失。这里提醒一下,改 dVdT 的同时要看输出电容,电容越大需要的斜率控制时间越长。
第四个坑:FLT 信号没做消抖,导致故障计数虚高。短路瞬间 FLT 引脚上有一串毛刺,如果不做消抖,MCU 会认为发生了多次故障,直接把状态机推到 LOCKOUT,而实际上故障只有一次。我在 EXTI 中断里加 50µs 延时重读之后,故障计数就准确了。
第五个坑:负载是感性/容性混合时,过流保护的"首次判定"容易被误触发。比如驱动一个直流电机启动瞬间,电流会超过限流值约 50ms。eFuse 的过流判定如果太灵敏,就会误关断。解决思路有两个:一是把限流点调高,让正常工作电流不到限流值的 60%,留足启动裕量;二是在 MCU 策略里对 FLT 做多周期确认——虽然 FLT 本身是硬件信号,但我可以在重试逻辑里增加条件,比如连续两次启动都失败才进入 LOCKOUT,单独一次失败只记录 WARN。
5.3 方案扩展的后续空间
这套电源路径保护的架构做完之后,扩展空间比预想的大得多。我给几个方向,大家可以根据自己产品形态参考。
多路电源输出管理。一块板子上有多路负载(模拟部分、数字部分、执行器部分),可以每路放一颗 TPS259483,全部由一颗 STM32F373VC 统一管理。因为 F373 有好几个 SDADC 通道,多路电压采样不需要增加外设。这种架构对高端仪器、边缘计算网关这类多电源域产品非常合适。
做电流采样做电能统计。eFuse 输出端串一个小阻值采样电阻,配合运放把电流信号送到另一路 SDADC,就能实时监测每路负载的功耗。我在第二版上加了这功能,上位机可以直接看到各回路电流曲线,对产品功耗分析和远程诊断都很有价值。SDADC 的精度在这里又成了杀手锏——5A 满量程采样电阻上压降只有 25mV,普通 12 位 ADC 根本没法看,16 位却能分辨到 1mA 级别。
把状态上报接入云端或者上层管理平台。如果产品本身有嵌入式 Linux 或者网关模块,UART/CAN 上报的电源健康数据可以汇总到云端,做预测性维护。比如某一路负载的过流告警频次持续上升,往往意味着负载老化,提前更换就能避免现场停机。
根据故障历史自动调整限流策略。STM32 可以把故障记录存到 Flash,重启后读取,如果发现某一路总是过流,可以在下次启动时让 MCU 主动把 eFuse 的限流点调低(如果型号支持可调),或者干脆先不使能这一路,直到管理人员确认。这属于策略层的玩法,硬件不用动,价值很高。
最后说点实际的。这套方案我自己用了大半年,最深的体会是:电源保护不是简单地"加一颗芯片",而是要把硬件保护和软件策略当成一个整体来设计。eFuse 负责最快速度挡住灾难,MCU 负责理解现场、记录历史、决定什么时候重新尝试——两者缺一不可。做嵌入式开发,尤其是面向工业场景的项目,千万别把电源设计当成"能亮就行",多花一点时间在保护和管理上,返修和现场哭的次数会少很多。