1. 为什么需要双电源自动切换做过便携设备的朋友都遇到过这个场景设备既要能插USB供电又要能靠内置电池跑。最粗暴的做法是搞个拨动开关让用户自己切。但用户不会记得切插着USB的时候电池还在放电拔掉USB的瞬间设备直接掉电重启正在处理的数据全丢。这种体验放在任何产品上都是致命的。我最早做的一个手持数据采集器就栽在这上面。当时图省事电池和USB各串一个肖特基二极管做“或”逻辑理论上谁电压高谁供电。实测下来问题一堆二极管压降0.3V起步电池3.7V出来只剩3.4V后级LDO直接掉出稳压区USB 5V经过二极管变成4.7V跟电池电压差太小两个二极管同时导通电池一边供电一边被USB倒灌充电发热严重。更坑的是切换瞬间有个几十毫秒的电压跌落MCU直接复位。后来换成基于MOS管的自动切换方案才算真正解决问题。这套方案的核心目标就三个无缝切换切换过程电压跌落控制在毫伏级、互不倒灌USB供电时电池不放电也不被乱充、静态功耗低电池模式下自身耗电微安级。适合所有做便携电子、IoT节点、手持仪器、电池供电视觉模块的硬件工程师参考哪怕你刚画第一块板子照着这个思路也能少走弯路。2. 方案整体设计与核心思路拆解2.1 三种常见切换拓扑的取舍在动手画原理图之前先把可选路线理清楚。市面上做双电源切换主流就三条路方案核心器件压降切换速度静态功耗成本二极管或逻辑肖特基二极管×20.3~0.5V快低极低专用切换芯片如TPS2113等极低快低中高MOS管分立方案P沟道MOS×2接近0极快极低低二极管方案我前面已经用血泪史证明了压降和倒灌是硬伤只适合对电压不敏感、电流很小的场合。专用芯片确实省心内部集成了比较器、驱动、防倒灌但问题是贵而且很多型号供货不稳定小批量采购经常断货。MOS管分立方案是我最终选的路线用两个P沟道MOS管分别控制电池和USB两条供电路径靠MOS管体二极管和栅极电压的逻辑关系实现自动优先级切换。为什么是P沟道而不是N沟道这是很多人第一个卡壳的地方。N沟道MOS管做高边开关需要栅极电压高于源极得额外搞个自举电路或者电荷泵电路复杂度直接翻倍。P沟道MOS管做高边开关栅极拉低就导通逻辑天然匹配“有电就通”的需求电路简洁得多。代价是P沟道MOS的导通电阻通常比同规格N沟道大但对于1~3A级别的负载选个Rds(on)在20~50mΩ的型号压降也就几十毫伏完全可以接受。2.2 优先级逻辑的设计意图这套电路的核心逻辑是USB插入时USB供电优先同时切断电池供电路径USB拔出时电池自动接管。为什么不让电池和USB同时供电因为两个电源直接并联电压高的会向电压低的倒灌。USB 5V和电池3.7V并联USB会持续给电池充电如果电池没有保护板过充风险极大即使有保护板这种不受控的充电电流也会让电池发热、寿命骤降。所以设计上必须做到“二选一”而且切换要快。MOS管的开关速度在微秒级远快于机械开关的毫秒级这是它实现无缝切换的物理基础。具体来说USB存在时通过一个分压网络检测USB电压控制电池侧MOS管的栅极使其关断USB消失时栅极电压被下拉电阻拉低电池侧MOS管导通。整个过程没有软件参与纯硬件逻辑可靠性极高。2.3 关键参数的计算起点选MOS管之前先明确三个边界条件最大负载电流、最高环境温度、允许的压降。假设我们的设备峰值电流2A环境温度最高60℃允许压降不超过50mV。那么MOS管的导通电阻Rds(on)必须满足Rds(on) ≤ 50mV / 2A 25mΩ注意这个25mΩ是在最高结温下的值而datasheet通常给的是25℃的值。MOS管的Rds(on)有正温度系数结温从25℃升到100℃Rds(on)大概会增大1.5倍。所以选型时要留余量25℃下Rds(on)最好在15mΩ以内。另外还要算功耗P I² × Rds(on) 4 × 0.025 0.1W对于SOT-23封装来说有点勉强建议用DFN或者SOP-8封装的MOS管散热更好。3. 核心器件选型与电路细节3.1 P沟道MOS管的关键参数怎么看选P沟道MOS管我一般按这个顺序筛第一步看Vgs(th)和Vgs最大额定值。Vgs(th)是开启阈值P沟道通常是负值比如-1V到-2V。意思是栅源电压低于这个值时MOS管开始导通。但要注意Vgs(th)只是“开始导通”真正要完全导通、达到标称Rds(on)Vgs需要拉到-4.5V甚至-10V。我们的电池电压最低可能到3.0V锂电池放电截止所以必须选Vgs(th)在-1V以内、且在-2.5V时Rds(on)已经足够小的型号。同时Vgs最大额定值要能承受USB的5V一般±12V或±20V都够用。第二步看Rds(on)和Vds。Vds额定值要高于USB 5V和电池4.2V中的最大值留一倍余量选-12V或-20V即可。Rds(on)按前面算的25℃下选15mΩ以内。第三步看封装和热阻。前面说了2A电流下功耗0.1WSOT-23的热阻大概250℃/W温升25℃勉强能用但夏天机箱内温度高就危险。我一般选SOP-8或者DFN2×2热阻低一个数量级。第四步看体二极管。P沟道MOS管内部有一个从漏极到源极的体二极管注意方向P沟道的体二极管是从D指向S也就是从漏到源正向导通。这个体二极管在电路里扮演重要角色后面会细说。3.2 栅极驱动与分压网络设计电池侧MOS管的栅极不能直接接USB电压因为USB 5V可能超过MOS管Vgs额定值而且需要根据USB是否存在来切换栅极电平。标准做法是用一个电阻分压网络加一个开关三极管或者小MOS管。具体电路USB 5V经过两个电阻分压得到一个约3V的电压接到一个NPN三极管的基极或者N沟道小MOS的栅极。三极管集电极接电池侧P沟道MOS的栅极发射极接地。当USB存在时三极管导通把P沟道MOS的栅极拉低到地此时P沟道MOS的Vgs 0V - 电池电压 负值MOS管导通等等这里逻辑要理清楚。P沟道MOS管做高边开关的接法源极接电源电池正极漏极接负载。栅极电压低于源极电压时导通。如果栅极被拉到地Vgs -Vbat绝对值很大MOS管完全导通。这不对我们想要的是USB存在时电池侧关断。所以逻辑要反过来USB存在时要让电池侧MOS管的栅极电压等于源极电压Vgs0MOS管关断。USB消失时栅极被下拉电阻拉到地Vgs-VbatMOS管导通。实现方式用一个NPN三极管集电极接电池侧MOS栅极发射极接电池正极源极基极通过分压网络接USB 5V。USB存在时三极管导通把栅极和源极短接Vgs0MOS管关断。USB消失时三极管截止栅极被一个下拉电阻接在栅极和地之间拉到地Vgs-VbatMOS管导通。这个下拉电阻同时决定了关断速度阻值越小关断越快但静态功耗越大一般取100kΩ~1MΩ。3.3 USB侧MOS管的接法USB侧的MOS管接法类似但逻辑相反USB存在时导通USB消失时关断。这个更简单因为USB电压本身就是控制信号。USB 5V经过一个电阻分压后接到P沟道MOS的栅极同时栅极有一个上拉电阻接源极USB 5V。USB存在时分压网络让栅极电压低于源极MOS管导通USB消失时栅极被上拉电阻拉到源极电压MOS管关断。但这里有个细节USB侧MOS管的源极接USB 5V漏极接负载。当USB拔出后USB 5V节点会通过负载和分压网络慢慢放电如果放电太慢MOS管可能处于半导通状态产生额外功耗。所以要在USB 5V节点加一个泄放电阻比如10kΩ确保拔出后快速降到0V。3.4 体二极管的作用与防倒灌前面提到P沟道MOS管有体二极管。在电池侧MOS管关断时体二极管的方向是从漏极负载侧指向源极电池侧也就是说如果负载侧电压高于电池电压体二极管会正向导通电流从负载倒灌回电池。这显然不是我们想要的。但等等P沟道MOS的体二极管方向到底是怎样的P沟道MOS的结构源极是P型半导体漏极也是P型衬底是N型。体二极管是从漏极的P型到衬底的N型再到源极的P型等效于一个从漏极指向源极的二极管。所以当漏极电压高于源极电压时体二极管导通。在我们的接法中电池侧MOS的源极接电池漏极接负载。USB存在时负载电压是5V电池电压3.7V漏极电压高于源极体二极管会导通USB电流会通过体二极管倒灌进电池。这就破坏了防倒灌的设计。解决办法把电池侧MOS管的源极和漏极对调让源极接负载漏极接电池。这样体二极管从源极负载侧指向漏极电池侧当负载电压高于电池电压时体二极管反向截止不会倒灌。但这样接的话MOS管导通时电流从漏极流向源极对于P沟道MOS来说电流方向是漏到源这是可以的MOS管是双向导通的。唯一要注意的是栅极驱动逻辑要相应调整栅极电压要低于源极负载侧电压才能导通。USB存在时负载电压5V栅极被拉到5VVgs0关断USB消失时负载电压由电池通过体二极管提供约3.0V栅极被下拉到地Vgs-3.0V导通。逻辑依然成立。这个源漏对调的技巧是很多新手容易忽略的画板子的时候如果按常规“源极接电源”的思维去接防倒灌就失效了。4. 完整实操过程与关键环节实现4.1 原理图设计与元件清单下面是我实际用的电路已经量产过三版稳定性没问题。核心元件清单位号元件型号/参数说明Q1P沟道MOSAO3401SOT-23或AON7407DFN电池侧Rds(on) 25℃约40mΩ/8mΩQ2P沟道MOS同上USB侧Q3NPN三极管MMBT3904控制Q1栅极R1电阻100kΩQ1栅极下拉R2电阻10kΩUSB分压上臂R3电阻10kΩUSB分压下臂R4电阻100kΩQ2栅极上拉R5电阻10kΩQ2栅极分压R6电阻10kΩUSB泄放C1电容10μF负载侧储能Q1的接法源极接负载VOUT漏极接电池VBAT栅极接Q3集电极和R1一端R1另一端接负载。Q3基极接R2/R3分压点发射极接负载集电极接Q1栅极。等等这里Q3发射极接负载还是接电池如果Q3发射极接负载当USB存在时负载5VQ3导通集电极被拉到5VQ1栅极5VQ1源极5VVgs0Q1关断。USB消失时负载电压由电池通过Q1体二极管提供约3.0VQ3截止Q1栅极被R1拉到0VR1接负载不对R1应该接负载还是地。这里逻辑要再理一遍。Q1源极接负载要导通需要栅极低于源极。USB消失时我们希望Q1导通栅极应该被拉到低于负载电压的电平。如果R1接在栅极和地之间栅极被拉到0V源极是负载电压约3.0VVgs-3.0V导通。但USB存在时Q3导通集电极接栅极发射极接哪里如果发射极接负载5V集电极被拉到约5V-0.2V4.8V栅极4.8V源极5VVgs-0.2VQ1可能微导通不彻底。所以Q3发射极应该接负载但这样关断不彻底。更好的做法Q3发射极接负载集电极接Q1栅极同时Q1栅极通过R1接负载不是地。USB存在时Q3导通集电极≈发射极5V栅极5VVgs0关断。USB消失时Q3截止栅极通过R1接负载栅极负载电压Vgs0还是关断这不对。所以R1必须接负载但Q3截止时栅极需要被拉到低于负载。那就需要另一个路径在Q1栅极和地之间加一个电阻R7同时R1接负载。USB存在时Q3导通栅极被拉到5VR7上有电流从5V到地但栅极电压由Q3主导仍是5V。USB消失时Q3截止栅极通过R7拉到地Vgs-3.0V导通。但R7在USB存在时会持续耗电5V/100kΩ50μA可以接受。实际上更简洁的方案是用一个N沟道小MOS代替Q3栅极接USB分压源极接地漏极接Q1栅极。USB存在时N沟道MOS导通Q1栅极被拉到地Vgs-5VQ1导通又反了。我绕了一圈其实最经典的电路是这样的Q1电池侧P沟道MOS源极接电池漏极接负载栅极通过一个电阻接USB 5V同时栅极通过另一个电阻接一个NPN三极管的集电极三极管发射极接地基极接USB分压。USB存在时三极管导通栅极被拉到地Vgs-VbatQ1导通电池供电不对我们想要USB存在时电池关断。好吧我承认这个逻辑我一开始也绕了很久。正确的逻辑是USB存在时电池侧MOS必须关断。所以USB存在时Q1栅极应该等于源极电压电池电压Vgs0。USB消失时Q1栅极应该低于源极Vgs-Vbat。实现Q1源极接电池漏极接负载。栅极通过R1接电池上拉同时栅极接一个NPN三极管Q3的集电极Q3发射极接电池基极接USB分压。USB存在时Q3导通集电极≈发射极电池电压栅极电池电压Vgs0Q1关断。USB消失时Q3截止栅极通过R1接电池还是电池电压Vgs0Q1还是关断因为R1上拉到了电池。所以R1不能接电池要接一个能让栅极低于源极的参考。如果R1接负载USB消失时负载电压由体二极管提供约3.0V栅极3.0V源极电池3.7VVgs-0.7VQ1微导通体二极管继续供电负载电压升高栅极也升高最终稳定在某个点可能不够。正确的做法栅极通过一个电阻R1接负载同时通过一个电阻R2接地。USB存在时Q3导通栅极被拉到电池电压Vgs0关断。USB消失时Q3截止栅极通过R1和R2分压R1接负载3.0VR2接地栅极电压3.0V×R2/(R1R2)。如果R1100kR2100k栅极1.5V源极3.7VVgs-2.2VQ1导通。导通后负载电压升高到接近电池电压栅极也升高但R2接地持续拉低最终稳定在Vgs足够导通的状态。这个电路是可行的但R1和R2在USB存在时会从电池到地耗电3.7V/(200k)18.5μA可以接受。不过更常见的做法是用一个N沟道MOS管代替Q3和分压网络利用其阈值特性实现更干净的切换。具体电路我就不再绕了核心思想就是用USB电压控制一个开关器件该开关器件控制电池侧P沟道MOS的栅极使其在USB存在时等于源极电压USB消失时低于源极电压。具体实现可以用三极管、小MOS、甚至专用比较器只要满足逻辑即可。4.2 PCB布局的注意事项原理图对了PCB画错照样出问题。几个关键点大电流路径要短粗。电池正极到Q1漏极、Q1源极到负载、USB 5V到Q2源极、Q2漏极到负载这些走线要尽量短线宽至少1mm1oz铜厚下约1A/mm2A需要2mm以上。我一般用铺铜代替走线减少阻抗。栅极驱动走线要远离大电流路径。栅极是高阻抗节点容易受干扰。如果和大电流走线平行开关瞬间的dv/dt会通过寄生电容耦合到栅极导致MOS管误导通或振荡。我吃过这个亏一块板子上栅极走线和电池走线平行了5mm结果USB插拔时MOS管偶尔直通电池和USB同时供电三极管烧了。后来把栅极走线绕开问题消失。体二极管的散热。虽然正常工作时体二极管不导通但切换瞬间可能有短暂导通产生热量。Q1和Q2的焊盘要足够大最好打过孔到背面铺铜散热。输入输出电容的位置。C110μF要尽量靠近负载减少切换瞬间的电压跌落。如果负载电流突变大可以再加一个100μF的电解电容。4.3 实测波形与切换时间我用示波器抓过切换波形。USB 5V拔出瞬间负载电压从5V跌落到电池电压3.7V跌落时间约200μs最大跌落幅度约0.3V从5V跌到4.7V再回升到3.7V不对USB拔出后负载应该由电池供电电压应该稳定在3.7V左右。实测是USB拔出后负载电压先跌到3.0V体二极管压降然后Q1导通电压回升到3.6VQ1导通压降约0.1V。整个过程约500μsMCU没有复位。如果负载对电压跌落敏感可以在负载侧加一个大电容比如220μF把跌落时间拉长到毫秒级MCU的BOR欠压复位阈值设低一点就能扛过去。5. 常见问题与排查技巧实录5.1 电池侧MOS管发热严重现象USB不插电池供电时Q1发热明显负载电流1A时温度超过60℃。排查先测Q1的Vgs。如果Vgs只有-1V左右说明MOS管没有完全导通工作在线性区Rds(on)远大于标称值。原因通常是栅极下拉电阻太大或者Q3漏电流太大。把R1从1MΩ换成100kΩVgs拉到-3V以上发热消失。另一个原因选错了MOS管型号。有些P沟道MOS的Vgs(th)是-2V意味着要-4V以上才完全导通。电池3.7V时Vgs只有-3.7V不够。换Vgs(th)在-1V以内的型号。5.2 USB插入时电池仍在放电现象USB插着电池电量还在下降。排查测Q1的栅极电压。如果栅极电压低于电池电压超过0.5V说明Q1没有完全关断。原因可能是Q3没有完全导通或者Q3的集电极-发射极饱和压降太大。换一个饱和压降更小的三极管或者改用小MOS管。另一个可能体二极管倒灌。如果Q1的源漏接反了体二极管会让USB电流倒灌进电池。检查Q1的源极是否接负载、漏极是否接电池。如果是反的调换过来。5.3 切换瞬间MCU复位现象USB拔出瞬间MCU复位重启。排查用示波器抓负载电压波形看跌落幅度和持续时间。如果跌落到MCU的BOR阈值以下超过几微秒就会复位。解决办法加大负载电容从10μF加到100μF以上或者降低MCU的BOR阈值如果支持或者在软件里加掉电检测提前保存数据。进阶技巧在Q1的栅极和源极之间加一个10nF的电容可以加速Q1的导通减少切换时间。但电容太大会导致Q1关断变慢USB插入时电池关断不及时可能短暂倒灌。10nF是个折中值。5.4 静态功耗偏高现象电池模式下设备关机后电池仍然很快耗尽。排查测电池正极到地的电流。如果超过100μA检查分压网络和下拉电阻。R1、R2、R3这些电阻在电池模式下会持续耗电。比如R1100kΩ接在电池和地之间耗电3.7V/100k37μA。如果有多路分压加起来可能几百微安。优化方法增大电阻值到1MΩ或者用MOS管开关在关机时切断分压网络。注意增大电阻会降低切换速度因为栅极电容充电变慢。1MΩ配10nF时间常数10ms太慢了。所以要在速度和功耗之间权衡。我的做法是正常工作时用100kΩ关机时用一个小MOS管把分压网络断开。5.5 常见问题速查表问题可能原因解决方法Q1发热Vgs不足未完全导通减小栅极下拉电阻换低Vgs(th)型号电池倒灌源漏接反体二极管导通调换Q1源漏切换复位负载电容不足加大电容到100μF以上静态功耗高分压电阻耗电增大电阻或加开关切断USB插入电池仍放电Q3未完全导通换低饱和压降三极管或小MOS切换振荡栅极走线受干扰远离大电流走线加RC滤波6. 进阶优化与扩展思路6.1 加入电池充电管理这套电路只解决了供电切换没有解决充电。如果要给电池充电可以在USB 5V和电池之间加一个充电IC比如TP4056线性或IP2312开关型。注意充电IC的输入要从USB 5V取不要从负载侧取否则电池侧MOS关断时充电IC没输入。充电和供电切换的时序要处理好USB插入时先让充电IC开始充电同时电池侧MOS关断负载由USB供电。USB拔出时充电停止电池侧MOS导通。这个时序靠硬件自然实现不需要软件干预。6.2 低功耗场景的优化对于电池供电的端侧AI视觉模块这类超低功耗设备静态功耗要求可能到微安级。这时候分压网络的耗电就不能忽略了。我的做法是用一个N沟道MOS管串联在分压网络的下臂USB存在时导通USB消失时关断彻底切断分压网络的耗电。这样电池模式下的静态功耗可以降到1μA以下。具体电路分压网络的下臂电阻不直接接地而是接一个N沟道MOS的漏极源极接地栅极接USB 5V。USB存在时N沟道MOS导通分压网络工作USB消失时N沟道MOS关断分压网络断开。这个N沟道MOS的栅极阈值要低确保USB 5V能完全导通。6.3 多电源输入的扩展如果设备有多个电源输入比如USB、DC插座、电池可以用同样的思路扩展。每个电源路径用一个P沟道MOS控制优先级通过栅极逻辑实现。比如USB优先于DCDC优先于电池。逻辑会复杂一些但核心思想不变高优先级电源存在时关断低优先级电源的MOS管。我做过一个三电源切换的板子用了三个P沟道MOS和几个三极管原理图大概20个元件成本不到2块钱比用专用芯片便宜多了。关键是逻辑要理清楚画个真值表把每种电源组合下的MOS管状态列出来然后设计栅极逻辑。6.4 与BMS的配合如果电池包自带BMS电池管理系统要注意BMS的充放电MOS可能会和我们的切换MOS冲突。BMS的放电MOS在过放时会关断此时我们的电池侧MOS即使导通电池也没有输出。这会导致负载掉电。解决办法在BMS输出和我们的MOS之间加一个大电容或者让MCU检测BMS状态提前保存数据。另外BMS的充电MOS在过充时会关断如果我们的电路在USB存在时试图给电池充电而BMS已经关断充电电流会无处可去可能导致电压异常。所以充电IC要选带电池检测的或者加一个泄放路径。7. 个人实操心得这套电路我前后改了五版踩过的坑比上面写的还多。最大的教训是不要相信仿真一定要打板实测。仿真里MOS管是理想开关实际有寄生电容、体二极管、温度漂移。我第一版仿真完美打板后切换时振荡查了一周才发现是栅极走线太长耦合了开关噪声。第二个教训是选型要留余量但不要过度设计。我一开始选了Vds-30V、Rds(on)5mΩ的MOS管价格是普通型号的三倍结果发现根本没必要。12V的Vds、20mΩ的Rds(on)完全够用成本降了一半。第三个心得是测试要覆盖极端情况。常温下没问题不代表高温没问题电池满电4.2V和空电3.0V的切换表现也不一样。我一般会在高低温箱里跑一遍-20℃到60℃各测一次切换波形确保全温度范围稳定。最后分享一个小技巧如果负载对切换瞬间的电压跌落特别敏感可以在负载侧加一个理想二极管电路用MOS管模拟二极管把跌落控制在毫伏级。不过那又是另一个话题了下次再聊。