ARTICLE DETAIL

资讯详情

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

STM32F103RC配合电子保险丝实现工业电源硬保护设计

STM32F103RC配合电子保险丝实现工业电源硬保护设计 去年做一块工业边缘计算板卡时客户现场反馈说电源入口附近的PCB铜箔发黑主控芯片供电纹波大得离谱。排查到最后问题不是出在后端的STM32F103RC负载本身而是整条电源路径上没有任何硬保护。后来我在12V输入路径上加上一颗TI的TPS259483AYWPR电子保险丝让主控通过GPIO、外部中断和ADC实时监测电源状态才把这类故障彻底堵死。这篇文章就把这个项目的完整设计过程整理出来覆盖芯片特性、外围电路计算、STM32侧固件、实测翻车记录这几个环节。如果你也在做嵌入式或工业应用里的电源路径设计被过压、短路、浪涌折腾过这篇应该能给你省下不少调试时间。1. 从电源入口被烧穿讲起为什么系统里需要一颗电子保险丝1.1 一块烧焦的PCB给我上的课故障板子是现场某个执行器的12V供电分路。客户描述是用着用着冒烟了返修拆开一看保险丝倒是断了但断之前已经有大电流流过把输入连接器附近的走线烧成了碳化状态。那个板子用的是最传统的玻璃管保险丝方案保险丝慢速熔断短路时能量已经进去了后端模块和铜箔跟着遭殃。而且现场排查发现真正导致故障的原因是前级电源在切换瞬间出现了一个高于标称值很多的电压尖峰保险丝对过压完全无感等电流大到熔丝断开伤害早就造成了。从那之后我的原则很简单电源入口必须要有主动保护而不是等物理熔断。所谓主动指的是芯片能在微秒级时间内把电流限制住、把过压挡在门外并且把故障状态告诉主控。1.2 拆解需求清单保护既要硬也要看得见这个项目里需要受保护的对象是STM32F103RC为核心的控制板以及挂在12V母线上的外围模块。整理出来的需求其实很明确输入标称12V允许波动范围8V~16V超过16V必须关断。最大持续负载电流按3A设计瞬时短路时电流必须被钳制不能有任何让后端看到几十安培的机会。上电瞬间后端有大量电容必须限制浪涌电流否则前面的电源会保护性重启。故障信号要送到主控让STM32知道现在电源路径是什么状态。如果用传统方案做这些常规做法是分立MOSFET、采样电阻加运放比较器、一堆电阻电容搭保护逻辑还要处理比较器翻转的可靠性问题。调试量很大温度一漂移阈值也跟着漂。当时我意识到这类功能早就有集成方案了也就是电子保险丝eFuse。把浪涌限制、过流限制、过压检测、热关断集成在一颗芯片里外围就干净得多。2. TPS259483AYWPR 的看家本领限流、过压、浪涌一次搞定2.1 一颗eFuse内部到底装了什么TPS259483AYWPR这类电子保险丝内部大致可以理解成三部分一颗低导通电阻的功率MOSFET、一套电流/电压采样电路、一套比较器和控制逻辑。它串联在电源路径中正常时MOSFET完全导通跟一个低阻值电阻差不多压降很小故障时控制逻辑驱动MOSFET线性限流或直接关断把危险挡在输出之前。和普通保险丝相比最大的区别是恢复性。物理保险丝是熔断即失效eFuse是限制性故障故障解除后可以由主控重新开启。这个特性和MCU配合起来非常自然后续固件部分会详细说这点。我拿到样片后没有直接看应用笔记先做了一件事把数据手册里的Functional Block Diagram打印出来贴在工位上。这样后续每次看引脚怎么配、异常行为怎么解释都能对着内部框图找到对应模块。这一步很建议你也做比自己死记硬背引脚有效率得多。2.2 哪些参数是我们必须吃透的把这些参数逐个吃透比纠结任何外围花活都重要参数类别我的关注点设计影响输入电压范围能否覆盖8V~16V的现场波动决定前置需不需要额外降压/稳压限流范围能否覆盖3A持续电流决定热设计和后端负载能力过压阈值精度16V关断是否可靠过高伤后端过低误动作浪涌限制方式是固定爬坡还是可调决定后端电容充电速度故障输出形态开漏输出决定MCU端上拉方式热关断阈值芯片结温超过多少自我关断决定PCB散热设计尤其要注意限流和关断是两回事。有些eFuse遇到大电流是直接锁死输出GATE有些则是先线性限流保持一段时间再关断。TPS259483的具体行为属于哪种一定要去规格书里看Fault Response相关章节先确认再用它设计后面的恢复策略。我当时差点默认它遇到短路直接锁死实际测试发现它会先限流一段时间这个行为对设备短暂短路后的自动恢复非常友好。2.3 与STM32F103RC配合时的三根信号线芯片跟STM32F103RC之间我实际只用了三根信号线FLT故障标志开漏输出故障时拉低。接到主控的外部中断输入下降沿触发。上拉到3.3V。SHDN关断控制主控GPIO输出拉低就强制把芯片输出关断拉高开启。用于软件主动断电和故障后的重新使能。IMON电流监测内部输出一个与负载电流成比例的电流或电压信号接到STM32的ADC用来实时观测负载电流。这三根线基本就能覆盖监测-报警-控制闭环。如果你希望更精细还可以用芯片的OVP/UVLO分压电阻做阈值微调但那属于硬件层面后面讲计算。3. 原理图与PCB里的电源路径保护设计从电阻选型到布局布线3.1 最小系统电路外围元件怎么定TPS259483AYWPR外围并不复杂但我建议按功能块来画原理图每个功能块注释清楚为什么。我这边的最小系统是这样的VIN和GND之间放一个10µF陶瓷电容加一个0.1µF高频电容滤掉前级电源的输出纹波。陶瓷电容要注意耐压建议用25V及以上规格。VOUT和GND之间放一个100µF电解电容这是为了兼顾后端负载的动态响应同时配合浪涌限制电路给后端电容充电。ILIM引脚接一个限流配置电阻。这颗电阻决定整条路径的电流上限我按3A设计具体阻值按手册里的限流曲线反查得到。限流电阻的精度尽量选1%温度系数别太差。OVP引脚上有分压电阻网络设定过压关断阈值。SHDN引脚上有一个电阻分压到VIN实现欠压锁定UVLO功能低于设定电压时自动不让芯片开启。FLT引脚通过10kΩ电阻上拉到3.3V然后接MCU。IMON引脚按手册推荐加一个RC滤波再接STM32的ADC通道。有个容易忽略的细节SHDN用来做UVLO分压时和MCU直接拉低关断是有冲突风险的。如果分压网络输出阻抗不够低MCU的推挽输出拉低时可能会和分压网络“打架”。所以我在设计上做了取舍UVLO功能由OVP芯片自带的EN阈值实现SHDN仅由STM32控制避免电平冲突。3.2 用分压电阻把阈值算明白以我的12V系统为例目标是过压阈值设在16V左右。TPS259483内部的OVP比较器参考电压是固定的假定参考电压为1.2V分压网络从VIN取电VOVP VIN_SET × Rbottom / (Rtop Rbottom)反推就是Rtop / Rbottom VIN_SET / 1.2V - 1我要设定VIN_SET16V那么Rtop / Rbottom 16 / 1.2 - 1 ≈ 12.33取标准电阻组合Rtop120kΩRbottom9.76kΩ用10kΩ并联大电阻微调实际比值约12.3动作点约16V。这里我多留了一点裕量因为分压电阻的温度漂移会把阈值整体移动。限流电阻的计算思路类似数据手册会给出限流值与电阻的关系曲线我按目标3A反查出对应阻值。但建议不要以理论计算值直接下单先把样片焊到评估板上实测一下限流点因为限流精度一般有±10%左右的散布实测确定后才好固件里写报警阈值。3.3 PCB布局里容易忽略的细节做电源路径的PCB布局时我踩过几个坑印象很深功率路径的走线要短粗。从输入连接器到eFuse输入引脚再到eFuse输出引脚再到输出连接器这四段是整板最容易发热的路径按3A电流至少保证1mm以上线宽最好铺铜。输入电容要靠近VIN引脚和GND引脚放。很多板子故障时芯片没坏但输入打嗝重启就是因为输入回路寄生电感太大。FLT、IMON这类信号线要远离功率走线。我第一版把IMON走线贴着功率线走了ADC采集到明显的开关毛刺后来调整内层走线加GND隔离才解决。芯片底部的散热焊盘必须接GND而且打足够多的过孔到内层地平面。eFuse正常工作时的功耗是I²×RDS(on)3A时也有几百毫瓦散热不好会很快触发热关断。我自己通常会先把功率路径布完再布信号线再布外围配置电阻最后铺地。这样信号线不会抢功率线的位置也不容易被电源噪声污染。4. STM32F103RC 侧的状态机中断、ADC采样与自动恢复逻辑4.1 初始化阶段别踩中断配置的坑STM32F103RC这边我用的是标准HAL库。初始化顺序建议是先初始化GPIO、再初始化中断、再初始化ADC、最后开启芯片使能。GPIO分配可以这样考虑PA0做EXTI输入接FLTPA1做普通输出接SHDNPA2开始接ADC通道。为什么这样选因为STM32F103的GPIOA能同时复用EXTI0和ADC通道减少跨端口交叉。如果你项目里这些引脚已经被占选GPIOB的对应引脚也行只要把中断回调函数改成对应的EXTIx_IRQn。初始化代码骨架void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // PA0 外部中断输入下降沿触发 GPIO_InitStruct.Pin GPIO_PIN_0; GPIO_InitStruct.Mode GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull GPIO_NOPULL; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); // PA1 控制 SHDN GPIO_InitStruct.Pin GPIO_PIN_1; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_NVIC_SetPriority(EXTI0_IRQn, 6, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); }这里想提醒一个细节EXTI引脚外部如果碰上噪声下降沿触发很容易误入中断。所以FLT信号上除了MCU内部的上拉硬件上还可以在FLT和GND之间并一个1nF到10nF的电容滤波。如果不能用硬件改板就在中断里加软件消抖连续确认几次低电平再进入故障处理。4.2 故障中断处理中断里只做一件事FLT下降沿进入中断后我的第一版代码直接在中断里把SHDN拉低、又拉高重试结果系统表现非常混乱。因为FLT可能持续拉低中断回调被反复触发最后成了死循环。后来我改成中断服务函数里只做一件事把故障标志位置位同时关闭中断使能防止后续反复触发。具体决策全部放到主循环状态机里处理。void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) ! RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); power_fault_flag 1; HAL_NVIC_DisableIRQ(EXTI0_IRQn); } }主循环的状态机基本是这么几个状态NORMAL正常供电周期读取IMON如果IMON对应电流超过设定值一段时间主动记录预警。FAULT收到FLT故障进入重试逻辑。RETRY把SHDN拉低等待200ms再拉高观察是否恢复。LOCKOUT连续重试失败后进入锁定状态必须通过串口命令或人工复位才能解除。单路保护用这种状态机足够清晰后续扩展到多路也容易只要把每个通道的SHDN和FLT映射到不同GPIO即可。4.3 重试策略与看门狗既要恢复又不能反复重启关于重试我踩过一个特别典型的坑。有一次后端模块确实有瞬时过载但板卡每隔几秒就自己复位重启客户现场以为是死机。原因就是我把重试间隔设得太短芯片刚恢复负载还没完成初始化又触发了保护形成重启-故障-重启的循环。最终我采用的重试策略分两级第一次故障不做人为干预等待1秒后再重新使能SHDN。这样给负载足够的时间完成初始化。同一分钟内连续故障3次以上进入LOCKOUT不再自动恢复通过串口上报故障码需要人工排查后端负载是否短路。看门狗这边的处理也要配合。我用了独立看门狗IWDG但只在故障锁定阶段去喂狗正常状态不喂。这样做的好处是如果主控程序因为某种原因跑飞正常的电源保护链路也会因为主控不再刷新IWDG而自动复位相当于给整个系统兜底。但要注意如果短路保护状态下喂狗太频繁可能会导致看门狗一直无法复位主控我就让IWDG在LOCKOUT状态下由定时器周期喂避免系统彻底凉透。5. 实测波形与踩坑记录参数整定的真实一面5.1 测试平台搭建电子负载模拟短路才是关键为了验证TPS259483AYWPR和STM32F103RC这套保护逻辑我搭了一个很简单的测试平台。12V直流源经过eFuse板卡输出后端接电子负载和一个可以用继电器控制通断的假负载。电子负载用于测持续电流和限流点继电器假负载用来模拟突发短路。这里最需要注意的是示波器探头的地线要短。测量VOUT波形时如果探头地线过长引入的寄生电感会掩盖真实波形看到一堆毛刺实际上芯片工作正常。短路测试我用的是继电器切换继电器在断开假负载瞬间会产生触点弹跳这样测出来的效果更接近现场。如果直接用功率MOSFET做短路开关波形会很“干净”但现实中的短路往往是有弹跳和弧光的实测参考价值反而低一些。5.2 三个真实翻车场景与修复过程整理一下我在调试过程中真实遇到的三次翻车每个都值得记下来第一次是上电瞬间误触发限流。后端接了一个大电容加多个DC-DC模块上电瞬间充电电流非常大IMON直接冲到了限流点FLT瞬间拉低。后来量波形发现充电电流峰值已经超过了限流设定值。解决办法是把设定限流从3A提到3.5A同时调大了浪涌控制引脚上的电容让输出电压爬坡变得更平缓。这相当于让后端电容充电时间增长但电流尖峰被削平了。第二次是FLT信号在SHDN重新使能后变成悬空电平。原因是FLT是开漏输出上拉电阻我又放在了距离芯片较远的地方布线上存在地线电位差导致MCU端认为一直是低电平。后来把上拉电阻从3.3V侧移到了靠近eFuse输出端同时增加了去耦电容现象消失。第三次是IMON噪声导致ADC误报。IMON引脚对负载电流变化的响应很灵敏输出侧哪怕有一个轻度的PWM负载波动IMON上就能看到对应的毛刺。我在IMON到ADC之间加了一个RC低通滤波时间常数选在几十微秒量级既能过滤高频毛刺又能保留短路检测需要的快速响应。5.3 参数整定的经验值把裕量留够经过这一轮实测我最后设定的参数是这样的项目设定值考虑持续负载电流3A实际运行平均约2.2A限流点3.5A给瞬时冲击留出6%左右裕量过压关断阈值16V相对12V标称留出33%余量欠压关断阈值8.5V防止电池深度放电时异常工作上电爬坡时间约15ms配合后端大电容不误触发软件过流报警阈值3.2A持续超过1s仅预警不自动关断这套参数在我测试的负载条件下表现稳定。故障注入测试做了差不多200次突发短路没有一次出现负载看到巨大峰值电流的情况FLT信号每次都被中断捕获主控侧状态机也都能按预期进入锁定或恢复流程。6. 把保护做成一门可运营能力扩展思路与最后提醒6.1 从单路保护到电源树管理做完单路保护之后我很快发现这个方案可以顺着往上扩展。STM32F103RC虽然只是一颗Cortex-M3内核的单片机但GPIO和ADC资源足够同时管理多路eFuse。我在同一块主板上做了三路保护12V主输入、5V外设电源、3.3V传感器电源。每路都用自己的限流电阻和OVP分压FLT分别接到三个EXTI引脚IMON分时复用ADC通道。主控侧状态机从单路扩展成一张电源状态表每个表项包含当前通道的限流设定、故障次数、锁定状态、当前电流值。这样做之后设备出现异常时能直接通过串口上报12V通道过流锁定当前电流0A请检查后端负载而不是等客户拆机检查才知道发生了什么问题。这种可诊断性在工业现场比单纯的熔断保护更有价值。6.2 热设计提醒eFuse的功耗不是零很多人在设计时只盯着保护阈值忽视了热设计。eFuse在正常导通时压降不是零功耗大概等于I²×RDS(on)。按3A电流、RDS(on)几十毫欧来算正常功耗大约是0.2W到0.5W。听着不大但芯片封装本身散热能力有限如果PCB Layout没有把散热焊盘的过孔打好长期跑满电流会触发热关断又是一个莫名其妙的偶发故障。我的做法是散热焊盘的正下方打9个0.3mm的过孔阵列到内层GND平面同时芯片周边铺铜并做开窗处理让焊锡能覆盖足够散热面积。测试时用一个热像仪扫了一下满载3A情况下芯片表面温度稳定在70℃以内符合预期。6.3 最后想说的话这套设计最让我满意的部分不是某个参数算得多准而是把电源保护从一锤子买卖的保险丝变成了可控、可测、可恢复的系统功能。TPS259483AYWPR负责快速粗暴地挡住危险STM32F103RC负责冷静地判断要不要继续供电配合起来真正解决了现场返修烧板的痛点。如果你正在设计类似的嵌入式或工业应用电源路径别省这颗芯片的钱。一次返修的差旅成本、停产损失足够买几百颗eFuse了。调试过程中踩过的那些坑如果碰到欢迎回来交流说不定你踩的坑比我这个更值得写一篇文章。
返回列表