用Buck-Boost芯片做片上UPS:掉电保护原理与实战
去年帮客户救急一块SSD测试板卡掉电丢映射表的问题最后不是靠堆超级电容解决的而是用一颗Buck-Boost Controller把整个后备电池路径管了起来。当时在调试记录里顺手写了一句话这玩意儿本质上就是个UPS-on-a-Chip。后来想想这个叫法还真不是夸张它确实把传统UPS里最核心的调压、切换、监测功能压缩到了一颗电源芯片里。如果你正在做嵌入式掉电保护、SSD缓存落盘、工业设备突然断电保存现场数据、或者车载设备在电源波动时保持不重启这篇文章应该能帮你省下不少弯路。我会从原理、关键计算、调试踩坑到选型把这种“片上UPS”方案讲透尽量用我能找到的真实经验和数据说话不讲空话。1. 为什么一颗升降压芯片能当“片上UPS”用1.1 传统后备电源方案的痛点在没有这种方案之前嵌入式系统要做掉电保护最常见的做法是“一堆芯片拼凑”。大致长这样后级用一颗Boost芯片给负载供电电池充电单独接一颗充电管理IC切换路径用理想二极管或者PMOS负载开关再配一颗电压监测芯片给MCU发掉电中断。如果需要多路电源还要增加负载切换逻辑。这个方案不是不能用但真实项目里你会被几个问题反复折磨。第一BOM器件太多PCB面积和成本都压不住尤其在消费类产品里每一平方毫米都在烧钱。第二上电时序和掉电时序很复杂充电器和DC-DC之间、负载开关和掉电检测之间都可能互相打架有时候硬件设计没问题软件初始化顺序不对一上电就锁死。第三也是我最头疼的切换速度。分立方案如果用普通比较器去控制负载开关比较器响应时间、MOSFET栅极驱动压摆率、后端电容放电速度全部叠加在一起很容易出现几十毫秒的真空期输出电压跌到MCU复位阈值以下系统直接重启掉电保护等于白做。有人会说那用超级电容呢超级电容方案确实简单但它在小电流应用里可行一旦负载电流超过2A、保持时间要几十毫秒超级电容的体积和成本就非常离谱。而且超级电容没有电压平坦的平台必须搭配一级升压或者升降压电路本质上还是回到了“DC-DC 切换”的组合。1.2 Buck-Boost控制器的位置和“片上UPS”的真实含义Buck-Boost Controller翻译过来就是升降压控制器它本身就是一个宽输入范围开关电源输出可以稳定在一个固定电压不管输入是高于还是低于输出。这一点对电池供电来说极其关键因为电池放电过程中电压一直在掉一颗满电锂电池是4.2V放到3.0V以下如果要稳定输出3.3V单用Boost在输入高于3.3V时没法工作单用Buck在输入低于3.3V时又无法稳压。只有Buck-Boost能从头到尾把输出稳住。但“UPS-on-a-Chip”并不仅仅是“能升能降”这么简单。它真正的含义是把传统UPS里的电压调整、掉电检测、输入/电池路径切换、电池充电管理、甚至系统级保护都集成到一颗芯片里。当主输入电源正常时芯片从VIN给负载供电同时对后备电池充电当主输入突然掉电芯片内部路径快速切换到电池由同一个Buck-Boost拓扑继续稳压输出MCU或SoC因此获得一段宝贵的“续命时间”来保存现场数据、写NVM、执行安全关机。这个方案适合的人群很明确硬件工程师、电源工程师、以及所有在做低功耗嵌入式或工业产品的朋友。它不解决大功率、长时间UPS的需求但针对毫秒级到秒级掉电保持它是目前集成度最高、最容易调试的一种思路。2. 核心原理无缝切换与掉电保持怎么实现2.1 四开关Buck-Boost的三种工作状态要理解片上UPS先要搞懂Buck-Boost是怎么工作的。现在常见的Buck-Boost采用四个MOSFET结构分别是输入侧高边MOSFET、输入侧低边MOSFET、输出侧高边MOSFET、输出侧低边MOSFET。这四个开关配合一个电感就能实现降压、升降压、升压三种工作状态。当输入电压明显高于输出电压时芯片工作在一号状态也就是Buck模式。此时输出侧高边MOSFET常通输出侧低边MOSFET常关输入侧两个管子做高频PWM电感输入侧被周期性地接通和断开输出侧等效于一个Buck电路。占空比D约等于VOUT除以VIN。当输入电压明显低于输出电压时芯片工作在二号状态也就是Boost模式。此时输入侧高边MOSFET常通输入侧低边MOSFET常关输出侧两个管子做PWM电感从输入端持续储能输出侧通过升压开关网络把电压抬起来。占空比D约等于1减去VIN除以VOUT。最复杂的其实是中间状态当输入电压和输出电压接近时不管Buck还是Boost单独工作都会出现占空比接近极限的情况输出纹波变大环路不稳定。所以真正好的Buck-Boost芯片会在输入电压接近输出电压时进入升降压过渡模式四个管子全部参与开关或者让Buck和Boost的占空比同时偏离极限值形成一个“过渡区”。这个过渡区的存在是为了实现无缝模式切换。如果芯片在Buck模式和Boost模式之间直接跳变电感电流和环路相位会突变输出电压出现尖峰或跌落这在UPS场景下是完全不可接受的。2.2 从主输入掉电到电池接管系统里发生了什么一个完整的片上UPS工作流程其实是一个状态机。主输入正常时芯片通过VIN给负载供电同时内部或外部的充电电路给后备电池充电。对于单节锂电池充电电压一般设置为4.2V充电电流可以通过外部电阻或I2C寄存器配置。这个时候整个系统是“VIN优先”的电池处于待命状态。一旦VIN开始掉电首先是输入电压检测比较器被触发或者是UVLO欠压锁定阈值被穿越。芯片内部会快速切断VIN到电感的路径同时把电池路径接入。这个过程在数据手册里通常叫Switchover Time好的设计可以做到几十微秒以内。切换期间输出端的大电容会临时承担瞬间能量供给防止输出电压下跌到复位阈值。电池接管后Buck-Boost进入正常工作状态。如果电池电压高于输出电压等效Buck如果电池电压低于输出电压等效Boost。因为电池电压从4.2V到3.0V跨越了3.3V输出点所以Buck-Boost能保证全程稳压这就是它比单纯Boost方案强的地方。系统MCU在这个阶段会收到掉电中断执行数据保存然后主动关闭外设最后让芯片进入低功耗或关断状态。整个链条里最容易出问题的其实是“路径切换瞬间”。电池和VIN两路输入在切换时不能出现同时导通否则输入会倒灌也不能有一段完全断开的时间否则输出没有能量来源。所以现代芯片普遍采用make-before-break策略也就是先建立新路径再断开旧路径。这个“先接后断”的过程需要非常精准的时序控制这也是为什么分立方案很难做到的原因。2.3 为什么输出电容不能当“UPS”用很多人刚接触这个概念时会想既然输出电容能在掉电瞬间放电维持输出电压那我多加几个大电容不就完事了吗这个问题我实际算过一次之后才彻底放弃。输出电容储存的能量E等于二分之一乘以电容量C再乘以电压平方差。假设输出3.3V允许跌到3.1V一颗100μF的陶瓷电容能提供的能量大约是E等于0.5乘以100μF再乘以3.3的平方减去3.1的平方算出来大概64微焦。如果负载是2A、3.3V系统功率6.6W那么64微焦只能撑大约9.7微秒。也就是说一颗100μF电容连10微秒都撑不住。这个计算告诉我们两个事实第一输出电容的缓冲能力非常有限它不是用来支撑整个掉电保持时间的只是用来覆盖切换过程的真空期第二既然输出电容只能撑几十微秒芯片的切换时间就必须足够快。如果一颗芯片标称切换时间100微秒那后端电容至少要撑过100微秒按2A负载、0.1V跌落来算电容要2000μF这在板上几乎不可接受。所以选型时切换时间这个参数比很多静态指标都重要。3. 手把手估算参数搭一套芯片级UPS的关键设计3.1 先理清需求再算参数在选芯片和画原理图之前我会先把需求列成一张表。这步看着简单但很多人跳过结果后面不停返工。需要确定的参数包括输出电压、最大负载电流、主输入电压范围、后备电池类型和电压范围、最小掉电保持时间、允许输出电压跌落范围、是否需要在掉电期间保存数据、环境温度范围。举个例子假设我们要设计一个3.3V/2A的工控数据采集模块主输入是5V后备电池是单节锂电池电压范围3.0V到4.2V掉电后需要保持系统运行50毫秒允许输出电压跌落到3.2V同时MCU必须完成数据写入。这个需求看起来不算苛刻但仔细一算50毫秒内系统要消耗6.6W乘以0.05秒等于0.33焦耳能量。如果完全靠输出电容需要好几十毫法根本不可行。所以必须靠电池电容只负责切换瞬间。3.2 电感值和输出电容的计算过程确定需求后先算电感。电感值决定了纹波电流和带载能力惯用的经验值是让电感纹波电流峰峰值等于最大负载电流的20%到40%。我们按30%算就是0.6A。主输入5V输出3.3VBuck模式下占空比为0.66。如果开关频率是1MHz电感的伏秒平衡公式可以推导出L等于VIN减VOUT乘以D再除以开关频率乘以ΔIL。把数字代进去得到L约等于5减3.3乘以0.66再除以1兆赫兹乘以0.6结果大概是1.87微亨。考虑到实际电感的饱和余量和DC偏置下的电感量下降我会取3.3微亨这样纹波电流更小同时在Boost模式时也不会太大。如果是电池电压3.0V升压到3.3V的低压差工况占空比约0.09纹波电流会小很多3.3微亨完全够用。输出电容主要看切换瞬态。假设芯片切换时间标称10微秒在这10微秒里输出电容必须把电压维持在允许范围内。按2A负载、允许跌落0.1V计算电容最小值为C等于2A乘以10微秒除以0.1V等于200微法。实际我会在输出端多留20%到30%的余量同时并联一颗1μF到10μF的高频陶瓷电容用于滤除开关纹波。需要注意的是陶瓷电容在直流偏压下容值会下降X5R/X7R材质在3.3V偏压可能只剩标称的70%所以选型时要用直流偏置后的有效容值来算。3.3 电池放电深度与保持时间的实用估算电池容量怎么选先算掉电保持期间消耗的总能量。3.3V乘以2A等于6.6W乘以0.05秒等于0.33焦耳。单节锂电池放电平台电压平均约3.6V那么从电池侧看需要提供约0.33焦耳除以3.6V等于0.0917库仑折算成容量大概是0.0255毫安时。这只是理论值考虑到Buck-Boost在电池电压从4.2V降到3.0V全程的效率按85%估算电池实际需要大约0.03毫安时。这个容量对几十毫安时的小锂电池来说绰绰有余。但这不等于随便选个电池就行。最大的坑在于电池内阻和路径阻抗。掉电瞬间负载电流全部从电池走如果电池内阻偏大电池端电压会被瞬间拉低可能直接触发电池欠压保护。比如单节锂电池内阻200毫欧2A电流会产生0.4V压降在3.2V电池电压下瞬间就掉到2.8V系统可能提前关机。所以我建议把电池容量选择在负载电流的十倍小时率以上也就是至少选500毫安时的电池内阻才不会成为瓶颈。放电截止电压也要提前定义。为了保护锂电池不过放我一般把截止电压设为3.0V并且设置100mV到200mV的回差。当电池电压到达3.0V时芯片或MCU应该强制进入低功耗状态关闭非必要外设只保留最后的数据保存动作。否则电池深度放电后容量永久衰减下一次掉电保护可能直接失效。3.4 关键阈值设置掉电检测和电池保护掉电检测阈值是整个片上UPS方案的“扳机”。阈值设高了主输入稍微波动就会误切换频繁让电池介入阈值设低了等到真正断电时输入电容的能量已经耗尽切换还没开始输出可能已经跌落。我的做法是把掉电检测阈值放在主输入最低正常电压以下约3%到5%的位置。比如主输入标称5V最低允许4.5V那我就把检测阈值设在4.4V左右留一点余量同时加上至少10微秒的去抖时间避免母线纹波或者负载突变造成误判。电池电压保护也要设置两级。第一级是欠压警告通常在电池电压低于3.4V时告诉MCU“我电量不多了”让系统提前降频或者减少负载。第二级是欠压截止在3.0V左右直接切断电池放电路径防止电池被过度拉低。注意截止动作要有迟滞不能电压恢复一点又重新打开否则系统会在一段时间内反复重启那个现象在调试时非常隐蔽。4. 调试中的坑与排查技巧4.1 模式切换毛刺导致系统复位我第一次调Buck-Boost方案时遇到最头疼的问题就是模式切换毛刺。用示波器抓VIN从5V往下掉的波形VOUT在VIN跨过输出电压附近时突然出现一个300mV的尖刺系统直接复位。排查了很久最后发现这不是电感饱和也不是负载问题而是芯片从Buck模式切到Boost模式时内部控制环路在过渡区没有做平滑处理导致占空比突变。解决思路有几个。第一优先选支持“无缝模式切换”的芯片这类芯片在VIN接近VOUT时会进入过渡区让Buck和Boost同时协同工作而不是突然跳变。第二如果芯片已经选了只能靠外部补偿可以适当增加输出电容把瞬态尖峰吸收掉。第三检查模式切换相关配置引脚有些芯片允许通过外部电阻或软件调整模式切换阈值把它调到负载比较轻的区域尖峰幅度会明显下降。调试时别只盯稳态波形。正确做法是用一台可编程电源把VIN从5V快速拉低到0V同时用示波器同时监测VIN、VOUT、SW节点和电池电流。只有这种动态测试才能暴露切换问题。4.2 电池倒灌输入电源第二个高频问题是VIN掉电后电池电压反向倒灌到输入端。现象是主电源已经断开但VIN引脚上还测到电压甚至把前级电源芯片锁死或烧毁。原因是芯片在切换时没有真正断开VIN到电感的路径电池通过体二极管或者内部寄生路径反灌回去。这类问题在选型阶段就要排除。一定要看数据手册里有没有“Input Disconnect”或者“Load Disconnect”功能也就是当输入掉电时芯片能否把输入路径彻底切断。如果没有这个功能就必须在外面加一颗PMOS负载开关串在VIN和芯片VIN引脚之间由掉电检测信号驱动关断。实际项目里我会在PMOS栅极加一个RC延时防止上电瞬间误触发。测试方法也很简单正常工作时把VIN直接拔掉用示波器看VIN引脚电压应该在几十微秒内降到0V以下或者变成高阻状态。如果VIN一直保持在一个稳定的电压那说明倒灌路径没切断必须查芯片配置和外部开关逻辑。4.3 电池边界与低电量反复重启第三种坑是电池电压在3.0V到3.2V边界时系统出现随机重启。这个问题非常讨厌因为它不是每次都复现看起来像接触不良其实是电池内阻和芯片欠压保护相互作用的结果。当电池电量低时内阻变大放电时端电压瞬间被拉低。芯片检测到电池电压低于截止阈值就会切断电池路径切断后电池没有电流流过端电压又回升到截止阈值以上芯片又重新打开路径如此反复形成一个低频振荡系统不断重启数据永远存不下来。对策是三层一是在软件上增加启动保持时间掉电保存流程一旦开始就不允许因为电池电压抖动而中断二是把芯片电池欠压保护阈值压低一点并增加迟滞迟滞至少要大于电池内阻在最大负载下产生的压降三是在硬件上尽量把电池电压采样点放在电池根部而不是放在经过开关和接触电阻之后的地方否则采样到的电压比真实电池电压低很多会过早切断供电。4.4 布局与热设计细节Buck-Boost电路在大电流场景下热点往往不在芯片本身而在电感和功率MOSFET上。特别是电池电压低、输出电流大的Boost模式输入电流远大于输出电流电感和输入侧MOSFET的发热会比正常Buck模式严重很多。PCB布局上我坚持几个原则功率回路要短输入电容、电感、输出电容、芯片功率引脚形成的最小回路面积越小越好SW节点是高频高dv/dt信号走线要短而粗远离反馈网络和模拟地反馈电阻的采样点必须从输出电容的正极单独走线不能靠近电感或SW节点否则纹波会被耦合进去。热设计上如果系统要在3.0V电池输入、2A负载下持续工作几十毫秒虽然时间短但热冲击仍然明显。芯片底部的散热焊盘一定要打过孔到内层地平面不能只靠顶层铜皮。我见过一些工程样品就是漏了散热过孔掉电保持测试连续跑几十次后芯片过热保护输出直接没了。5. 选型建议与个人经验5.1 方案对比真片上UPS、分立UPS、超级电容我这里做了一张表方便大家快速决策方案类型典型保持时间BOM复杂度成本调试难度适用场景单芯片Buck-Boost带电源路径几ms到几秒低中低SSD掉电保护、工控设备、便携仪表独立充电IC Boost/升降压 理想二极管几ms到几分钟高高高需要大电池长时间保持的系统超级电容 升降压几十ms到几百ms中中高中负载电流较小、不允许用锂电池的场合传统离线式UPS分钟到小时极高极高极高系统级机房、大功率设备我的判断标准很简单如果系统掉电保持需求在100毫秒以内负载电流5A以下优先考虑单芯片Buck-Boost带电源路径方案如果保持时间需要几秒以上或者系统本身已经有电池在供电才考虑分立方案如果完全不想碰锂电池那只能上超级电容但要做好成本飙升的心理准备。5.2 我选型时必看的三个指标第一是切换时间英文标Switchover Time或者Backup Mode Transition Time。这个参数通常给几十微秒到几百微秒越小越好。千万别只看效率曲线切换时间才是决定输出电容尺寸和掉电瞬间系统稳定性的核心。第二是输入掉电检测响应阈值和去抖时间。有些芯片的UVLO阈值内部固定有些可以通过电阻分压调整。可调阈值的芯片更灵活但去抖时间如果太短容易误触发太长又会延迟切换。能找到内部去抖时间在10微秒到50微秒之间的芯片是最好的。第三是电池充电路径是否内置。如果芯片没有内置充电器只是简单的Buck-Boost带路径切换那外置充电IC会增加很多复杂度。反过来如果芯片内置了线性充电充电电流通常不大适合几十到几百毫安时的后备电池如果后备电池容量很大充电时间会让人痛苦这时候反而要选外置充电方案。5.3 验收测试清单最后分享一份我在量产项目里实际使用的验收清单照着测一遍基本能把坑踩完用可编程电源模拟VIN从5V在50毫秒内线性跌落到0V同时用示波器记录VOUT确认没有超过允许范围。用电子负载把负载电流从0.5A跳变到2A观察VOUT瞬态恢复是否满足要求。掉电期间抓取电池电流波形确认电池路径在切换后是连续导通的没有PWM停振或限流打嗝。连续做50次掉电循环每次间隔1秒观察芯片温度和保护是否触发。把电池放到截止电压附近再做一次掉电测试确认欠压阈值和迟滞不会导致反复重启。测一下静态损耗也就是设备空闲时VIN到电池充电的电流避免后备电池长期被涓流把容量充坏。如果这些测试都通过基本可以放心进入量产。如果中间任何一项失败不要急着怪芯片优先检查切换配置引脚和输出电容容值。我自己用了两年多这种片上UPS方案最大的体会是它把掉电保护从“系统工程”降级成了“选型工程”。以前要协调四五个芯片的时序现在只要把一颗芯片的寄存器或者外部电阻设对剩下的交给芯片内部的状态机。不过它也逼着我把切换时间、输出电容有效容值、电池内阻这些以前不太在意的细节看得更重。做电源设计永远是细节决定成败尤其是“最后一口气”这种关键场景。