首页 / 资讯中心 / 文章详情

基于TPS259483与PIC18F45K80的智能电源路径保护设计

基于TPS259483与PIC18F45K80的智能电源路径保护设计 ★ FEATURED ARTICLE
1. 为什么需要专门管电源路径嵌入式系统和工业控制器里电源设计往往是被低估的一环。很多人觉得“只要电压对、电流够就行”可真正到了现场上电瞬间的浪涌、负载短路、电源反接、甚至一路电源抖动导致整个板卡复位这些问题远比想象中常见。用一句话概括电源路径保护不是“锦上添花”而是系统稳定性的底线。我一直在做这类板级设计早期用的方案很原始保险丝加TVS管再配一个大电容。保险丝确实是最后一道防线但它响应时间太慢短路时可能已经把后端电路打坏TVS只能限制瞬态电压对过流无能为力至于说用分立元件搭限流电路参数漂移和调试成本都让人头疼。后来开始用集成电子保险丝eFuse才发现原来电源路径可以做得这么干净。这次的板卡就是典型场景主控是Microchip的PIC18F45K80负责现场数据采集和通信后端还有传感器、运放、通信接口等一路多路供电。MCU本身抗干扰能力是有的但电源噪声和异常冲击会造成程序跑飞甚至Flash损坏。为了把危险隔离在电源入口我选了TI的TPS259483AYWPR作为主电源路径保护芯片。这颗器件配合PIC18F45K80做配置和状态监控正好覆盖了工业现场最常见的几类电源故障。这篇文章我会从器件选型、电路设计、软件配置到实际调试把整个设计过程拆开讲。适合正在做嵌入式电源设计的工程师也适合刚接触电子保险丝的朋友。如果你手里正好有类似的项目可以直接参考这套思路能少踩不少坑。2. 方案选型与整体架构2.1 TPS259483AYWPR 到底解决了什么问题先说说TPS259483AYWPR是什么。它是TI推出的一颗带数字接口的电子保险丝内置功率MOSFET和控制逻辑可以看作一个“智能开关”加“保护器”的合体。它支持宽范围输入电压我这里用的输入是24V工业电源实际范围18V到32V输出电流通过外部电阻设定最高能到5A级别足够覆盖大多数板级负载。这颗芯片最让我满意的地方是它的故障防护种类。它同时提供过压保护OVP、过流保护OCP、反向电流保护reverse current protection和浪涌限流inrush current limiting。对上电瞬间的容性负载冲击它能把电流爬升率限制在设定范围内避免后端电容充电电流把电源拉垮。而在过流或短路状态下它会在微秒级时间内切断通路比普通保险丝快了不止一个数量级。另外它支持通过I2C接口读取状态寄存器也能配置部分保护参数。这是我在选型时特别看重的点——PIC18F45K80自带I2C外设MCU可以实时读取电子保险丝的状态、诊断故障原因甚至远程控制开关。对于需要集中监控的工业设备这个能力非常实用。2.2 PIC18F45K80 在系统中的角色PIC18F45K80是Microchip的8位MCU带有增强型CAN模块、I2C/SPI、多路ADC和丰富IO。很多人觉得8位机太老但在工业环境里它反而皮实抗干扰能力强供货也稳定。这块板卡里PIC18F45K80除了做业务逻辑采样、通信、控制输出还顺带承担了“电源管家”的工作通过I2C配置TPS259483的工作模式比如使能输出、切换电流限档。定期读取电子保险丝的电压、电流和故障标志。发现故障后根据故障类型决定是软复位还是保持关断并通过CAN总线上报给上位机。这样一来电源保护不再是硬件独立动作而是变成了整个系统可感知、可控制的一环。出问题时调试人员不用拿示波器在那儿反复抓波形直接看MCU记录的状态寄存器就能定位原因。这也是“智能电源路径保护”的价值所在。2.3 整体供电架构简图系统输入24V工业直流电源经过前级防反接和EMI滤波后进入TPS259483TPS259483输出可调限流输出电压跟随输入24V供给后级降压电路后级降压电路24V转5V给传感器和通信隔离供电、5V转3.3V给MCU和数字电路PIC18F45K80负责配置TPS259483读取状态同时进行业务控制这么设计的好处是保护点放在整个系统的源头无论后级哪一路出现短路或过流TPS259483都能先切断总电源避免故障扩散到整个板卡。当然对各个分路还需要额外的二次保护但总开关能扛住大多数异常情况。3. 硬件电路设计细节3.1 TPS259483 的关键引脚与外围配置拿TPS259483AYWPR来说它采用小封装引脚不多但每个引脚都值得认真对待。我按照数据手册和应用笔记做了如下连接功能引脚连接方式输入电源VIN接经过滤波的24V输入并跨接10uF陶瓷电容和0.1uF高频电容输出VOUT接后级负载同样放10uF电容使能控制EN/UVLO通过电阻分压设定欠压锁定阈值并由MCU的IO控制开关电流限制设定ILIM接设定电阻到GND阻值决定限流点故障输出FLT开漏输出接上拉电阻到3.3V送MCU的外部中断引脚I2C接口SCL, SDA接PIC18F45K80的I2C模块注意地址引脚设置启动时间设定dV/dt通过电容设定输出电压爬升速率这里特别说明一下电流限制电阻的选择。TPS259483的限流计算公式在数据手册里有一般形式是I_LIMIT K / R_ILIMK是芯片内部的比例系数。我最初想设3A的限流按公式计算需要的电阻值不是常规的E24系列最后采用两个电阻并联凑出目标值。实测下来限流点有约±5%的偏差这属于正常范围设计时要留够余量。比如后端最大正常工作电流是2A限流点就不能只设2.2A至少得2.5A以上否则电机启动或传感器加热等瞬时大电流会导致误保护。3.2 欠压锁定与使能逻辑欠压锁定UVLO通过EN/UVLO引脚实现。由于输入是24V考虑到工业电源可能跌落到18V就认为欠压我用两个电阻分压让EN/UVLO引脚电压在输入达到18.5V左右时超过阈值从而允许芯片启动。计算分压电阻时不单要考虑阈值电压还要考虑引脚内部迟滞电流避免在临界电压附近反复振荡。正常工作状态下EN引脚由MCU的IO口通过一个小MOS管控制。这样MCU可以在进入低功耗模式前关断电源路径或者在检测到严重故障后锁存关断直到人工复位。我习惯把“硬件使能”和“软件使能”结合EN/UVLO的硬件阈值保证低电压不启动软件IO保证MCU能主动控制电源通断。3.3 PIC18F45K80 与 TPS259483 的接口设计PIC18F45K80的I2C模块比较简单但和TPS259483连接时有几个细节必须注意。第一电平匹配。TPS259483的I2C引脚支持1.2V到VCC的宽范围可以直接接受3.3V电平所以不用加电平转换。如果输入电压更高或MCU是5V系统就需要检查是否兼容。这里用3.3V供电给MCU直接连接即可。第二I2C上拉电阻。PIC18F45K80的I2C模块需要外部上拉我选了4.7kΩ的电阻到3.3V。总线上如果挂的设备少4.7k是标准值如果通信距离长可以改成2.2kΩ但要注意总线上拉过强会增加功耗。TPS259483的I2C速率最高支持400kHzMCU配置成100kHz或400kHz都行建议先用100kHz调试稳定后再提速。第三FLT引脚的中断处理。FLT是开漏输出正常工作为高故障时拉低。接MCU的INT引脚并启用边沿中断这样即使MCU正在忙其他任务也能快速响应电源故障。我在外部中断服务程序里只设置一个标志位然后在主循环中通过I2C读取详细故障寄存器不在中断里做耗时操作。3.4 PCB布局的三个教训电源保护芯片的PCB布局直接影响性能。我第一次画这板子时踩了几个坑这里挑重要的说。一是输入电容和输出电容要尽量靠近芯片引脚。如果走线太长寄生电感会和电容形成谐振导致开关瞬间电压过冲反而可能击穿芯片。我用的是0402封装电容摆在引脚正下方过孔直接打到焊盘上高频路径很短。二是电流设定电阻到ILIM引脚的走线要短且远离开关节点。ILIM引脚对噪声敏感旁边不要走数字信号线。最好用地线包围起来。三是散热。TPS259483在过流的时候会发热虽然它有过热保护但PCB铜皮就是散热器。我在芯片下面的铜皮做了大面积覆铜并打过孔到内层和底层实测在3A连续负载下芯片温度比小铜皮方案低了15度。工业产品要长期运行温度直接影响寿命。4. 软件驱动与状态监控4.1 PIC18F45K80 I2C初始化PIC18F45K80的I2C模块寄存器不多初始化步骤很固定。时钟源选择FOSC波特率根据系统时钟和I2C时钟计算。假设系统时钟16MHz目标I2C时钟100kHz那么波特率寄存器SSP1ADD (Fosc / (4 * 100kHz)) - 1 ≈ 39。初始化时需要注意先设置I2C模块为主模式再配置时钟速率寄存器最后使能模块。开启后先发一个总线空闲检测防止总线上有残留状态。代码如下// 初始化PIC18F45K80的MSSP1模块为I2C主模式100kHz void i2c1_init(void) { // 设置重映射不需要PIC18F45K80引脚固定映射到SCL/SDA SSP1CON1 0x28; // 使能I2C主模式 (SSPEN1, I2C) SSP1CON2 0x00; // 清空控制状态 SSP1ADD 39; // 100kHz Fosc16MHz SSP1STAT 0x80; // Slew rate control enabled }代码很简单但我实测发现一个坑SSP1ADD的计算公式在不同时钟频率下会变如果系统时钟是64MHz内部振荡器就要重新算。很多开发者的习惯是直接抄例程里的数字换一块板子或改时钟后I2C就不通了这里建议用宏定义计算#define FOSC 16000000UL #define I2C_CLK 100000UL #define SSP1ADD_VALUE ((FOSC / (4 * I2C_CLK)) - 1)4.2 读取TPS259483状态的方法TPS259483的状态寄存器地址在数据手册里有主要包括输入电压、输出电压、电流值、故障标志等。读取方式很常规先发送设备地址加寄存器地址然后读取数据。我用的是PIC的底层I2C字节收发函数封装成单次读取接口。uint8_t tps259483_read_reg(uint8_t reg_addr) { uint8_t val 0; i2c1_start(); i2c1_write(TPS259483_I2C_ADDR 1); // 写地址 i2c1_write(reg_addr); i2c1_restart(); i2c1_write((TPS259483_I2C_ADDR 1) | 1); // 读地址 val i2c1_read(0); // 最后一个字节NACK i2c1_stop(); return val; }读回来的原始寄存器值只是0~255的数字要根据寄存器定义去解析。比如电流值寄存器手册会给出比例因子比如1LSB代表多少毫安。不要只把寄存器值打印出来看要换算成实际工程值看起来才直观。主循环中的监控策略要有节奏状态不必每次轮询都读全部字段我是每10ms读一次故障标志和使能状态每100ms读一次电压电流值用于日志记录。因为I2C读操作会占用总线过度读取会干扰主业务尤其是PIC18F45K80同时要处理CAN通信时。4.3 故障处理逻辑与状态机电源故障处理如果只是一味地关断重启有点太粗暴。更好的做法是软硬件协同瞬时过流比如后端电机启动时电流尖峰TPS259483如果在限流模式下不会立刻关闭而是把电流限制在设定值输出电压会被拉低。这种情况不应该锁死应该记录标志然后继续观察几个周期。持续过流或短路FLT引脚触发MCU读取故障寄存器确认是OCP。此时策略是关闭输出并锁存需要人工复位或接收到上位机的恢复命令才能重新开启。过压/欠压先确认输入电压是否真的异常。如果TPS259483被配置为欠压保护输入端电压跌落时它会自动关断。此时MCU应通过ADC采样输入电压判断是否是电源系统的问题然后决定是否发送告警。我使用的状态机很简单enum { PWR_NORMAL, PWR_FAULT, PWR_LATCH_OFF, PWR_RECOVERY } pwr_state;正常状态下收到瞬态过流标志后连续累计3次且每次间隔超过50ms才进入故障状态。在故障状态下尝试自动恢复一次关闭输出等待100ms再开启如果2秒内再次发生故障则进入锁存关闭状态。锁存后只能通过按键或上位机命令复位。这个逻辑虽然不复杂却避免了很多“灵异重启”问题。4.4 通信融合MCU如何上报电源状态PIC18F45K80带CAN模块这在工业控制里太香了。我把电源状态做成CAN消息周期发送每100ms发送一帧包含输出电压、电流、温度的报文故障发生时立即发送一帧故障码。这样远端控制器不用到现场就能知道设备电源是否正常。CAN初始化用的标准帧ID分配成0x300开头包含数据类型。重要提示CAN的收发优先级高于I2C所以在MCU代码里中断中处理CAN报文主循环处理I2C。如果两者冲突优先保证CAN不被阻塞。我实际用过的办法把电源状态打包成全局结构体CAN发送直接读取结构体内容I2C读取任务更新结构体。这样两个任务之间只通过共享内存交互不需要加锁因为8位MCU没有多核竞争。5. 调试实录与问题排查5.1 上电瞬间输出振荡差点烧了后端第一次给电路板通电我用调压器缓慢升压TPS259483输出没正常建立示波器看到输出电压在8V到20V之间反复跳变像打嗝一样。直觉告诉我可能是欠压锁定阈值设置不当。因为分压电阻取的是标准值实际阈值比预期高了2V输入电压还没到启动阈值区间芯片处于开启和关闭的临界状态。解决办法是重新计算分压电阻并预留了可调电阻位。实际调的时候我把R1设为精密电阻R2用电位器先调试测出精确阈值后再换成固定电阻。另外d/dt电容大小也影响启动。电容太大输出电压爬升太慢负载可能以为电源没建立太小浪涌电流会很大。我最终用了一个满足负载要求的中间值同时调整了MCU里检测上电完成的超时时间。5.2 I2C通信时好时坏不是时序问题硬件做完后跑软件发现PIC18F45K80读TPS259483寄存器时经常超时但偶尔能读到正确数据。用逻辑分析仪抓波形发现SCL线上有时有毛刺低电平持续时间超过标准。检查发现是I2C上拉电阻选的太大加上总线上还有几颗滤波电容导致信号上升沿太缓。在400kHz模式下尤为明显。解决方法是把上拉电阻从4.7k改到2.2k并删掉了板上不必要的I2C滤波电容。之后通信稳定连续跑24小时无一次丢帧。经验是I2C不适合在线上加太多电容如果为了防EMI宁可在MCU软件里开启输入滤波也不要在线路上并联大电容。5.3 过流保护点实测偏差限流电阻不要只看标称我设定的限流值是3A用电子负载测试发现芯片在2.85A就触发了过流保护。查数据手册发现限流电阻的容差和芯片内部基准都会影响精度。电阻选用1%精度但温度变化也会改变限流值。工业环境温度变化大如果限流点至少要保证在3A不误触发实际设定值应该安排在3.5A以上用负温度系数电阻进行部分补偿会更稳。另外一个细节是TPS259483支持可编程的故障响应模式。默认可能是锁存模式适合需要人工介入的场合也有自动重试模式适合瞬时干扰多的环境。我最终选了锁存模式配合MCU的“三次机会”逻辑兼顾了安全性和可远程恢复。5.4 常见问题速查表现象可能原因排查方向上电无输出EN/UVLO电压未达到阈值测量EN引脚电压检查分压电阻输出打嗝dV/dt电容过大或UVLO临界调节dV/dt电容重新计算UVLO阈值I2C通信不稳定上拉电阻过大、总线电容超标减小上拉电阻去除直接在I2C线上的电容过早过流保护ILIM电阻精度不足、限流余量不够用高精度电阻提高限流设定点FLT频繁触发瞬时浪涌电流超出限流值适当增加d/dt时间或提高限流点芯片过热PCB散热面积不足加大铜皮增加过孔散热6. 嵌入式架构层面的思考6.1 “电源路径保护”不能只靠芯片本身有人会问既然TPS259483这么智能是不是再加上MCU就足够了其实不然。电子保险丝是最后一道硬防线但它无法区分“后端负载真正需要的大电流”和“故障导致的过流”。比如一个伺服驱动器启动时瞬间需要4A而正常工作时才1A如果限流点设成3A启动就会失败。这时候就需要软件层面的智能调度MCU知道当前负载的工作阶段可以在启动前临时提高电流限档或者错峰启动多个负载。这放到我做的系统里就体现在PIC18F45K80根据采集到的数据动态调整TPS259483的配置。比如通过I2C切换电流限设定或者改变保护阈值。这个“软件参与电源管理”的架构比纯硬件保护更灵活。但也要注意MCU死机或程序跑飞时保护还得靠硬件。所以我在设计时给了一个原则硬件保护永远兜底软件只做增强和状态上报。比如TPS259483的默认故障响应一定是Safety级别最高的MCU只能调整少量参数不能完全禁用保护功能。6.2 8位MCU也能承担电源管理很多人觉得做电源管理至少要上Cortex-M系列其实8位MCU在处理毫秒级监控和I2C通信上完全够用。PIC18F45K80的优势是外设集成度高CAN、I2C、定时器、ADC都有而且工业温度范围宽长期供货稳定。它没有操作系统裸机跑主循环加中断实时性反而可控没有调度器带来的不确定延迟。我用的裸机架构是定时器产生1ms时基主循环根据标志位执行不同任务。I2C读取放在主循环CAN收发放在中断FLT外部中断只置位。这样的代码简单可靠出错也好排查。如果真的需要复杂任务调度可能才需要RTOS但电源管理这件事裸机足够了。6.3 针对嵌入式面试/学习的延伸最近有不少人问“嵌入式项目怎么选”。我建议如果想练手电源路径保护是个很不错的项目方向。它涉及模拟电路、数字电路、通信协议、状态机设计还牵扯到故障诊断技术密度很高。比起单纯的LED流水灯这个项目能让你讲出很多“为什么”的东西。比如你凭什么选择这颗eFuse电流检测误差怎么分析MCU怎么处理故障恢复这些在面试八股文里可找不到标准答案反而是体现工程能力的加分项。如果你在自学嵌入式Linux或单片机完全可以按照这篇文章的思路做一个简化版本放弃PIC用STM32或者Arduino搭配一个简单的电子保险丝芯片做一个可监控的电源模块。做完之后你能掌握的东西远比“照着例程点灯”要多得多。7. 最终代码与配置参考精简这里给出PIC18F45K80读取TPS259483电压/电流的简化示例代码。实际项目里我做了更多健壮性处理但核心逻辑如下。#define TPS259483_READ_VOLTAGE_REG 0x12 #define TPS259483_READ_CURRENT_REG 0x13 #define TPS259483_ADDR 0x50 uint8_t g_power_fault 0; void power_monitor_task(void) { uint8_t volt_raw, curr_raw; volt_raw tps259483_read_reg(TPS259483_READ_VOLTAGE_REG); curr_raw tps259483_read_reg(TPS259483_READ_CURRENT_REG); // 换算为真实值例如电压满量程50V8位精度 1LSB0.196V // 电流满量程5A1LSB0.0196A g_power_voltage volt_raw * 0.196f; g_power_current curr_raw * 0.0196f; if (tps259483_read_reg(TPS259483_FAULT_REG) 0x01) { g_power_fault 1; } else { g_power_fault 0; } }注意我上面注释中的满量程比例是举例实际值请务必参考你所用版本的官方数据手册。不同型号后缀和批次可能微调。8. 写在最后的个人体会这套方案我做了两版。第一版芯片散热不足软件逻辑也过于简单第二版我加了动态限流档位和故障复位状态机才真正解决了现场出现的抖动和死机问题。回过头看做电源路径保护最大的坑不是芯片选型而是“你以为电流够了其实没够”以及“软件和硬件保护边界没划清”。如果让我给后来者一个最值得记住的建议那就是保护阈值必须比最大正常工作电流高50%以上但又不能高到保护失效。这个“度”的把握只能通过实测和现场数据去调没有捷径。电子保险丝和MCU的组合恰恰提供了一种可以不断调整和观测的手段。有了观测数据才有优化方向这是嵌入式工程师最需要培养的能力。最后分享一个调试小技巧拿到TPS259483后先不要接MCU手工给EN脚一个高电平用电子负载测试各种故障保护是否正常。确定硬件保护动作没问题再接上PIC做I2C配置和监控。这样两步走能省一半定位问题的时间。我每次设计新的电源板都用这个流程屡试不爽。
阅读完成 · 觉得有帮助?
咨询建站