
有一阵子我被一个问题搞得头大一块用TP4056做的18650锂电池供电小设备插上USB之后板上那颗PMOS管热得能煎鸡蛋。负载电流明明才0.6A管子是按3A选的按理说发热不应该这么离谱。换掉管子照样烫最后拿万用表一点一点测回来才发现凶手不是管子本身而是栅极电压刚好卡在导通阈值附近MOS管根本没完全打开功率全部变成了热量。这篇文章就用这个TP4056实战案例把锂电池供电切换电路里PMOS发热的根源、排查方法和修正方案一次性讲清楚。不堆术语但该算的账、该量的点、该避的坑一样都不会少。1. 为什么供电切换电路离不开PMOS1.1 TP4056充电电路的先天短板TP4056是目前最常用的单节锂电池线性充电芯片外围器件少、成本低最大充电电流能做到1A很多DIY项目的最终形态都是一个5V USB口进来TP4056给18650或聚合物理电池充电然后系统板直接从电池取电。问题就出在这个“取电”上。TP4056本身没有电源路径管理英文叫Power Path。意思很直白芯片只负责给电池充电电池要不要给系统供电、USB没插时由谁给系统供电它一概不管。如果你想让设备在插USB的时候优先用USB的电同时还能给电池充电就必须自己在外面加切换电路而最廉价可靠的方案之一就是在电池正极通路里串一颗PMOS。引脚名称功能1TEMP电池温度检测输入可接NTC不用时接地2PROG充电电流设定端通过电阻设定电流3GND地4VCC电源输入范围4.5~5.5V5BAT电池连接端充电时这里输出4.2V6STDBY充满指示充满时拉低7CHRG充电指示充电时拉低8CE使能端高电平使能低电平关断顺便把充电电流的设定公式给大家TP4056的充电电流和PROG脚对地电阻的关系是I 1200 / RPROGRPROG单位是ΩI单位是A。比如想充1A就用1.2kΩ电阻想充500mA用2.4kΩ。充电截止电压是4.2V精度±1%这对绝大多数单节锂电池是安全的。再回到供电切换。所谓“防倒灌”是指电池电压会把电流送到USB 5V那一路去。USB口内部有不少电容和芯片电池4.2V虽然低于5V但一旦USB电源被拔掉5V网络变成悬空状态电池就能通过寄生路径给这部分电路反向供电轻则导致LED微亮、设备关不彻底重则烧掉路径上的器件。这时候就需要一颗PMOS把电池和USB网络隔开。1.2 单PMOS的典型切换拓扑最简单的切换思路用一颗PMOS把电池和系统轨断开。系统轨是负载总电源入口由USB 5V和电池两个候选电源提供。PMOS安装的位置很有讲究这也是我这次踩坑的核心。我当时搭的电路长这样先放出来当反面教材USB_5V ---- R1 100k -------- PMOS.G | R2 100k ---- GND USB_5V ---- D1 SS34 -------- SYS系统负载 | 电池4.2V ---- PMOS.S PMOS.D ---- SYSPMOS用的是AO3401AS极接电池D极接系统轨SYS。USB插入后PMOS栅极被两个100k电阻分压到2.5V电池电压4.2V于是Vgs 2.5 - 4.2 -1.7V。AO3401A的导通阈值Vgs(th)典型值在-1.0V左右-1.7V刚好处于“刚刚开始导通”的区间。管子没有完全打开Rds(on)不是规格书里写的40mΩ而是可能变成300mΩ甚至更高。负载0.6A时理论功耗就是0.6²×0.3108mW再叠加体二极管的问题外壳很快就烫了。很多教程都告诉你PMOS能防倒灌、能做电源切换但很少告诉你接反方向、驱动电压不对比不加PMOS还要危险。1.3 PMOS与NMOS导通条件对比先把基础讲透。MOS管的导通由栅源电压Vgs决定和型号参数的关系是NMOSVgs 阈值电压Vth时导通。NMOS做高边开关时源极接负载栅极必须比源极电压高几伏以上才能完全打开所以高边用NMOS要么自举要么加电荷泵麻烦。PMOSVgs -阈值电压时导通栅极比源极低几伏以上才能完全打开。PMOS的源极通常直接接输入电源正端只要把栅极往下拉到地或接近地就能满足导通做高边开关非常顺手。类型导通条件适合位置常见驱动方式NMOSVgs Vth低边开关、电流控制GPIO直接给正压PMOSVgs -Vth高边电源开关、电池切换栅极下拉到地或负压在锂电池供电切换场景里我们要断开的是一条正极通路所以PMOS是主角。但要注意PMOS的“负压导通”是相对于源极电压来说的不是看栅极绝对电压有多低。很多朋友只盯着栅极电压高低看不到源极电压接出来就是各种稀奇古怪的问题。后面这个案例里这个问题会反复出现。2. 深挖PMOS发热的四个物理根源2.1 发热公式功耗从哪里来MOS管发热的本质是功耗转热主要三笔账第一导通损耗P I² × Rds(on)。电流已经确定时Rds(on)越大越烫这个最好理解。第二线性区损耗P Vds × Id。MOS管没有完全导通管子两端存在较大压差但电流照样通过这个乘积就是实打实的功耗。这种损耗往往比想象中高得多也正是半导通状态最危险的地方。第三开关损耗P ≈ ½ × Vin × I × (t_rise t_fall) × f。每次开关过程都要在线性区消耗能量频率越高越严重。在插拔USB这样的低频切换场景里开关损耗不是主角。但有些电路会在临界电压附近反复抖动把第三笔账硬生生放大好几倍这个后面会说到。用具体数字感受一下功耗差异AO3401A在Vgs-4.5V时Rds(on)典型值约40mΩ过1A电流理论功耗是1²×0.0440mWSOT-23封装顶多微温。但把Vgs压到-1.5V时Rds(on)很可能蹿到200~500mΩ同样1A就是200~500mWSOT-23封装的热阻大概150°C/W温升轻松超过30°C手摸上去已经是烫手级别了。管子这时候不一定坏但长期高温工作的寿命和可靠性都会明显下降。2.2 根源一栅极电压控制不当导致半导通这是绝大多数PMOS发热的第一大原因。半导通的意思Vgs落在阈值附近MOS管既没进入深度导通也没完全关断相当于一个阻值飘忽不定的电阻串在电源通路上。以AO3401A为例Vgs(th)参数范围大约是-0.7V到-1.4V。这个参数是“开始导通”的门槛不是“完全导通”的充分条件。真正要让管子完全打开需要把Vgs推到-2.5V以上最好到-4.5V。规格书里的Rds(on)只在Vgs-4.5V或-2.5V条件下测试就是这个道理。实际工程中常见的半导通触发方式有三种第一种用等值电阻分压像我前面那个反面电路把栅极电压卡在中间。第二种用3.3V单片机GPIO直接拉高栅极去关断PMOS。如果PMOS的S极接的是4.2V电池GPIO输出高电平3.3VVgs3.3-4.2-0.9V恰好卡在阈值附近关不断。更要命的是PMOS的Vgs(th)本身有批次离散性同样型号的管子有些在-0.7V就开了有些要到-1.2V才开于是有人遇到“有时热有时不热”。第三种用NPN三极管驱动PMOS栅极但三极管没有进入饱和CE结上残留了一个多伏特压降栅极停在1V多同样造成半导通。判断方法很简单用万用表测Vgs。只要绝对值小于2V就要高度怀疑半导通。深度导通至少要让Vgs绝对值大于2.5V最好留到4V以上。2.3 根源二体二极管悄悄开了后门PMOS内部自带一个寄生二极管方向是从漏极D到源极S厂家图纸上通常画在MOS管符号旁边。这个体二极管带来的副作用是即便PMOS沟道完全关断只要D点电压比S点电压高0.5V左右体二极管就会正向导通电流照样能从D流到S。换句话说你以为PMOS把两路电源隔开了实际上体二极管给电流留了一扇后门。回到我那个反面电路。S接电池4.2VD接系统轨SYS。USB插入后肖特基二极管D1把SYS拉到4.7V左右D点4.7V高于S点4.2V这时候体二极管导通同时沟道又是半导通相当于两条通路并联电流从SYS往电池方向灌回去。这部分电流完全没经过TP4056控制属于“管不住的电流”路径上又有体二极管的压降自然发热。体二极管的方向这样记PMOS沟道导通时的正式电流方向是S流向D体二极管方向是D流向S。想防止倒灌就得保证在关断状态下D点电压不高于S点电压。具体接法上S端要接电压较高的那一边D端接较低的一边。2.4 根源三开关瞬态与振荡损耗切换瞬间栅极电位变化太慢或者电路在临界点反复抖动PMOS会在线性区停留较长时间发热也会很明显。最典型的场景是USB头接触不良。5V电压在3V到4.8V之间跳栅极电压跟着跳PMOS一会儿被拉负压导通一会儿变0V关断每一轮切换都要在线性区走一趟热量就是这么堆上去的。还有一种情况是栅极振铃。G点到驱动源之间有引线电感DS之间又有米勒电容如果栅极驱动源输出阻抗很低在边沿会形成振铃。栅极电压负向振铃问题不大但正向振铃一旦把Vgs抬到半导通区间管子就会在线性区蹭比较长的时间。解决办法是给栅极串联一个10~100Ω的电阻把这个振铃压住。进阶做法是加迟滞比较器让栅极电压在两个状态之间迅速跳变不在中间电压区停留。这一点在一些“慢爬升”的USB充电器上尤其重要因为有的劣质充电头输出电压上升得慢栅极会跟着慢慢抬升中间态持续时间久热量全留在PMOS上了。2.5 根源四选型、封装与散热被低估最后一个原因很土但经常发生看耐压够、电流够就直接把管子焊上去了完全没有查Rds(on)和热阻。第一Rds(on)不是恒定值。电流偏大或者结温升高时MOS管的导通电阻会变大发热增加进一步推高温度形成正反馈。所以越是摸起来烫越要警惕它变得更烫。第二电流参数ID标得大不代表你设计功耗满足了封装能力。比如标称ID-4A的管子实际驱动条件不同真实Rds(on)可能是标称值的几倍。2A电流下0.4W功耗放在SOT-23封装上温升就已经很可观了。第三封装热阻差异很大。SOT-23大概150~200°C/WSOT-89要低不少SO-8带散热焊盘的就更容易散热。同样1W功耗SOT-23可能温升接近100°CSO-8可能只有30~40°C。PCB覆铜面积和过孔数量也直接影响散热铜箔越大热阻越小。所以发热不一定代表管子坏了先查驱动再查选型最后再考虑散热。这三个因素往往在一起起作用。3. TP4056实战一个具体的发热故障排查记录3.1 故障现场还原USB一插就烫手当时我做的设备是ESP32-C3采集传感器数据驱动一块SSD1306 OLED峰值电流大概0.6A一节18650电池供电充电部分用TP4056模块充电电流设定1A。外接USB 5V想实现“USB在时优先用USBUSB拔掉自动切电池”。实际搭建的电路就是1.2节那个错误版本PMOS用CJ3401和AO3401A同参数S接电池D接SYSG通过两个100k电阻分压接USB和地。插上USB之后OLED正常亮TP4056也进入充电状态我当时觉得一切正常。过了两三分钟想拔USB线手刚碰到PMOS烫得缩了回来。拿红外温度枪打了一下表面温度72°C。当时负载电流测下来只有0.6A按说CJ3401标称能过4A怎么也不该烫成这样。很明显管子没有工作在规格书说的那个理想状态。3.2 万用表实测数据不会说谎第一步先断电用万用表二极管档确认PMOS的体二极管方向。红表笔接D、黑表笔接S显示约0.5V红黑表笔反过来显示无穷大。这就确认了体二极管方向是从D到S和CJ3401的数据手册一致。第二步重新接USB通电逐点量电压USB_5V5.02VSYS4.71V电池4.18VPMOS.G2.51V计算Vgs 2.51 - 4.18 -1.67V。这个电压已经越过了导通阈值但远达不到深度导通需要的-4.5V。CJ3401的Vgs(th)典型值在-1.0V左右所以管子处于一个“通又通不彻底、断又断不干净”的状态。我估了一下这时候Rds(on)至少200mΩ而且SYS和电池之间有0.53V压差体二极管也是正偏的电流从SYS往电池方向灌。实际串表测量通过PMOS的电流约0.35A。用P Vds × I来粗算Vds0.53VI0.35A功耗约0.18W。这个功耗如果持续SOT-23封装理论温升高达27°C左右再加上ESP32-C3射频发射时电流冲到300mA以上峰值功耗更高最终表面温度冲到72°C一点都不奇怪。更麻烦的是这个路径上流进电池的电流不是TP4056控制的等于给电池额外增加了一个充电通道轻则发热重则加速电池损耗。到这里发热原因基本锁定了栅极分压导致半导通体二极管又提供了倒灌通道。3.3 修复一把PMOS方向反过来并调整电阻修的时候做了两个改动。第一把PMOS的S和D对调S现在接SYS系统轨D接电池正极。为什么这样改正常情况下电池电压低于SYS电压体二极管从D到S就是反偏的不会形成倒灌路径。当USB断开时SYS电压先靠负载电容维持然后被电池通过PMOS沟道拉起来体二极管也不会带来麻烦。当PMOS需要导通时Vgs0-4.2-4.2V深度导通。当USB插入时栅极接近USB电压SYS是USB减去二极管压降Vgs接近0V甚至微微为正PMOS深度截止。第二把栅极分压电阻从两个100k改成R_up10k、R_down100k。USB插入时G点电压是5.0×100/(10100)≈4.55VSYS大约是4.7VVgs-0.15V安全的截止区。USB拔出后G点通过100k电阻放电到0VVgs-4.2V完全导通。如果你想把截止做得更彻底可以把R_down加到220k分压后G点约4.78V和SYS之间的压差不到0.1V更安全。代价是USB拔出后栅极放电稍慢但R_down220k配1nF量级的栅极电容时间常数只有0.2ms左右切换过程几乎感觉不到掉电。修复之后的切换时序是这样的USB拔出瞬间G点电压不能突变R_down把G从4.55V慢慢放到0V同时SYS从4.7V开始跌落。因为放电时间常数很小PMOS很快就开通SYS电压还没掉多少就被电池接住了。用示波器看SYS电压跌落不超过几十毫伏切换基本无缝。3.4 修复二给TP4056充电路径加独立开关修复一解决了主要发热问题。如果你还想更严谨可以在TP4056的VCC输入路径上也串一颗PMOS做开关让充电只在需要时启用。不过就我这次项目而言TP4056直接接USB供电反而更合理因为充电电流由芯片内部线性控制不会随系统负载大幅波动。这里也说一下TP4056自身有没有防倒灌能力。数据手册里BAT脚在VCC掉电时的漏电流非常小微安级这是芯片内部做了隔离的结果。所以在常规设计里不需要单独为TP4056再加防倒灌PMOS除非你实测发现USB拔掉后有异常漏电。3.5 修复后的实测参数与功耗核算改完电路重新上电记录一组数据USB插入时SYS4.71VG4.66V电池D4.18VVgs-0.05VPMOS截止万用表测不到明显漏电。USB拔掉时G0VSYS4.16VVgs-4.16VPMOS深度导通。测PMOS两端压降Vds≈12mV负载电流0.5A估算Rds(on)0.012/0.524mΩ和CJ3401官方在Vgs-4.5V时给出的40mΩ量级一致。连续运行一整天PMOS表面温度稳定在36°C左右和环境温度差距不到10°C。功耗核算负载0.6A时PI²×R0.36×0.024≈9mWSOT-23温升只有1~2°C几乎可以忽略。对比修复前半导通状态加体二极管带来的0.18W功耗差距接近20倍。这20倍就是“PMOS发热”和“PMOS正常”的真正分水岭。4. 常见问题速查表与设计避坑清单4.1 发热问题快速定位表现象最可能原因排查点解决办法USB插入后PMOS烫栅极分压导致半导通/体二极管倒灌测Vgs是否接近阈值改分压比例调整S/D方向USB拔掉后PMOS烫栅极放电太慢/振铃示波器看G点跌落时间减小R_down栅极串10~100Ω插拔瞬间烫切换过程在线性区停留时间太长看波形是否有毛刺和振荡加快栅极驱动加迟滞始终烫和插拔无关Rds(on)太大或封装散热不够查导通时Vds和实际电流换低Rds(on)管子加大焊盘换封装负载关断后PMOS还温热GPIO高电平电压不够关断不彻底测Vgs是否为正或接近0V用NMOS反相器驱动或加电阻上拉到S极这个表不是万能药但覆盖了大部分DIY项目里的PMOS发热场景。拿到问题先别急着拆管子量电压永远是第一步。4.2 分立PMOS切换电路的设计要点如果你坚持用分立PMOS自己做切换下面这几个点是拿钱和头发换出来的第一S/D方向先判断。设计时先问自己关断状态下我最怕哪个方向的电流倒灌然后根据体二极管方向把S端接到电压更高的那一边让体二极管处于反偏状态。第二栅极驱动电压要有余量。导通时Vgs至少-2.5V最好-4.5V以上关断时Vgs要达到0V或者正几百毫伏绝不能停在阈值附近。第三栅极串一个小电阻10~100Ω抑制开关振铃。这个电阻在很多教程里容易被忽略但它能在USB接触不良等场景里救你一命。第四栅极下拉或上拉电阻尽量选100k~1M级别避免分压后产生中间态电压。阻值太小会加重分压问题阻值太大会拖慢开关速度需要平衡。第五PMOS周围铺铜要足。SOT-23这种小封装全靠焊盘和铜箔散热该加过孔就加别把散热焊盘悬空着不用。4.3 比分立方案更省心的替代方案如果你是量产或者不想在栅极驱动上继续烧脑可以直接换集成方案。第一个方向是理想二极管控制器比如LTC4412。它外接一颗PMOS内部有比较器和驱动电路能自动选择电压更高的输入源。防倒灌、切换、驱动一次搞定很多电池供电产品都在用。第二个方向是集成负载开关比如SGM2576、SGM25761之类。里面已经集成PMOS、慢启动、过流保护一个使能脚控制通断外围就是两个电容。第三个方向是带电源路径管理的充电IC比如BQ24072系列。这种芯片在内部就处理了“USB供电优先、电池备用”的逻辑外部不需要你再加PMOS。第四个方向最简单但只适合小电流场合用两颗肖特基二极管做ORing也叫做线与。压降比PMOS大一些但绝对不会出现半导通和倒灌问题。个人建议是DIY学原理用PMOS没问题但要是做半正式产品或要交给别人用的东西老老实实选集成方案省下的调试时间远远超过差价。5. 后记与几个排查小习惯这次故障让我养成了几个习惯顺便分享给大家。第一拿到PMOS先测体二极管方向再决定电路怎么接。这一步一分钟都不到但能避免后面好几个小时的反向排查。第二测Vgs的时候表笔要直接戳到管脚根部别夹在一长串导线上。导线自身压降会骗人尤其电流波动的时候读数可能偏掉几十毫伏刚好影响判断。第三手摸温度之前先用万用表测一下Vds和电流用PVds×I估算功耗。很多管子标称电流很大但实际工作点完全不对单靠“换更贵更粗的管子”解决不了问题。第四换新MOS管之后务必重新检查驱动条件。每个型号、每批货的Vgs(th)都有离散性同一个电路换了一颗管子可能就从正常变成半导通。这种问题网上资料很少写透但基本原理和排查思路是通用的发热不是玄学功耗有一笔算一笔。找到那条没被控制的电流路径问题就解决了一半。