ARTICLE DETAIL

资讯详情

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

eFuse+MCU实现工业电源浪涌保护与故障诊断设计

eFuse+MCU实现工业电源浪涌保护与故障诊断设计 做嵌入式的人大多有这种经验产品在实验室跑一天都没事一接到工业现场就随机死机。多数时候不是程序问题而是电源路径上的异常没有任何可控的处置机制保护动作全靠保险丝“赌”系统不会被击穿。我最近在一台远程 IO 控制器的电源接口部分做整改核心器件选了 TPS259483AYWPR 这颗 eFuse搭配 PIC18F45K80 做状态监测和故障管理把原来靠自恢复保险丝“硬扛”的 12V 供电改成了可诊断、可恢复、可上报的电源通路。这篇文章把整个设计过程拆开讲为什么这样搭、外围电路怎么配、固件状态机怎么收敛以及调板时踩过的几个坑。如果你也在做 PLC、工业网关、伺服驱动器辅助板、电池供电设备或者任何需要给电路板入口做可靠限流、防浪涌的嵌入式项目这套“硬件 eFuse 做主保护、MCU 做故障策略”的思路可以直接参考。它和传统保险丝方案最大的区别是不再把故障当成只能“事后更换”的意外而是当成一个可以被观测、被记录、被恢复的系统事件。1. 工业电源路径保护的三个硬需求浪涌、短路、可诊断1.1 三个实际场景先说我在实际项目里最常遇到的三种情况。第一个是上电浪涌。一块板子如果输出侧有比较大的滤波电容尤其是多块业务板并联的时候上电瞬间电容等效于短路充电电流可能到几十安培。传统方案经常表现为电源指示灯闪一下连接器打火或者前一级的 DCDC 被拉出保护。解决思路不是把电容改小而是把充电斜率控制住。第二个是输出侧短路。长线缆被金属机壳磨破、连接器进水、用户在板上短路调试这些都是工业现场的日常。自恢复保险丝能够扛住但动作慢动作后还要等它冷却现场人员只能干等。更麻烦的是保险丝没有“故障发生时刻”这个概念事后你根本说不清是短路、过载还是误操作。第三个是故障不可见。设备装到现场后维修人员只能通过“设备有没有输出”来判断好坏。可实际上很多电源问题是有前兆的电流持续偏高、输入电压刚刚越过门限、发生过一次瞬时短路但被侥幸恢复。如果没有检测和记录这些信息全部丢失。所以一个合格的工业电源路径保护方案要同时解决三个问题上电时限制浪涌、运行中快速限流/断开短路、事后能把故障原因和恢复过程讲清楚。1.2 eFuse 与 MCU 的边界这也是我为什么最终选择 eFuse 加 MCU 的原因。TPS259483AYWPR 这类集成式电子保险丝把功率 MOSFET、电流检测、限流比较器、欠压/过压比较器、过热保护都做在了一颗芯片里。它不需要外置采样电阻也不需要独立的栅极驱动硬件保护动作在微秒到毫秒级完成。短路时它是最后一道物理防线不能靠软件去救。PIC18F45K80 在这里的角色不是抢保护动作而是做故障策略。它读取 eFuse 输出的电流镜像信号判断是“正常上电浪涌”还是“真实过流”决定要不要重启输出、重启几次、什么情况下彻底锁死并上报。这个分工必须想清楚。PIC18F45K80 执行一次 ADC 采样加判断最快也要几十微秒到几百微秒而短路电流在这个时间尺度里足以烧毁 PCB 铜箔和连接器。MCU 能做的是在 eFuse 已经保护之后决定“恢复”还是“保持断开”。让 MCU 直接参与短路保护从设计上就是错的。2. TPS259483AYWPR 的硬件选型与引脚配置2.1 这颗 eFuse 能管什么TPS25948 系列是 TI 的集成式电子保险丝内部集成了功率 FET、电流检测和带隙基准。选它而不是普通负载开关是因为它不仅有通断功能还具备精确的电流限制、可编程的欠压/过压门限、启动斜率控制以及开漏的故障指示输出。我手里这块用的是 TPS259483AYWPR后缀里的 YWP 是封装信息R 表示卷带包装不代表电气规格差异。具体哪一档电流能力要看数据手册里的选型表。我这条板子的额定负载约 1.5A限流点设在 2A 左右留出大约 30% 余量避免电机启动、电容充电这类短时电流让限流误触发。芯片的关键引脚我按实际使用逐个说一下VIN / VOUT输入输出主功率路径。EN/UVLO使能兼欠压检测。可以用电阻分压设定最低工作电压低于该电压时输出关闭。OVLO过压检测。输入电压过高时关闭输出防止后面负载被高压打坏。ILIM限流设置。通过对地电阻设定正常工作时的限流值。dVdT输出启动斜率设置。对地电容越大输出爬升越慢上电浪涌越小。FLT开漏故障输出。故障时拉低正常时为高阻。IMON电流监测输出。MCU 根据这个信号判断当前输出电流做故障策略。2.2 外围参数计算的思路先说限流电阻。ILIM 脚虽然叫“设置电流”但它不是直接用欧姆定律算出来的而是按数据手册给出的ILIM K / R_ILIM这类经验公式计算K 值在数据手册的电气特性表里。我这边目标限流 2A按公式算完选了一颗精密电阻。这里有一个容易犯错的地方不要直接抄网上其他方案的电阻值不同型号、不同位数的 eFuse 对应的 K 值不同甚至同一颗芯片在不同温度下限流精度也不同。选完之后必须用电子负载验证实际的限流动作点。欠压和过压用电阻分压。EN/UVLO 和 OVLO 引脚内部都有比较器参考电压外部只要用分压电阻把输入电压映射到这个参考值即可。普通分压公式就是V_TH V_REF * (R_TOP R_BOT) / R_BOT以我这条 12V 供电的板子为例我希望输入低于 8V 时关闭输出高于 13.8V 也关闭输出避免 24V 电源误接时把后级打坏。具体电阻值要根据数据手册里的内部基准电压重新算不能只看分压比。dVdT 脚的电容决定输出爬升时间。大电容对应慢启动适合输出侧有大量电容的场景电容太小上电充电电流会顶到限流值反而触发保护。我的经验是先用 1nF 到 10nF 左右的电容作为起点接上真实负载后用示波器抓 VOUT 启动波形再根据波形调整。2.3 和 PIC18F45K80 的连接关系MCU 与 eFuse 的接口不需要很复杂我用到的信号如下PIC18F45K80 引脚作用连接说明LATC5EFUSE_EN 控制通过 2N7002 MOSFET 控制 EN/UVLO 节点高电平关断RC4FLT 输入接 eFuse 的 /FLT需要上拉到 MCU 电压域AN1IMON 采样IMON 经电阻分压和 RC 滤波后送入 ADCAN2VOUT 采样输出电压经分压后送入 ADC判断后级是否在线ECAN TX/RXCAN 通信经 MCP2562 收发器上报故障状态这里有一个安全逻辑必须提前确认MCU 复位期间不能影响 eFuse 的默认输出状态。我的做法是 EN/UVLO 节点默认由电阻分压网络保持使能2N7002 的栅极外接 100kΩ 下拉到地。PIC 上电复位期间 GPIO 为高阻2N7002 不导通eFuse 保持正常可控状态只有 MCU 初始化完成、确定需要关断输出时才会拉高 LATC5。这样即使 PIC 跑飞也不会导致负载电源被无故切断。3. 完整电源路径电路搭建从入口到负载3.1 输入端口的基本防线eFuse 能解决限流和开关问题但它不是防雷器件。工业设备的电源入口通常要应对静电、浪涌、反接和接错线这一层必须在 eFuse 之前做好。我在实际板上的顺序是连接器 → TVS → 慢熔保险丝 → 反接保护 P-MOS → 输入滤波电容 → eFuse VIN。TVS 放在最前面负责吸收瞬态浪涌我选的是峰值功率足够的 SMBJ 系列。慢熔保险丝不是给正常过载用的而是给“灾难性失效”做最后一道隔离比如 eFuse 本身击穿、板子烧穿短路。反接保护用一颗 P-MOS 管做高边开关因为 12V 系统用二极管会有接近 0.5V 的压降和发热P-MOS 的导通损耗要小得多。输入滤波电容则必须紧贴 eFuse 的 VIN 和 GNDPCB 走线要短这颗电容对稳定性影响很大。3.2 主功率通路上的 eFuseeFuse 的核心外围非常简洁VIN 接输入母线VOUT 接负载。ILIM 脚对地电阻设定限流点。EN/UVLO 和 OVLO 分别用电阻分压设定欠压、过压门限。dVdT 脚对地电容设定启动斜率。/FLT 上拉到 MCU 的电源域。IMON 经过 RC 滤波后送给 PIC 的 ADC。输出端我保留了 47µF 到 100µF 的陶瓷电容PCB 上靠近连接器再放一颗。eFuse 启动时通过 dVdT 控制输出爬升这些电容会被平稳充电。如果输出端接的是长线缆建议在连接器位置再加一个小容量的 TVS防止线缆引入的静电耦合到 VOUT 上。3.3 给 MCU 留一条“眼睛不能断电”的供电这里是我认为整套设计里最容易被忽略的一点MCU 的供电不能从 eFuse 的输出侧取。如果 PIC18F45K80 和负载一样挂在 eFuse 的 VOUT 后面那么当负载短路、eFuse 关断时MCU 也会跟着断电。等短路消失、eFuse 尝试恢复MCU 还在重新上电根本无法完成故障记录、重启计数、CAN 上报这些工作。所以我在设计中单独加了一路小功率 LDO从 eFuse 输入侧的 VBUS 取电稳定输出 5V 给 MCU。这路供电再串一个几百毫安的限流电阻或小保险丝避免 MCU 板级故障反过来把整条电源拉死。这样无论主输出侧发生了什么MCU 始终活着能够在故障发生后继续执行“诊断 → 等待 → 重试 → 报告”的完整流程。4. PIC18F45K80 固件状态机与故障恢复策略4.1 初始化哪些外设PIC18F45K80 是一颗带增强型 CAN 控制器的 8 位 MCU整机跑在 5V 下抗干扰能力和 IO 电平都比较适合工业板卡。它内部还有 12 位 ADC 和数据 EEPROM做电流采样和故障日志很合适。固件里初始化部分大概是这样的void system_init(void) { // 时钟初始化使用外部晶振 PLL OSCCONbits.IRCF 0b111; OSCCONbits.SCS 0b00; // EN_CTL 引脚输出 TRISCbits.TRISC5 0; LATCbits.LATC5 0; // 默认不关断 eFuse // FLT 引脚输入数字功能 TRISBbits.TRISB4 1; ANSELBbits.ANSB4 0; // IMON 采样引脚模拟输入 TRISAbits.TRISA0 1; ANSELAbits.ANSA0 1; ADCON0 0x01; // 打开 ADC 模块 ADCON1 0x0C; // 右对齐时钟分频 // 使能看门狗使用窗口模式 WDTCONbits.WDTPS 0b10010; // CAN 模块初始化进入配置模式设置波特率 CANCON 0x80; while ((CANCON 0x80) 0); // CAN 波特率寄存器配置... CANCON 0x00; // 恢复正常模式 }这里有两个容易被忽略的点。一是 ADC 初始化时要先关闭相应引脚的数字输入缓冲否则模拟电压会被数字输入钳位读出来的值永远不对。二是看门狗不是“顺手开”而是为了让 MCU 在电磁干扰严重的现场跑飞后能自动复位同时 eFuse 的输出状态不因 MCU 复位而改变。4.2 IMON 电流处理和功率状态判断IMON 引脚输出的信号经过 RC 后进入 ADC固件里不能直接把单次采样值当电流判断依据。我做了两层处理第一层是硬件 RC把高频噪声滤掉一部分第二层是软件滑动滤波。实际代码里我用一个移位寄存器做一阶低通static uint32_t imon_filter 0; uint32_t imon_raw adc_read(CH_IMON); // 简单低通新值占 1/32旧值占 31/32 imon_filter imon_filter - (imon_filter 5) imon_raw; uint32_t imon_cur imon_filter 5;电流值换算时不要直接用数据手册的理论斜坡系数因为每块板的 IMON 分压电阻、参考电压都有误差。我建议在产测时加一个已知电流比如 1A记录 ADC 原始值反推出“每 ADC 计数对应的电流”把校准系数写进数据 EEPROM。这样即使分压电阻误差达到 1%最终测得的电流也基本一致。4.3 故障确认与恢复次数管理MCU 的核心逻辑是一个电源状态机。我把它定义成五态关机、启动、正常运行、故障、等待重试。typedef enum { PWR_OFF 0, PWR_STARTUP, PWR_RUN, PWR_FAULT, PWR_WAIT_RETRY } PWR_STATE; PWR_STATE pwr_state PWR_OFF; uint8_t retry_count 0; void pwr_task(void) { switch (pwr_state) { case PWR_OFF: EFUSE_EN 1; // 高电平关断 eFuse if (start_request !FLT_RAW) pwr_state PWR_STARTUP; break; case PWR_STARTUP: if (FLT_RAW 0) { fault_reason FLT_AT_START; pwr_state PWR_FAULT; } else if (startup_delay_ok()) { pwr_state PWR_RUN; } break; case PWR_RUN: if (FLT_RAW 0) { fault_reason FLT_IN_RUN; retry_count; pwr_state PWR_FAULT; } else { pwr_supervise_current(); } break; case PWR_FAULT: EFUSE_EN 1; // 先关断 save_fault_log(fault_reason, retry_count); if (retry_count MAX_RETRY) { pwr_state PWR_OFF; // 累计 3 次锁死 } else { retry_delay 0; pwr_state PWR_WAIT_RETRY; } break; case PWR_WAIT_RETRY: // 等待时间根据故障原因区分 if (retry_delay retry_interval_ms[fault_reason]) { EFUSE_EN 0; // 重新使能 pwr_state PWR_STARTUP; } break; } }为什么要有 retry_count因为工业现场的过流很多时候不是持续短路而是像电机堵转、电容漏电这类间歇性故障。如果只做“故障就锁死”现场必须人工断电才能恢复可维护性差如果做“无限重启”遇到真正的短路eFuse 会在几毫秒内反复关断设备永远在重启反而掩盖故障。我的策略是瞬时故障允许快恢复连续 3 次故障则进入锁死状态等待人工介入。重试间隔也要分类。比如上电启动时故障我默认是多等一会儿再试因为可能是前端电源带载能力不足运行中瞬时过流重试间隔可以短一些如果是欠压/过压类故障则必须等电压恢复正常并稳定后再尝试。4.4 CAN 上报与本地日志PIC18F45K80 的 CAN 模块在返回正常模式后只要把故障信息编码进一帧扩展帧或标准帧就可以上报给 PLC 或上位机。我这里自定义了一帧 8 字节数据内容如下字节含义Byte0电源状态0OFF1STARTUP2RUN3FAULTByte1最近一次故障原因1过流2欠压3过压4启动失败Byte2当前重启计数Byte3保留Byte4-5当前 IMON 电流 ADC 原始值Byte6-7当前 VOUT 电压 ADC 原始值故障日志除了通过 CAN 上报还写入 PIC18F45K80 片内数据 EEPROM。EEPROM 写入时间比较慢写入期间尽量不要触发看门狗超时否则日志写到一半被复位数据会损坏。实际代码里先关看门狗等写入完成再重新喂狗。只记录“最后一次故障”是不够的。我建议至少保存最近 5 到 10 条故障记录包括时间戳、故障原因、重启次数。这样设备即使已经锁死现场人员接上调试器或者读 CAN 都能知道这段时间里发生了什么。5. 实测、调试与踩坑记录5.1 一上电 /FLT 就被拉低的排查第一次打样回来我最常遇到的故障是一上电/FLT 立刻被拉低输出根本起不来。排查顺序我建议这样走先用电子负载直接接到 VOUT从很小电流开始往上加确认限流点正确。如果负载还没加就保护问题大概率出在启动阶段。量一下 ILIM 电阻实际阻值。很多贴片电阻有温漂和精度问题限流点会偏低。看 dVdT 电容是否贴错或者没贴。电容太小输出爬升太快大容量输出电容在启动瞬间会触发限流。检查输出有没有短路或焊桥。这个最蠢也最多见。有一次我调了整整半天最后发现是 dVdT 电容的封装焊反了启动时间几乎为零。把电容值换大之后输出电压才正常爬起来。eFuse 这类芯片的问题很多时候不是芯片本身而是外围参数和实际负载条件不匹配。5.2 IMON 噪声导致的误判IMON 信号在空载时还算干净一接入带电机或者开关电源负载就会叠加不少高频噪声。如果 MCU 直接拿单次 ADC 值判断“过流”很可能在电机启动瞬间误判成短路把正常输出给关了。我的解决办法是硬件和软件同时做。硬件上IMON 先经过一个 1kΩ 电阻加 10nF 电容的 RC 滤波再进 ADC软件上故障判断要加去抖时间一般连续 4ms 都检测到过流才算故障。为什么可以放心加这个 4ms因为真正的短路保护是 eFuse 硬件完成的不是 MCU。MCU 慢这 4ms不会让系统烧毁只会避免误报。5.3 感性负载关断瞬间的反冲这个坑是我在带继电器和电磁阀负载时踩到的。eFuse 在 MCU 控制下关断输出后VOUT 侧如果还有感性负载线圈电流会因为没有回路而产生一个很大的反冲电压可能直接把 eFuse 的输出脚打坏。后来我在每个感性负载旁边都加了续流二极管并在 VOUT 到 GND 之间加了一颗钳位 TVS。这个 TVS 不是给正常工作用的而是专门吸收关断瞬间和线缆感应的尖峰。电源路径保护不能只看“往里看”也要看“往外看”。5.4 PCB 布线与地弹的教训TPS259483AYWPR 这类小封装 eFuse底部通常有散热焊盘。PCB 上必须打足够多的过孔连接到内层地铜皮否则大电流工作时结温会迅速上升还没到限流点就触发热关断。我一开始为了省事散热焊盘只通过一个小过孔连接结果电子负载加到 1.8A 时芯片就热关断了表面却摸起来不烫。拆下来重新焊发现焊盘的导热孔太少热量被限制在封装内部。把过孔加到十几个之后问题消失。还有一个地弹问题。IMON、/FLT 这些信号地如果和主功率回路走在一起负载变化时参考地会跳动导致 MCU 读到的 IMON 电流忽高忽低。我把主功率电流路径和信号地做了单点连接模拟地和功率地分开布线再在 MCU 的参考点处汇合误报率明显下降。6. 这套方案还能怎么扩展6.1 多路电源路径管理如果板子上有多个供电域比如 12V 模拟电源、5V 数字电源、外设电源每路都可以用一个 eFuse再把所有 /FLT 和 IMON 交给 PIC18F45K80 统一管理。PIC18F45K80 的 CAN 和控制能力足够做多路电源的分时启动。比如先启动 MCU 电源域等固件初始化完成再启动外设域某一路上电失败其他路不受影响。这种“电源树”管理模式比用一堆分立 PMOS 加保险丝可靠得多。6.2 热插拔业务板/背板场景在背板或者热插拔业务板场景里连接器插拔瞬间最容易产生拉弧和母线跌落。eFuse 的 dVdT 启动斜率和限流功能天然适合做热插拔控制。配合 MCU 还可以做得更细业务板插入后先不给电MCU 读取板级 ID确认是合法板卡后再启动 eFuse 输出如果检测到板卡电流异常立即断开并上报。这个流程用传统保险丝完全做不到。6.3 与上层协议联动因为 PIC18F45K80 自带 CAN故障状态可以无缝并入设备已有的通信协议。比如 PLC 通过 CAN 下发“重启某路电源”命令MCU 收到后把对应 eFuse 关闭再开启现场维修人员不用断电重启整台设备只需要在 HMI 上点一下恢复。我实际做下来最大的体会是这套设计最值钱的地方不在于把保险丝换成了芯片而在于把电源路径从一个“不可观测的黑盒子”变成了一个“可观测、可干预、可恢复”的受控对象。先把 eFuse 的硬件保护调稳再去写 MCU 状态机如果硬件侧一上电就 /FLT软件写得再漂亮也白搭。起步阶段先拿示波器把 VOUT 启动波形抓好把限流点和 dVdT 斜率调出余量再让 MCU 做恢复策略这样系统才真正具备工业现场需要的稳定性。
返回列表