前阵子做一块工业控制板的电源部分,24V输入要给后级各种负载供电,板卡要求热插拔不损坏、负载短路不烧板、故障能远程上报。用TPS259483AYWPR这颗eFuse加上STM32F302VC来做电源路径保护,算是把嵌入式系统的电源管理这个环节做扎实了。这块方案解决的核心问题,说直白点就是:让功率路径上的异常由硬件快速切断,同时让MCU看得见、管得着。适合正在做工业控制、车载电子或者电池供电产品的工程师参考。
1. 为什么要给电源路径加保护:传统方案和eFuse的真实差距
1.1 嵌入式和工业应用中的电源路径风险
工业控制板卡里,电源路径上最常见的问题就是过流、短路、浪涌和电压异常。比如工人带电插拔一个接口模块,板卡输入端会瞬间出现大电流冲击;后级DCDC输入端若有大容量电解电容,上电的一瞬间几乎等于短路;负载老化或者接线错误,也会导致输出侧对地短路。这些问题如果单纯靠“保险丝加TVS”去挡,效果其实很有限。
保险丝的问题在于它是一次性的,烧断以后必须人工更换,在无人值守的设备里基本上等于故障停机。并且普通保险丝的动作电流离散性很大,标称3A的保险丝可能要到5A才断,留下很大的不确定性。自恢复保险丝虽然能自动恢复,但它的动作速度慢,几百毫秒级别的响应时间,对后级芯片来说早就烧穿了。更重要的是,保险丝不会告诉系统“我断了”,只能靠后级没电了才能发现,这种被动保护很难满足现代工业设备对状态监控的要求。
很多人第一反应是“那用分立MOSFET搭一个电子开关,再加上采样电阻和比较器,不也能做吗”。确实能做,但一个可靠的分立方案至少需要功率MOSFET、栅极驱动、电荷泵、电流采样放大器、比较器、基准源、延时电路、辅助电源,光物料就是一长串。调试中还要处理MOSFET开关速度、振铃、防直通、温度漂移这些细节,板子面积也很大。对于量产产品来说,分立方案的可靠性往往取决于设计者的功力,极容易在EMI和瞬态响应上翻车。
1.2 eFuse如何把“快速切断”和“状态可感知”做进一颗芯片里
eFuse,也就是电子保险丝,本质上是一个集成了功率开关、电流采样、保护逻辑和驱动电路的智能功率器件。它把传统分立方案里的“功率级”和“控制级”封装到了一颗芯片里,使用起来很像一个带保护功能的MOSFET,但内部远比MOSFET复杂。
TPS259483AYWPR属于TI的TPS25948系列eFuse,这种芯片内部有一个低导通电阻的功率FET,并且配备了可编程的电流限制、输出压摆率控制、输入过压/欠压保护、过热关断和反向电流阻断等功能。它能够独立完成微秒级的短路保护,不需要MCU干预;同时又把故障状态通过开漏输出引脚FLT报告出来,让处理器能感知故障。
在实际项目中,我把eFuse当作电源路径上的“硬件保镖”,而STM32F302VC则是“值班经理”。保镖负责在异常发生的那一瞬间把电路切断,值班经理负责观察、记录、决定什么时候重新放行。两者职责不同但配合紧密。
2. 方案选型与系统架构:TPS259483AYWPR和STM32F302VC的角色分工
2.1 为什么选择TPS259483AYWPR这颗eFuse
选eFuse的时候,我最看重四点:输入电压范围是否覆盖实际母线电压;限流精度和响应速度是否够;导通阻抗导致的损耗能不能接受;还有是否带状态输出。TPS259483AYWPR所在系列覆盖了从低到高的电压输入范围,24V工业母线可以很从容地使用。它的导通阻抗很低,正常工作时压降很小,发热不明显。
另一个关键是它的限流功能是“可编程”的,通过一颗外部电阻就能设定限流点。这意味着同一块PCB可以通过更换电阻适配不同负载场景,甚至在固件里配合电子开关切换多档电阻,实现动态限流。这种灵活性在传统保险丝方案里完全不可想象。
此外,TPS259483系列有输出压摆率控制引脚。这个功能在热插拔场景里特别重要——当板卡插入背板连接器时,如果后级有几十微法甚至几百微法的滤波电容,瞬间充电电流会非常大。如果任由它冲,不仅会拉低母线电压,还可能把连接器打火花。通过调节压摆率控制电容的容值,可以控制输出端电压爬升的斜率,也就是限制浪涌充电电流,让热插拔变得平滑。
2.2 STM32F302VC的模拟外设优势
STM32F302VC是ST的一款ARM Cortex-M4内核MCU,主频72MHz,这个主频在MCU里不算极高,但它的亮点在于模拟外设集成度。它内部有多路12位ADC、两路DAC、三个快速比较器,以及最多两个运算放大器。这些模拟模块对于电源监测来说,简直是量身定做。
如果只用普通MCU,比如F103系列,要检测电流和电压就得外接运放、比较器、基准源,PCB上多一片料就多一份失效风险。F302VC自带比较器和运放,可以直接把eFuse的电流监测信号接入片内比较器,通过DAC设置一个阈值,当电流超过阈值时比较器输出立即触发中断或者事件。这个响应比ADC采样要快得多,对于捕捉过流波形和紧急事件记录非常有价值。
另外F302VC的ADC支持多通道同时采样和注入通道,可以在不停主循环的情况下完成数据采集。对于需要同时采集输入电压、输出电压和电流信号的场景,灵活性很高。
2.3 系统职责分配:硬件快速保护,软件策略控制
整个系统我将其划分为三个层次。第一层是eFuse自己的硬件保护层。过流、过压、欠压、过温这些危险状况,都由TPS259483内部的模拟电路直接处理,响应时间在微秒级别。这一层不需要代码参与,甚至MCU死机也不影响安全性。
第二层是MCU的快速事件层。利用STM32F302VC的比较器和DAC,对电流监测电压做阈值比较,把“电流异常上升”这个模拟信号转换成数字事件,并打上时间戳记录。这一层不直接控制eFuse的开关,但能为系统诊断提供证据。
第三层是策略管理层。MCU通过普通GPIO控制TPS259483的使能引脚,通过FLT引脚获取故障状态。固件运行一个状态机,在正常、故障、重试之间切换。这样设计的好处是,即使固件写了很多功能逻辑,电源保护的基本盘也不会受到干扰。
三层的功能分配见下表:
| 层次 | 承载器件 | 功能 | 响应速度 |
|---|---|---|---|
| 硬件保护层 | TPS259483AYWPR | 限流、过压、欠压、浪涌控制、热关断 | 微秒级 |
| 快速事件层 | STM32F302VC内部比较器 + DAC | 电流越限事件捕捉、时间记录 | 亚微秒级 |
| 策略管理层 | STM32F302VC固件 | 使能控制、状态判断、自动重试、远程上报 | 毫秒级 |
3. 硬件电路设计要点:从功率回路到MCU接口
3.1 功率通路设计与电容布局
TPS259483AYWPR的典型用法是串联在电源正极路径上,输入接电源,输出接负载,负极为公共地。
输入端必须放置足够的输入电容,一般至少10µF陶瓷电容并一个大容量的电解电容。原因是一旦下游出现短路,eFuse关断时存储在输入电缆上的寄生电感会产生电压尖峰,如果没有足够电容吸收,可能直接把芯片打坏。输出端的电容也不是越小越好,它和压摆率控制一起决定了热插拔时电流脉冲的形状。
PCB布局上,我吃过不少亏。功率回路要尽量短而宽,输入电容和输出电容的地脚要直接回到芯片的地焊盘,不能绕了一圈再回来。如果地回路被信号线分割,开关瞬间的高频电流会在地平面产生压差,轻则导致ADC采样乱跳,重则影响eFuse内部比较器的判断。
芯片底下建议做大面积铺铜散热,最好打上过孔连接到内层地。eFuse长时间通过几安培电流,发热不可小视。不要只看芯片最大电流,还要算一下实际温升。我曾经在一个封闭壳体内做过带载测试,表面温度比裸板高20°C,差点触发热关断,后来重新覆铜才解决。
3.2 限流电阻、电压阈值和压摆率参数的设置
限流点的计算公式在TPS259483的手册里写得很明确,一般是用一个基准电压除以限流电阻,再乘以一个比例系数。实际设计时,不能按理论值顶格设置,我习惯留20%到30%的余量。比如负载正常工作电流为1.5A,限流点我会按2A左右配置,因为启动瞬间难免有额外电流,留余量可以避免正常工况误触发。
过压和欠压阈值通过外部电阻分压设置。以我的24V系统为例,我会把欠压锁定值设置在18V,过压锁定值设置在30V。这要根据电源母线波动范围来定。分压电阻的取值不能太大,否则引脚输入偏置电流会产生误差;也不能太小,否则待机功耗会增加。精度上我通常选1%或0.5%的贴片电阻,并且在软件里做一次ADC校准。
压摆率控制电容是很多人容易忽视的参数。TP S25948系列一般有一个专门的引脚,通过外接电容设定内部电流源给输出栅极充电的速度。这个电容容值越大,输出电压上升越慢,浪涌电流越小;但也不能无限慢,否则负载长时间处于欠压状态反而会误动作。实际调试时,我用示波器同时抓输出波形和输入电流波形,在浪涌电流和后级上电时间之间取一个平衡点。
3.3 与STM32F302VC的接口设计
TPS259483给MCU提供了几个关键信号:使能EN、故障输出FLT、电流监测输出IMON。EN和FLT都是数字信号。FLT通常漏极开路,我加了一个10kΩ上拉电阻到MCU的3.3V电源。需要注意的是,如果TPS259483输出故障时FLT拉低,MCU供电可能会存在时序问题——故障发生时MCU可能还在运行,接受到中断后需要能够正常处理。因此FLT上拉的3.3V最好是MCU同一路电源,且留一点余量。
IMON信号是模拟信号,它输出一个与负载电流成比例的电压。MCU通过ADC采集这个电压,换算成电流值。由于工业现场往往有电机、变频器这些干扰源,IMON信号需要加一级RC低通滤波,时间常数大约1ms到10ms。如果后续要用到片内比较器做快速事件监测,则应该从RC之前引出信号,避免滤波延迟导致事件丢失。
STM32F302VC的ADC基准电压我建议接到独立的基准源,或者至少使用内部的VREF引脚并接去耦电容。如果直接用3.3V电源作基准,3.3V电源本身的纹波会直接影响电流采样精度。工业应用里,即使不追求高精度,也希望尽量减少共模噪声。VREF+脚不要空着,可以接一个AVDD、一个小电感或者磁珠,再做一点滤波。
4. 固件实现:让STM32F302VC管好状态而不是管保护
4.1 状态机的设计
保护动作是硬件完成的,但固件要管“接下来怎么办”。我把系统状态定义为四态:正常运行、故障触发、延时重试、永久锁死。
正常运行时,MCU周期采集电压电流数据,检查FLT引脚。一旦检测到FLT拉低,立即停止正常流程,记录当前时间和故障发生前后的采样数据,然后切到故障触发状态。在故障触发状态,MCU不会马上使能eFuse,而是先等待几百毫秒,确保故障源不再短路。
接着进入延时重试状态,MCU把EN引脚拉高一次,尝试重新启动。如果启动成功后FLT正常复位,系统回到正常运行状态。如果连续重试三次都失败,则进入永久锁死状态,此时MCU不再自动使能,而是通过串口或CAN向上位机上报“硬件故障,需要人工介入”。
这个策略的灵感来自于断路器重合闸,避免瞬时故障导致设备长时间停机,同时防止顽固性故障反复冲击电路。
4.2 ADC采集与滤波实现
STM32F302VC的ADC可以配置为扫描模式,我使用DMA循环采集三路电压信号:输入电压、输出电压、IMON电流。采集数据放到一个环形缓冲区里,主循环每100ms做一次均值滤波。
均值滤波能滤掉大部分高频噪声,但要注意平均值会掩盖一些瞬态变化。因此我同时保留了“峰值保持”逻辑:ADC使用注入通道,比较器触发时注入通道立即采集当前IMON值并存入寄存器,这样既能获得平稳的稳态数据,又能捕捉到故障瞬间的峰值。
伪代码如下:
// ADC DMA 循环采集 void ADC_DMA_Start(void) { HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buf, 3 * SAMPLES); } void Process_Power_Monitor(void) { for (int i = 0; i < SAMPLES; i++) { vbus_sum += adc_buf[i * 3]; imon_sum += adc_buf[i * 3 + 1]; vout_sum += adc_buf[i * 3 + 2]; } vbus_mv = vbus_scale * vbus_sum / SAMPLES; imon_mv = imon_scale * imon_sum / SAMPLES; vout_mv = vout_scale * vout_sum / SAMPLES; }工业环境下,ADC输入的参考地不能和功率地混在一起。尽量把模拟地单独走线,在MCU底层单点连接到功率地,否则大电流切换瞬间地弹会让ADC数值出现“毛刺”。
4.3 比较器与DAC的快速事件捕捉
为什么要用比较器?因为ADC即使使用DMA和注入通道,从发生模拟信号到软件看到数据仍然有几十微秒延迟,而比较器是纯硬件模拟比较,输出可以连接定时器输入捕获或者EXTI中断。它的响应速度远快于ADC。
我把IMON信号经过分压接到比较器的正端,DAC输出作为负端的阈值。DAC的好处是阈值可以在线设定,不用改电阻。正常运行时,DAC输出设为正常电流对应电压的1.5倍。一旦IMON超过这个电压,比较器立刻翻转,触发EXTI中断。中断服务程序里读取当前时间戳和这之前的ADC峰值寄存器,然后拉高或者拉低某个状态标志。
这样做的价值在于,当eFuse已经因为过流而切断时,MCU仍然能记录到故障电流的大致等级和发生时刻,方便故障分析。由于比较器翻转不代表MCU要介入保护,固件只做记录,不会干扰eFuse正常工作。
5. 实际调试中的典型问题与排查心得
5.1 上电瞬间就故障锁死
第一次把板子连上24V电源时,TPS259483的FLT信号瞬间拉低,输出电压一点都没起来。当时第一反应是限流电阻算错了,后来仔细查,发现输出端接的电容总容量达到220µF,而我的压摆率控制电容是按10µF负载设置的。
eFuse在启动时要给输出电容充电,充电电流等于CdV/dt。压摆率太慢时启动时间很长,但压摆率太快就会产生大电流,直接触发限流保护。解决方法是把压摆率控制电容加大到合适的值,实测看到输出从0V爬到24V用了大约5ms,电流峰值控制在限流点以内。
调试技巧:把示波器电流探头夹在输入电源线上,观察启动电流波形。一边调整压摆率电容一边看波形,效果比光算公式直观得多。
5.2 FLT引脚反复抖动导致误报
另一种常见故障是FLT引脚在带载时偶尔拉低、又很快恢复,MCU还没来得及处理,FLT又变高了。用逻辑分析仪抓FLT和EN,发现是IMON信号上叠加了开关电源的纹波,在临界点附近来回穿越比较器的阈值。
解决办法分两步:一是把FLT上拉电阻从10kΩ减小到4.7kΩ,加快上拉速度,减少噪声干扰;二是固件中对FLT信号做软件消抖,连续采样到低电平超过2ms才认定故障。对于真实短路来说,2ms消抖不会造成实质损失,因为eFuse本身早已把输出切断,MCU只是确认状态。
5.3 自动重试频率太高烧坏了连接器
我原来设计的自动重试间隔只有100ms。结果在负载短路时,eFuse不断尝试启动,每次启动都会在连接器处产生一个小的放电火花,时间一长连接器引脚被烧黑了。
后来我把重试间隔拉长到1秒,并且规定连续重试3次后就锁死,直到收到远程复位命令。这个代价是故障恢复时间变长,但对工业设备来说,稳定的故障响应比快速试探更重要。
5.4 IMON精度校准
IMON电压和实际电流并不是绝对的线性关系,尤其在低电流段可能有偏移。我在生产测试中加了一步校准:先空载读取IMON电压作为零点,再用电子负载拉一个标准电流读取第二个点,算出斜率和截距,写入MCU的Flash。这样电流显示精度可以做到相对误差在5%以内。
如果要求更高精度,可以在功率路径上串联精密采样电阻,用差分放大器接入STM32F302VC的运放。但对于大多数保护场景来说,eFuse内部IMON精度已经足够判断过流趋势和估算功耗。
6. 实测效果与应用扩展
6.1 实测数据
最终样机在24V供电下,设置了2.2A的限流点。做短路测试时,用一个继电器瞬间把输出端对地短路,eFuse的切断时间在几个微秒级别,输出端电压波形几乎是一条竖线被截断。连续做了几十次短路测试,板卡没有损坏,MCU每次都准确记录到了故障事件。
热插拔方面,后级接了一个约50瓦的负载电路,输入端插入背板时输出电压平稳上升,输入电流没有出现巨大尖峰。整个板卡在常温环境下连续运行24小时,eFuse表面温度在可接受范围内。
系统通过串口每50ms上报一组数据,包括输入电压、输出电压、电流、温度预估、故障计数和当前状态。上位机可以随时看到电源是否健康。
6.2 还能怎么扩展
这个方案做完后,我把部分功能做成了可配置选项。比如通过STM32F302VC的DAC动态调整比较器阈值,可以实现在不同负载模式下有不同的预警值。如果配合数字电位器切换ILIM限流电阻,MCU就能在低功耗模式和满载模式之间动态调整限流点,在保护策略上更加灵活。
另外,STM32F302VC还有CAN控制器,工业设备大多有CAN总线。目前我已经把故障记录挂到了CAN报文里,上位机可以远程读取故障历史和当前状态。将来甚至可以做到远程下发“允许重启”指令,替代人工断电复位。
6.3 个人的一点体会
做电源路径保护,最忌讳的是把“保护功能”全部寄托在固件上。固件会跑飞、会被中断卡住、会有bug,而功率电路上的短路才不管你的代码有没有写好。所以我的架构原则是:任何有可能造成硬件损坏的保护,都必须由模拟硬件完成;MCU只能做策略和报告,不能做最后的防线。
用TPS259483AYWPR之后,省去了分立采样电阻、比较器、驱动电路一大片物料,PCB面积小了很多,逻辑也清爽了。STM32F302VC的模拟外设则让“监控”这件事变得轻而易举,不用再去外挂一堆芯片。这套组合在嵌入式和工业应用里,我认为值得推广。