ARTICLE DETAIL

资讯详情

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

eFuse+MCU+CAN:工业电源路径保护的可控诊断方案

eFuse+MCU+CAN:工业电源路径保护的可控诊断方案 这两年做工业控制板我见过太多项目把大部分精力扑在 MCU、通信、算法和业务逻辑上唯独电源入口处的保护往往就是一颗保险丝加一个防反二极管甚至有的直接把外部 24V 怼进板内。平时不出事倒也罢了一旦现场发生过载、负载短路、接线错误或者大电容充电瞬间的浪涌轻则板子重启重则直接冒烟返工和售后成本一下子就上来了。这篇文章想聊的就是怎么用TPS259483AYWPR这颗 eFuse加上一颗PIC18F46K80单片机把嵌入式和工业应用里的电源路径保护做成一套可控、可诊断、可快速复现的方案。这套组合既能处理电路层面毫秒级的过流和过压切断又能把事件状态通过 CAN 上报给上位机或主控是工业电源管理里很典型也很实用的一种做法。1. 电源路径保护为什么必须认真对待1.1 一个容易被低估的设计环节先还原一个真实场景。设备内部有一个 24V 转 5V 的 DCDC后端挂着一块电容不小的主控板和一个电磁阀驱动电路。上电瞬间DCDC 的输入电容和负载电容需要充电瞬时电流可能是稳态电流的好几倍。如果输入端只有保险丝保险丝的额定电流选大了短路时起不到保护作用选小了正常的浪涌电流又会把保险丝熔断现场维护就只能换保险丝非常头痛。更麻烦的是工业现场经常有很长的电源线线缆本身存在寄生电感。热插拔、接触不良、感性负载关断都会在输入端产生明显的电压尖峰。在这种环境下仅靠保险丝和简单的 TVS是不能满足可靠保护要求的。电源路径不仅要在正常时候把电输送给负载还要在异常时候限流、切断、报警并且要让处理器知道发生了什么。这些需求传统保险丝给不了。1.2 传统保险丝的几个痛脚传统保险丝的核心问题是“一次性”和“响应慢”。熔断丝的熔断时间与过流倍数之间存在反时限特性电流越大熔断越快但仍然有相当长的热积累过程。对半导体器件来说几百毫秒的过流足以让 MOSFET、二极管和 DCDC 芯片烧毁。自恢复保险丝PPTC响应速度更慢精度也差而且内阻随温度变化很大不适合作为精密的限流器件。还有一种做法是用分立元件搭一个限流电路比如采样电阻加比较器控制 PMOS。功能上是可行的但元件多、调试难、阈值受温度影响大批量一致性很难保证而且很难在紧凑的 PCB 上做到很好的性能。1.3 电子保险丝的出现改变了玩法TPS259483AYWPR 这类器件在行业内一般叫电子保险丝eFuse或电源路径保护开关。它在内部集成了功率 MOSFET、电流检测、过压/欠压判断、软启动控制和故障输出逻辑。使用方不需要再去搭一堆分立元件只需要按数据手册设置限流电阻、过压分压电阻和软启动电容就能得到一个可编程、可重复、带状态反馈的“智能开关”。它的价值在于几个地方响应速度快短路时在极短时间内就能把电流限制或关断阈值可调同一颗物料可以适应不同的负载电流有故障输出信号可以直接给 MCU 电平触发断开之后不会像保险丝一样需要更换可以通过使能脚重新开启。这就让系统设计从“坏了换零件”进化到“坏了自动判断、自动恢复、主动上报”。这才是我个人觉得真正值得做的东西。2. TPS259483 和 PIC18F46K80 的角色分工2.1 eFuse 负责的“硬件快保护”TPS259483AYWPR 来自 TI 的 TPS25948 系列这类器件本质上是一个带保护逻辑的集成负载开关。它在输入和输出之间串联了一颗低导通电阻的 MOSFET并通过对电流采样、电压检测和温度检测来实时控制这颗 MOSFET 的导通状态。我习惯把它的工作逻辑分成四层来理解。第一层是正常导通负载电流通过 MOSFET 流向后端第二层是过流限制当电流超过设定的阈值时内部环路会限制电流不再上升避免后端短路时产生破坏性电流第三层是过压/欠压切断当输入电压高于或低于设定的窗口时开关迅速断开防止电源波动传到负载第四层是故障上报状态脚输出开漏信号告诉 MCU 当前发生了哪一类异常。这一整套反应在硬件层面完成不依赖 MCU 的软件逻辑就算单片机死机或者升级固件保护功能仍然在生效。这种硬件级保护非常适合 24V 工业母线这种环境。实际应用中我经常把 OVP 设置在 30V 左右把限流设置在负载最大电流的 1.2 倍到 1.5 倍之间这样既能保证正常工作的余量又能避免把故障电流放进板内。2.2 单片机负责“慢逻辑管理”PIC18F46K80 是 Microchip 的一款 8 位 MCU内置 128KB Flash 和 4KB RAM同时带有增强型 CAN 控制器和高精度 ADC。在电源管理这个应用里它做的事情不是直接去限制电流而是做“决策、监视、通信”。具体来说MCU 有三个任务。第一个任务是控制使能脚让电源输出在上电时序中按预定的时间窗口开启避免多路电源同时启动产生过大冲击。第二个任务是采集降采样后的电流监测信号和输出电压信号通过 ADC 持续了解电源路径的实际工作状态。第三个任务是在接收到故障信号后执行状态机逻辑判断是瞬时故障还是永久故障决定是否重试、锁定或切换到备用电源。有一个关键点想特别说明单片机的逻辑再严密也不要指望它去承担“保护”的责任。保护必须发生在硬件层MCU 只负责“报告”和“恢复”。这种分层设计是嵌入式电源可靠性的基础逻辑顺序不能反。我在很多项目里都提醒团队MCU 死了电源路径保护也得照常工作。2.3 为什么用 CAN 做监控上报工业场景里MCU 到主控板之间的距离往往有几米甚至几十米普通 UART 在这种环境下抗干扰能力不足I2C 和 SPI 也不适合长距离传输。PIC18F46K80 自带 CAN 控制器正好适合这条链路。CAN 是差分信号抗共模干扰能力强而且协议本身有优先级仲裁和错误检测机制非常适合用于传输电源状态、故障代码和恢复操作指令。这套组合在架构上是很好看的TPS259483 管住“电流进不出格”PIC18F46K80 管住“状态可视、故障可管”。设备维护人员在控制室就能通过 CAN 报文看到当前电流值、上次故障原因和重试状态而不是拎着万用表去现场一块板子一块板子查。3. 硬件设计与参数计算3.1 整体拓扑先画清楚把业务逻辑放一边先看电源路径从输入到负载之间到底经过哪些环节。典型的拓扑是这样的外部 24V 输入先经过 TVS 管做浪涌钳位然后接输入电容再进 TPS259483 的输入引脚eFuse 的输出引脚通过一段低阻抗走线连接后级 DCDC 和负载。PIC18F46K80 用两个 GPIO 分别连接 EN 和 FLT 脚用一路 ADC 采样电流监测信号CAN 收发器挂在 MCU 的 CAN 控制器上。在这条链路上eFuse 的输入和输出之间就是那颗内部 MOSFET所以它天然就是一个电源开关。画原理图的时候别把它当成普通保险丝它是受控开关必须纳入 MCU 的逻辑控制范围。我见过有人把 EN 直接接电源当作永久导通来用虽然也能保护但等于放弃了整个可控性在我看来很可惜。3.2 过压和欠压阈值计算设置 TPS259483 这样的 eFuse一般需要决定三个关键参数输入欠压阈值、过压阈值和限流阈值。欠压和过压通常通过引脚上的电阻分压网络确定。设计目标要结合系统实际以 24V 额定供电为例假设欠压阈值为 18V过压阈值为 30V这是因为工业母线上允许一定范围的电压波动同时要保护后级电路不被超过 30V 的异常电压损伤。分压网络的计算思路很简单就是让两个阈值对应的引脚电压等于器件内部的参考电压。假设 OVP 引脚内部参考电压是 1.2V分压网络由 R1 接到电源输入R2 接到 GNDOVP 引脚接在 R1 和 R2 的中间节点。在 VIN30V 时让中间节点等于 1.2V那么 VIN×R2/(R1R2)1.2V整理后得到 R1/R2(VIN-1.2)/1.2。如果 R2 取 8kΩR1 约等于(30-1.2)/1.2×8kΩ192kΩ所以选择标准电阻 196kΩ 即可。这里有一点需要注意电阻精度至少要 1%推荐 0.1% 或者挑选出精度足够的低温漂电阻否则阈值会飘得厉害。同样欠压保护也是同一个思路只不过参考电压接到不同的引脚。因为器件内部有迟滞和稳压逻辑计算时需要留出一定余量不能拿着公式算出值就直接焊上去最好留一个备用电阻位方便在调试时候微调。3.3 限流阈值与软启动的配合限流阈值是电源路径保护最核心的参数。TPS25948 系列一般通过在 ILIM 引脚接电阻来设定限流值不同型号的系数 K 不同计算公式通常为 I_LIM K / R_ILIM。假设你选用的这款器件规格书中 K2500这里只是举例说明设计方法具体系数务必打开你手里那本数据手册确认希望限流值为 2.5A则 R_ILIM 2500 / 2.5 1000Ω。设计时还要关注电阻的封装功耗虽然流过 ILIM 电阻的电流很小功率可以忽略但电阻精度对限流精度影响很大建议选用 1% 以上的精度。软启动是为了解决后端大电容充电引起的浪涌问题。eFuse 的软启动脚一般通过一个电容来控制输出电压的上升斜率电容越大上升越慢启动浪涌越小。在工程上我会先按后级最大容性负载计算浪涌电流如果 DCDC 输入电容是 1000μF启动电压从 0V 升到 24V时间如果设定为 5ms充电电流约为 24V×1000μF/5ms4.8A。如果这个值超过了限流点就必须把软启动时间拉长例如改成 10ms充电电流就降到 2.4A。实际设计时还要考虑后级 DCDC 本身的启动行为软启动时间太短会让限流保护触发太长又会让系统上电变慢这里需要反复权衡。3.4 PCB 布局不是玄学电源路径保护这部分的布局我吃过不少亏总结下来的经验主要有几条。第一输入电容必须紧挨着 eFuse 的输入引脚输出电容紧挨着输出引脚回路面积越小寄生电感越小过压尖峰就越小。第二ILIM 电阻和软启动电容的参考地要直接回到 eFuse 的 GND 引脚不要绕到远处再回来这样最干净。第三那条承载主电流的走线尽量加宽或者铺铜因为 eFuse 的散热很大程度依赖 PCB 铜箔焊盘底下要多打散热过孔。还有一个容易被忽略的细节电流监测信号和 FLT 信号不要和 PWM、CAN 之类的信号扎堆走线高频噪声会耦合过来。模拟信号路径尽量短必要时包地处理。做 EMC 测试的时候你会发现这些细节比多加滤波电容更有效。4. MCU 固件上电、监控、故障管理4.1 硬件准备好了软件怎么初始化PIC18F46K80 这部分代码核心不是某个高深的算法而是把状态机写清楚。初始化主要做三件事配置 GPIO让 eFuse 的 EN 脚为低电平确保上电时电源输出默认关闭配置 ADC把电流监测通道设为模拟输入并选择合适的参考电压配置 CAN 控制器和中断准备好故障上报通道。初始化完成后MCU 并不直接打开 EN而是先等一个短暂延时确认外部电源电压已经稳定。这个延时一般用几十毫秒就够了避免输入电压还未建立就到阈值附近时贸然开启负载。很多故障其实发生在开机瞬间不是 eFuse 不好是 MCU 太心急。一个更加稳的做法是在打开 EN 之后再等一段软启动时间然后采样输出反馈或电流监测确认已经进入带载状态。只有确认正常后状态机才进入 RUN 态。如果在这段时间里出现 FLT 中断就按故障处理逻辑走。4.2 一个精简的状态机模型我常用的状态机分为四个状态断电、上电、运行、故障。断电状态下 EN 为低所有标志清零。上电状态下开启使能等待启动完成若正常则进入运行状态异常则进入故障状态。运行状态中持续监测 FLT 和电流值一旦发生过流或过压立刻转入故障状态。故障状态最重要的是重试策略。对工业设备来说瞬时故障和永久故障要区别对待。瞬时故障例如线缆插拔时的短暂接触不良可以在几百毫秒后自动重试一次永久故障例如后级短路重试再多也没有意义应该锁定故障状态并停止尝试等待人工处理。我在代码里一般用故障计数器来实现重试一次计数加一连续三次全部失败就彻底锁死只在收到清故障指令时才复位。typedef enum { POWER_OFF, POWER_STARTUP, POWER_RUN, POWER_FAULT, POWER_LATCH } power_state_t; typedef struct { uint8_t fault_count; uint8_t last_fault_code; } power_mon_t; void power_state_machine(power_mon_t *pm) { switch (current_state) { case POWER_OFF: EFUSE_EN 0; if (power_ok_to_start()) current_state POWER_STARTUP; break; case POWER_STARTUP: EFUSE_EN 1; if (efuse_startup_finished()) current_state POWER_RUN; else if (efuse_fault_pending()) { pm-last_fault_code read_fault_code(); current_state POWER_FAULT; } break; case POWER_RUN: if (efuse_fault_pending()) { pm-last_fault_code read_fault_code(); current_state POWER_FAULT; } else { update_avg_current(); } break; case POWER_FAULT: pm-fault_count; if (pm-fault_count MAX_RETRY_COUNT) { current_state POWER_LATCH; } else { delay_before_retry(); current_state POWER_STARTUP; } break; case POWER_LATCH: EFUSE_EN 0; break; } }这段代码只表达逻辑参考具体引脚定义和寄存器操作要按你的硬件来替换但它体现了一个很重要的产品特性软件逻辑永远不能覆盖硬件保护只能指挥启动时机和处理故障后的动作。4.3 使能信号要不要加滤波很多工程师会忽略一点MCU 刚上电时GPIO 电平状态是不确定的。如果 EN 脚恰好被拉高而 eFuse 已经接通后端负载在上电瞬间就被开启容易诱发启动顺序混乱。解决的方法是在 EN 信号上增加一个下拉电阻确保 MCU 没初始化时 EN 保持低电平。如果需要更稳妥还可以加一个小电容形成 RC 延时避免误触发。这个下拉电阻非常便宜却能在量产阶段避开很多奇怪故障。4.4 电流监测与阈值判断TPS259483 这类 eFuse 一般会有电流检测输出脚输出一个与负载电流成比例的电流或电压信号。PIC18F46K80 的 ADC 负责把模拟量转换成数字值通过标定得到实际电流值。标定方法很简单在调试阶段用电子负载设置几个已知电流点读取 ADC 值做线性拟合并写入 Flash 校准参数里。在运行状态中固件可以周期性地读取电流与限流点比较。虽然硬件已经做了限流保护软件层面的监测仍然有价值因为 MCU 可以看到电流何时接近阈值提前判断负载变化趋势。比如有电机负载时堵转会让电流快速上升软件记录这条曲线对设备维护十分有用。5. CAN 总线诊断与故障上报5.1 为什么要把诊断跑在总线上电源状态这类信息如果只在本地 LED 上显示对现场维护几乎没有帮助。工业设备通常有几十上百个节点不可能每台设备都走过去看灯。把电源状态通过 CAN 上报就能在组态软件或诊断工具上集中看到所有节点的供电健康度。这也是很多工业设备制造商愿意在电源路径上多花钱的原因故障可查、责任可判、维护成本显著降低。PIC18F46K80 的 ECAN 模块支持标准帧和扩展帧实际使用中建议用标准帧减少总线上不必要的负载。每一帧可以承载 8 字节数据对电源状态这种信息量很小的对象来说绰绰有余。5.2 推荐的一种报文结构我在项目里习惯用两条报文一条周期心跳报文一条事件故障报文。周期报文大概每 100ms 或 500ms 发一次包含当前状态、电流、输入电压和温度这些连续监测量。事件故障报文只在故障发生时发送包含故障类型和故障计数值这样即使总线上有大量周期报文异常也能被立刻识别。报文数据域可以这样分配第 0 字节是工作状态0 代表断电1 代表运行第 1 字节是电流值按 0.01A 为单位换算第 2 字节是电压值按 0.1V 为单位换算第 3 字节是故障代码0 表示无故障1 表示过流2 表示过压3 表示欠压4 表示热保护第 4 字节是故障重试次数。另外还可以附加 CRC 字节用来保证关键数据在总线传输中的完整性。5.3 PIC 侧发送流程怎么写发送流程的重点不是寄存器操作而是状态读取和时序处理。固件里维护一个发送缓冲区每次要发送时把原始值填入对应字节然后调用发送函数。需要留意的是 CAN 发送不要阻塞主循环如果总线忙应该把报文放回缓冲队列轮询发送完成标志后再清空。故障报文必须立即发送不能等到下一个周期节点才发否则紧急情况下会丢信息。void pack_power_status(uint8_t *buf, power_mon_t *pm) { buf[0] (uint8_t)current_state; buf[1] (uint8_t)(pm-avg_current_a * 100.0f); buf[2] (uint8_t)(pm-input_voltage_v * 10.0f); buf[3] pm-last_fault_code; buf[4] pm-fault_count; }实际生产时还会在 CANOpen 或 J1939 这种上层协议基础上封装但底层思路大同小异。先把单字节的数据格式定义清楚后续不管接什么上位机都会省很多事。6. 实测中常踩的坑与排查方法6.1 大电容启动导致限流误触发这是我第一次用 eFuse 做电源保护时遇到的最典型问题。板卡后级有一颗 2000μF 的储能电容限流点设成 2A上电瞬间输出充电电流远超限流点eFuse 立刻进入限流模式后端电压爬不上去DCDC 启动失败FLT 不断复位并触发重试。排查过程比较直接先把软启动时间拉长然后看输出波形确保启动电流低于限流点。如果软启动时间已经接近可接受范围但电流仍然顶到阈值就需要考虑把限流点适当上调。很多工程师遇到这种事第一反应是换更大电流的 eFuse我不建议这么做应该是先算清楚启动浪涌到底多大再决定参数才是正路。6.2 分压电阻引起过压保护阈值偏移过压保护的分压电阻如果用了陈年老库存的 5% 电阻阈值会偏得非常厉害。比如标称 30V 动作的 OVP实测可能在 27V 或者 33V 才动作这种偏差在单板调试时不容易发现到了系统联调时就会造成一堆莫名的设备掉电。解决办法看似简单但管用分压电阻使用 1% 精度甚至 0.5% 精度焊接完成后用直流电源从低压慢慢往上拉记录实际动作点。如果偏离目标值就按实际值替换电阻调整。好习惯是一次性在原理图里设计两个微调电阻位别太相信数字计算到最终焊完之后的精度。6.3 FLT 信号上的噪声毛刺FLT 脚通常是开漏输出MCU 侧需要接上拉电阻。如果上拉电阻阻值太大或者引线太长噪声容易导致误中断。比如有 100kΩ 上拉加 10cm 长的走线只要电源线上有一点抖动FLT 就会产生毛刺MCU 读到错误故障后立刻关断输出系统表现得非常神经质。解决思路是给 FLT 信号加上 RC 滤波R 取 1kΩ 到 10kΩC 取 1nF 到 10nF具体按故障响应速度去选。过流这种真故障发生时FLT 会保持一段时间的低电平RC 滤波不影响真实事件响应但干扰毛刺很窄会被电容吸收掉。另外上拉电阻可以取 4.7kΩ 到 10kΩ不要为了省功耗取太高。6.4 热耗和散热处理eFuse 的导通电阻并不是零负载电流大的时候结温会上升。我的一个设计案例里负载电流达到 3A器件封装散热不足持续工作十几分钟后 eFuse 进入热保护设备反复断电。这种问题通过示波器看不出来要用热成像仪才看得清楚。解决路径有两条。第一加大 PCB 铜箔面积焊盘下面打阵列过孔让热量尽快到内层和背面铜皮第二选择合适的限流点和负载匹配如果必须要长时间跑大电流那就别硬扛改选 Rds(on) 更小的型号或者外部扩流方案。温度保护本身是为了保护器件不坏但一个合理的设计不应该让系统反复触发热保护。6.5 量产前验证清单根据我的经验做电源路径保护相关产品量产前至少要过一遍这样的测试使用可调直流电源把输入电压从 0V 缓慢升到额定值确认欠压和过压动作点用电子负载从 0A 到短路做一次性加载抓取输出电流限流波形做快速开关机 100 次确认使能时序和重试逻辑稳定在环境温度上限持续工作 2 小时确认热保护不会误动作最后用示波器记录启动瞬间的电流波形与软件参数对照确认整套系统余量充足。这套测试内容不复杂但很有价值。很多看似“偶发”的故障其实都是验证不充分留下的隐患。7. 最后分享几个工程习惯我个人习惯在正式调试前先把 MCU 的固件烧进去但 eFuse 的 EN 引脚用跳线断开。这样做的好处是我可以单独验证 MCU 的逻辑和 CAN 通信确认状态机没有跑飞再去把电源路径接上。电源域一接通测试就不再是纯软件问题了出现任何异常都更难排查。这个习惯帮我避开了很多“硬件软件互相甩锅”的局面。另外调试期间我会在每个关键的 GPIO 信号上做逻辑分析包括 EN、FLT、CAN TX、CAN RX再配合示波器抓 eFuse 的输入输出电压波形。逻辑分析能告诉我状态机是否按预期跳转示波器能告诉我硬件真正的保护动作发生在哪几个微秒。两边对上之后整个系统的工作逻辑就很清晰了。如果你也正在做嵌入式或工业设备的电源路径保护设计我会建议先把 eFuse 的数据手册读透尤其是 ILIM 系数和软启动电容的计算表然后照着本文的思路把硬件保护、MCU 状态机和 CAN 诊断三层搭起来。这个方案最大的优点不在于用了多高级的算法而在于把原来不可见、不可控的电源故障变成了一条清晰可见、可定位、可恢复的数字事件。踩过几次坑之后你就会发现电源路径保护做得好不好直接决定一台设备在现场是安心跑一年还是三天两头被叫去维护。
返回列表