
又到了报排期的季节客户的需求往往就一句话做一个单C口、双向、最大100W的移动电源能给笔记本充也能让适配器回充。拆开这句话核心就落到USB Type-C PD移动电源参考设计那套东西上——协议握手、四开关Buck-Boost、电池路径管理三块拼起来。我手里这台100W参考方案电池侧用四串锂电输出侧最高20V/5A协议层跑PD3.0加PPS实际测下来笔记本快充、手机快充、Switch底座都稳。这篇把方案从架构到参数、从调试验证到兼容性处理过一遍适合正在选型或调硬件的新手老工程师也能对着看哪有坑。1. 项目定位与整体设计思路1.1 为什么最终选定了USB PD协议栈开始这个项目之前我们其实对比过好几条路线。Type-C口普及之后老式的USB-A口移动电源基本退出主流原因很简单笔记本、平板、掌机都要Type-C而且笔记本普遍要20V电压USB-A那种5V/2A的供电完全推不动。QC虽然也有12V、20V档位但QC的识别走的是D/D-线上握手和Type-C口CC引脚上的PD协商根本不是一回事。USB PD是通过CC引脚传递结构化的能力包和请求包Source和Sink之间可以协商出完全连续的电压电流组合这是QC那种“盲猜电压档”没法比的。真正让我下定决心做PD3.0加PPS还是因为手机兼容性。手机厂商现在普遍倾向用PPS做低压直充或者降压充电PD3.0的PPS能输出可编程电压档充电电压可以跟着电池当前电压走而不是死板地切9V、12V。移动电源不支持PPS插手机上往往就是9V2A或者5V2A充得慢还发热支持PPS之后电流可以拉到5A档甚至更高用户体验完全不在一个层次。所以这个方案最终定了两个硬指标PD3.0 PPS以及双向DRP。双向意味着平时当Source给设备放电插上适配器时又能当Sink被回充。DRP角色切换比单纯做Source麻烦得多。CC线上同时存在Rp和Rd你需要实时检测对端到底是个适配器还是消费电子设备。这个检测做不好就会出现“两个Source对上眼、谁都不肯低头”的僵局。后面第三章我会专门讲CC检测的电路处理这里先记住结论方案选型时一定要选支持DRP的协议芯片或者用MCU控制模拟开关主动切换Rp/Rd。1.2 系统架构从电池到Type-C的四条主线整个移动电源可以拆成四个模块电池侧电芯、保护、电量计、均衡、功率转换双向升降压、协议控制PD/QC/BC1.2识别、系统控制MCU、按键、LED、NTC。数据流和功率流是分开的功率流从电池经过保护板进H桥再到VBUS开关最后到Type-C口控制流则是MCU通过I2C总线读写协议芯片和升降压控制器再通过GPIO控制VBUS开关、指示灯和温度检测。这里有一个必须一开始就想清楚的架构决策为什么用四开关Buck-Boost而不是Boost加一个大电流Buck的组合。原因是电池电压范围很尴尬。四串锂电满电16.8V放电到12V左右而输出档位有5V、9V、12V、15V、20V。5V和9V需要降压20V需要升压12V和15V落在电池电压中间到底是Buck还是Boost取决于电池当前的电压。如果做两组独立的单向变换器功率器件翻倍、PCB面积翻倍、成本也翻倍。四开关Buck-Boost本质是一个H桥同一套MOSFET和电感通过控制器切换工作模式就能覆盖降压和升压两个方向功率路径还完全对称充放电时复用同一套器件这才是移动电源该有的形态。这个架构也决定了整机的BOM成本不会太低。四个功率MOSFET加一颗大电流电感加上协议芯片和MCU已经比传统USB-A移动电源贵出一截。但你要的是100W想给笔记本供电这就绕不开。如果只是做22.5W的小充电宝集成移动电源SoC会更省事这个对比我放到第二章细说。2. 核心器件选型与方案对比2.1 双向升降压控制器怎么挑升降压控制器是整个功率级的发动机选型时我会重点看五个参数输入输出电压范围、支持电池节数、是否原生双向、I2C寄存器控制、以及电流检测精度。对100W移动电源来说电池侧是4S锂电输入输出范围要覆盖5V到20V控制器必须原生支持双向Buck-Boost否则你还要在外部搭反向通路复杂度直接翻倍。这次参考设计我用了南芯的SC8815这颗料主要看重它的开关频率高、内置充电管理逻辑、I2C可控而且是双向Buck-Boost能省掉不少外围。如果换成TI的BQ25710/BQ25713系列逻辑其实一模一样只是寄存器和配置方式不同。选国产还是选进口主要看团队对哪家的寄存器更熟、供应链能不能拿到货原理上的差别不大。需要提醒的是控制器一般都支持1到4节电池配置但电池节数一旦定了最高输出电压也基本定了4S电池跑20V输出比较稳2S电池想跑20V就有点吃力实际设计时不要把控制器规格拉满留点余量。电流检测精度很关键。PD协商到20V/5A时输出功率是100W电池侧平均电流可能要到8A甚至更高。如果控制器内部电流采样误差太大限流点就会出现明显漂移轻则无法满功率输出重则过流保护误触发导致设备一拉大电流就重启。选型时我习惯看控制器是否支持低边或高边差分采样采样电阻尽量用1mΩ级别的合金电阻开尔文走线这个细节比控制器本身贵不贵更重要。2.2 PD协议芯片与MCU的职责分工PD协议这部分有两种做法一种是用集成PD协议栈的移动电源SoC比如IP5389这类芯片内部把升降压控制和PD状态机全包了适合快速出产品另一种是分立方案用PD PHY芯片加MCU协议栈自己写或者用开源库适合做100W以上、多口、自定义策略的产品。我这个项目需要灵活调PPS参数和功率分配所以选了分立方案。PD PHY芯片我用的是FUSB302这颗经典料它本质上是CC物理层收发器负责把CC线上的双相标记编码BMC信号解码成数字数据然后通过I2C中断通知MCU。真正的PD状态机、Source Capabilities组包、Request解析、PPS参数管理全都在MCU固件里跑。这样做的优点是灵活比如我可以随时通过串口升级协议栈调整支持的电压档位甚至给不同设备走私有策略。缺点也很明显固件里有一个状态没处理好设备就协商不上调试周期比集成方案长。MCU选STM32G0系列性价比高I2C和ADC资源够用。它的任务不只是跑PD协议栈还要管理升降压控制器的I2C配置、监测NTC温度、处理按键和LED、以及判断DRP角色切换。PD PHY和MCU的分工可以这样理解PHY是嘴巴负责把话翻译成CC线上的电平MCU是大脑负责决定说什么话、怎么回应对方。2.3 电感和功率管参数直接决定效率和发热很多人觉得功率级选型就是把控制器选好剩下的MOSFET和电感随便找个大封装安上。实际调试时效率、温升、纹波、EMC这些问题基本都是电感和MOSFET选型不当引起的。电感我最后选了4.7μH饱和电流15A这个值不是拍脑袋出来的具体计算过程在3.2节展开。选功率电感时重点看三样DCR直流电阻、饱和电流、磁芯材质。DCR直接决定满载铜损100W输出时DCR差个2mΩ发热差出好几瓦。磁芯材质建议选铁硅铝或者金属粉芯不能用那种高磁导率的铁氧体功率电感饱和曲线太陡一饱和就崩。MOSFET方面四个功率管我都选了30V耐压、Rds(on)在8mΩ到12mΩ之间的料。可能有人觉得20V输出30V耐压余量不够实际上VBUS上还有适配器回充的场景适配器输出可能有20V再加一点寄生电感尖峰30V已经有点紧张更稳妥的是选40V耐压的管子导通电阻稍微大点也认了。栅极电荷Qg要控制在30nC以内否则SC8815的栅极驱动电路会有点吃力开关边沿变缓开关损耗飙升。PCB布局上H桥加电感的功率环路要尽量小SW节点铜皮要短而宽。四个MOSFET的栅极电阻要靠近管子别为了整齐把电阻放在驱动芯片边上否则开关振铃有你受的。VBUS输出电容至少放两颗22μF/25V的陶瓷电容还要注意MLCC的直流偏压降容20V档位下25V耐压的X7R实际容量可能只剩六成有条件就上50V耐压的。3. 电路实现从CC检测到升降压功率级的核心细节3.1 CC1/CC2检测与DRP角色切换的电路处理Type-C接口的CC1和CC2两个引脚承担了设备插入检测和角色识别的工作。作为Sink设备内部会下拉一个5.1kΩ电阻到地也就是Rd作为Source设备内部会上拉一个电阻到特定电压也就是Rp。主控通过检测CC引脚上的电压就能判断对端是什么类型。DRP设备需要周期性切换Rp和Rd比如每100ms切换一次检测到对端下拉时自己就是Source检测到对端上拉时自己就是Sink。我的做法是在CC1、CC2上接一组模拟开关和标准电阻让MCU的GPIO控制切换。具体电路不复杂每个CC引脚都有两条通路一条通过10kΩ上拉到VBUS或者3.3V另一条通过5.1kΩ下拉到地。MCU先让两个引脚都保持下拉测量电压如果有设备拉高说明对端是Source再把引脚配置成上拉如果电压被拉到低电平说明对端是Sink。这个过程要配合协议芯片一起做因为FUSB302也在监听CC线状态切换太频繁容易把协议状态机搞乱。这里有一个特别容易踩的坑e-marker线缆检测。如果你的移动电源支持20V/5A而用户用了一根没有e-marker芯片的普通Type-C线你贸然在20V档输出5A线缆可能扛不住。PD规范要求输出超过5A之前必须通过CC线上Discover Identity指令读取线缆的e-marker信息确认线缆支持5A。所以固件里一定要有e-marker识别失败就限制最大电流的逻辑否则不只是兼容性问题可能涉及安全风险。3.2 四开关Buck-Boost的功率级参数计算这一节是很多人想抄作业的地方我把计算过程摊开讲。四开关Buck-Boost在Buck模式下的等效电路是Q1做主开关、Q2做同步整流、Q3常开、Q4常关Boost模式下则是Q4做主开关、Q3做同步整流、Q1常开、Q2常关。所以实际功率级设计四个管子都是对称的全桥只是控制策略不同。电感感值估算我按两种模式分别算了一遍。Buck模式用公式 L Vout × (Vin - Vout) / (fsw × ΔIL × Vin) 取Vin16.8V电池满电、Vout12V、fsw500kHz、ΔIL按满载5A的30%取1.5A算出来 L 12 × (16.8 - 12) / (500k × 1.5 × 16.8) ≈ 4.57μH。 Boost模式用公式 L ≥ Vin_min² × (Vout - Vin_min) / (fsw × ΔIL × Vout²) 取Vin_min12V、Vout20VΔIL还是1.5A L 12² × (20 - 12) / (500k × 1.5 × 20²) ≈ 3.84μH。 两个模式都指向3.3μH到4.7μH这个区间我选了4.7μH偏保守一点纹波更小代价是尺寸稍大。饱和电流按峰值算满功率100W电池侧平均电流在8.3A以上再加1.5A纹波一半峰值接近9A留出20%以上的余量所以15A饱和电流是底线。输入输出电容主要看瞬态响应和电压纹波。陶瓷电容在直流偏压下容量会衰减20V输出档建议用两到三颗22μF/25V并联实测20V下等效容量可能只剩12μF左右但并联后基本够用。如果瞬态跌落还是超标可以再并一颗100μF的电解电容但要注意ESR不能太大否则高频纹波滤不干净。3.3 电池保护、电量计与温控电池侧的安全设计很容易被低估。四串锂电不是简单串起来就行每一节都要监控电压这就要用电池保护AFE。这个方案里我用了BQ76920这样的模拟前端它负责采集每节电芯电压、做二级过压过流保护还带电池温度采样。一整串电池一旦出现某一节过压保护IC必须能直接切断充电MOSFET或者断开放电通路不能依赖MCU动作因为这属于安全路径要独立于固件工作。电量计方面入门方案是MCU查开路电压表但100W大功率放电场景下电芯内阻压降非常明显开路电压法会在高负载时严重低估容量。我做的是库仑计方案用电流采样电阻加积分算法误差能控制在5%以内。没有专用电量计IC也没关系MCU里用定时器对电流采样做累加配合电压修正就够了。但要注意低电量时如果还继续拉满100W电芯电压会瞬间跌到保护点导致整机掉电所以固件要做一个“电池百分比越低可用最大功率越小”的功率限制策略。温控这里我要多说一句。H桥功率部分和电池部分都要放NTC。电池的充电温度范围一般控制在0到45℃放电可以宽到-20到60℃功率部分的核心温度可以通过控制器的die温度读出来但PCB和电感的表面温度也必须关注。我实测100W满载二十分钟电感表面温度能到85℃以上如果壳内没有散热设计很容易触发降频保护导致输出功率莫名跳变。4. 调试过程与实测实录4.1 上电顺序从烧录固件到PD协商的完整流程新板子第一次上电别直接插笔记本我用的是可编程电源加电子负载。先把固件烧进去MCU初始化I2C、GPIO、ADC读取电池电压确认NTC温度在安全范围内。这时升降压控制器应该输出一个默认的5V电压但VBUS开关还是关着的所以Type-C口上并没有电。等MCU检测到设备连接后才打开发送Source Capabilities的流程。PD协商成功的大致顺序是MCU先发Source Capabilities包列出5V/3A、9V/3A、12V/3A、15V/3A、20V/5A这些档位Sink设备收到后会回一个Request包请求其中某个档位MCU解析Request之后先通过I2C把升降压控制器的输出电压寄存器设成目标电压同时打开输出反馈的ADC检测等电压稳定到目标值附近再发Accept和PS_RDY。这个顺序绝对不能反过来如果先发PS_RDY再调电压Sink设备会立刻拉载而你的降压环路还没稳定VBUS会被直接拉垮严重时还会造成环路振荡。充电方向则是反过来的。MCU作为Sink检测到适配器插入适配器会先发Source CapabilitiesMCU根据当前电池电量和充电策略选择一个合适的档位发出Request。这时升降压控制器会被配置成反向变换把VBUS上较高的电压降到电池充电电压。回充时同样有顺序问题先配置好充电电压和充电电流再发Accept不然适配器一开大电流电池侧可能过压。4.2 关键波形开关节点、电感电流、负载瞬态调试过程我最先看的是SW节点波形。SC8815的SW节点是H桥中间点Buck模式下SW1应该是0到Vin的方波SW2接近Vout。用示波器探头直接量SW节点能看到比较干净的方波重点检查死区时间确保高边和低边的导通之间有足够的间隔不然上下管直通电流就会瞬间飙升。这个波形如果边沿振铃严重多半是栅极电阻太大或者走线过长改小栅极电阻能缓解但也不能太小否则EMC会变差。电感电流波形我习惯用低边MOSFET的Vds估算没有电流探头也能看个大概。正常情况下电感电流是CCM三角波峰峰值应该在1.5A左右。如果发现电感电流波形出现平台或者畸变大概率是电感饱和了这时候波形会明显变尖同时效率下降、温升加快。负载瞬态是判断环路稳定的关键。我设置电子负载从1A阶跃到4A上升沿大概1A/μs观察VBUS的电压跌落。20V档位100W输出瞬态跌落控制在200到300mV是正常水平如果跌到500mV以上就要考虑增加输出电容或者查环路补偿。SC8815这类控制器的补偿一般是内部固定的能改的空间不大所以外围电容电感的取值反而更重要。4.3 兼容性实测与数据汇总兼容性测试这关过得很痛苦但也最有收获。我列了一张表记录各设备的实测情况设备类型预期档位实测档位结果备注65W笔记本20V/3.25A20V/3.25A通过协商稳定满载无掉压120W私有协议手机PPS 18V左右18V/5A通过走PD PPS未走私有协议Switch底座15V/2.6A15V/3A通过底座识别正常TV模式正常只支持BC1.2的老设备5V/1.5A5V/1.5A通过走了D/D-检测未走PD65W PD适配器回充20V/3A20V/3A通过回充稳定无打嗝最意外的是某品牌手机走PPS时Request电压不是整数而是18.2V这种带小数的值这说明PD3.0的PPS确实是可编程的不像普通PD档位只能选固定电压。如果你的协议栈不支持小数电压请求这个手机就只能退回普通PD档充电功率会低不少。另外一个注意点是VBUS软启动。设备刚插入时VBUS上有输出电容瞬间冲击电流会很大VBUS开关如果直接导通会产生浪涌。我额外做了一个软启动逻辑VBUS开关用MOSFET加RC缓启动实测能明显降低插入瞬间的火花和电压跌落。5. 常见问题与排查技巧实录5.1 PD协商失败、设备不识别怎么办项目调试中最常见的故障就是插上设备没反应或者只能出5V上不了高压。先别急着怀疑芯片第一步用示波器量CC引脚电压。Source模式下CC引脚上应该有Rp上拉的电压如果CC电压一直为0说明Rp没接对或者模拟开关没有切换到Source模式。DRP切换时序也有影响如果切换周期太短FUSB302还没完成检测就被打断设备就识别不出来。第二步抓CC线上的数据包。FUSB302会通过I2C中断上报收到的PD消息在MCU固件里加一个环形缓冲把收到的原始PD包通过串口打出来。看看是不是收到了Sink发来的Request包如果一直没收到说明Source Capabilities发得有问题如果收到了但MCU没响应就要检查中断标志有没有被及时清除。我一开始就吃过这个亏I2C读取频率太低FUSB302的FIFO溢出协议包丢失设备自然协商不上。如果协商成功但一拉载就保护问题基本出在功率级。检查VBUS开关的过流阈值和升降压控制器的限流点是不是设得太接近两个保护点应该留出足够的余量。还有可能是电池侧的供电能力不够低电量时电池电压被拉低到欠压点整机直接关机这个要靠固件做功率限制来解决。5.2 输出电压跌落、纹波过大怎么定位电压跌落和纹波问题我一般按这个顺序排查先用电子负载做静载观察不同负载下的输出电压。如果空载正常、满载跌落明显优先怀疑电感饱和或者输出电容不足。电感饱和时SW节点的占空比波形会变形同时伴有嘶嘶声手摸电感发烫基本可以确诊。如果确认电感没问题再看输出电容。MLCC在直流偏压下容量会大幅衰减20V档位下25V耐压的X7R实际容量不到标称的60%所以C有效值可能不够。另一个容易被忽略的是反馈采样点走线。如果输出电压采样线走在功率回路远端采样点拾取的是经过PCB走线压降后的电压满载时可能已经损失了几百毫伏。解决方案是远端采样把反馈走线单独从负载端引回控制器走线要细、远离功率电感避免被开关噪声污染。还有一种情况是负载瞬态时出现低频振荡示波器上看VBUS像一个衰减的正弦波。这个多半是环路稳定裕度不足控制器补偿固定的前提下试着调整输出电容的ESR或者输入电容的容量。我会并一颗小容量的电解电容在VBUS上有时候对环路阻尼改善很大。5.3 充不进电、充电电流异常偏小充电方向的故障排查和放电方向不太一样。如果插上适配器完全没反应先确认适配器的PD能力是不是被成功读取。有些适配器只支持QC或BC1.2这时候就要靠D/D-检测触发QC快充否则只能5V慢充。这个方案里FUSB302只管CCD/D-要单独接MCU用ADC采样电压并做BC1.2检测这是我后期才补上的功能一开始老设备充电慢就是这个问题。充电电流偏小常见原因是电池电压和充电电压差值太小升降压控制器在Buck-Boost过渡区来回切换效率下降导致充电功率上不去。这种情况下试着提高输入电压请求比如适配器支持20V就请求20V让电池侧始终工作在Buck模式效率会明显提升。但要注意请求电压越高电荷泵、线缆、接口的损耗也会增加20V/3A和15V/4A哪个综合效率高要在整机上实测才知道。最后还有一个我反复栽过的坑电池保护IC在充电状态下检测到单节过压会把充电通路整个断掉但MCU这边还在看着电量百分比只有97%于是进入“充一会断一下”的循环。这种问题最容易误判成适配器兼容性故障实际上用上位机读每节电芯电压一看就知道是某一节满了需要做均衡才能继续充。我的教训是带四串电池的项目均衡功能一定不能省而且要在充电后期主动触发不能等保护IC切断通路再处理。5.4 调试中的高频踩坑点速查我把几个高频问题整理成一个速查表方便大家现场对照排查现象可能原因快速排查方法插设备无任何反应CC切换时序异常、Rp没拉上示波器量CC电压只能协商5VSource Capabilities配置错误、e-marker超时抓PD日志查固件协商成功但拉载保护过流点太近、电池低位查限流寄存器测电池电压满载电压跌落大电感饱和、反馈采样走线压降看SW波形改远端采样纹波大且高频噪声明显输出电容不足、MLCC降容并联电解电容试验充电频繁中断某节电芯过压、均衡未开启读AFE每节电压回充时适配器打嗝充电电流请求过大、软启动没做好降低充电电流查VBUS开关这些排查方法大部分不需要高端仪器示波器加串口日志基本就能覆盖。真正耗时间的反而是那些看起来“玄学”的问题比如某根线缆插上能协商但不能满载换根线又好了。这类问题最后几乎都指向VBUS接触电阻或者CC线缆质量属于结构件和线材公差范畴原理图里看不出毛病只能靠批量验证来控。6. 给同样在调PD移动电源的你说几句这篇写下来其实是想把一百瓦级USB Type-C PD移动电源参考设计的完整链路串一遍。从选型上看控制器决定了功率级的骨架协议芯片决定了协商能力而真正区分一个方案能不能量产的往往是CC检测可靠性、功率级参数计算和电池安全设计这些不起眼的细节。我个人在调试中的体会是PD协议本身并不难难的是它和功率级的配合时序。你可以在逻辑分析仪上把每个PD包都解析得很漂亮但只要升降压控制器的配置慢了几十毫秒实际设备就是会重启。所以建议大家在固件架构上把“协议事件”和“功率配置”解耦收到Request后不要立刻改寄存器先做一次功率级的软启动序列确认输出稳定再回PS_RDY这个习惯能帮你省下大量兼容性测试时间。最后再分享一个小技巧在量产阶段给固件留一个串口调试命令能随时查询当前PD状态、电池电压、目标档位和实际输出功率。很多兼容性故障在实验室里重现不出来只有用户拿到手才出问题。有了这个调试口驻场工程师连上串口几秒钟就能定位是协商问题还是功率路径问题比对着万用表盲猜高效得多。这也是我觉得做电源产品最有意思的地方——理论计算和实际调试永远在互相纠正而最终能被市场接受的方案一定是那些在细节上经得起折腾的方案。