DCDC用PWM动态调压全解析:从反馈原理到调试避坑
最近在很多电源群里都看到有人在问“DCDC用PWM动态调压”的问题而且问法通常都带点气“我搭了个DCDC想用单片机PWM改输出电压按网上的图接了怎么就是不对”这问题其实很有意思表面看是“PWM控制DCDC”实际牵扯到反馈环路、滤波参数、地线布局和动态响应一步没踩对就翻车。这篇文章我按自己调过的板子把DCDC用PWM动态调压的原理、接线、计算和调试经验全部理一遍尽量说成人话让想复现的工程师少走弯路。这篇文章比较适合手里有Buck或者Boost电路、想用MCU去实时调整输出电压的硬件工程师也适合研究DCDC反馈环路的学生。看完你会明白DCDC的FB引脚到底能不能“硬接”PWM、为什么一定要滤波、占空比和输出电压之间的换算关系怎么来以及实际板子上最容易出现的那几个坑是怎么被填上的。1. 先别急着接PWMDCDC的反馈环路到底怎么工作1.1 输出电压的“锚点”是FB引脚和内部基准几乎所有带FB引脚的DCDC芯片内部结构都大同小异输出电压通过上分压电阻R1、下分压电阻R2分压反馈到FB引脚FB引脚接着芯片内部的误差放大器反相端同相端接一个精密基准电压VREF。误差放大器会根据FB电压和VREF的差去调节开关占空比让FB电压无限接近VREF。所以稳态时有一个非常常用的公式Vout VREF × (1 R1 / R2)很多刚接触电源的朋友一开始会以为“调DCDC就是调占空比”这句话对PWM控制芯片的开关动作没错但DCDC芯片内部已经把环路做成了自调节系统。你真正需要做的不是去直接拨动开关管而是让FB节点看到的电压比原来抬高或降低一点。FB节点是整个环路的“锚点”改变反应在这个节点上的电流或者电压输出自然跟着变。我见过不少人把DCDC内部的PWM调制和外部的PWM控制混在一起结果调半天都在纠结频率。内部PWM是开关管的高频开关动作几十kHz到几MHz这是“执行机构”外部PWM是你用来改变FB节点电位或注入电流的低频控制信号通常几百Hz到几十kHz这是“给目标值的旋钮”。两者不是一个层面搞清楚这个概念后面才不会被绕晕。1.2 常见的三种动态调压手段为什么PWM最常用先说结论动态调压的本质是“改反馈网络”不是“改芯片内部基准”。工程上常见的改法有三种。第一种是切换分压电阻用模拟开关或者GPIO控制MOS管去并接不同的电阻这样输出电压只能是几档固定电压。优点是简单可靠、没有纹波缺点是档位少没法连续调而且切换瞬间如果控制不好很容易让FB引脚悬空。第二种是用DAC输出一个直流电压注入到FB节点配合电阻网络实现连续调压。精度高、响应快但需要MCU自带DAC或者外挂一个DAC芯片成本明显上升尤其在多路输出电压的板子上很不划算。第三种就是今天要讲的PWM经RC低通滤波后得到近似直流电平再通过电阻接到FB节点。这种方案的好处是MCU几乎都有PWM外设分辨率理论上可以做到很高成本就两个电阻加一个电容而且调压范围可以通过电阻灵活设置。缺点是RC滤波有时间常数动态响应相对慢一点但只要参数选对绝大多数动态调压场景完全够用。我自己的经验是如果只是两档三档电压切换直接用模拟开关切电阻更省心如果要做连续调节、闭环控制或者温控曲线PWM注入是性价比最高的方案。2. 外部PWM如何“骗过”DCDC的反馈核心是电流叠加2.1 从FB节点的基尔霍夫方程说清楚PWM滤波后得到的直流电压不能拿着就往DCDC的FB引脚上怼。FB引脚是误差放大器的高阻输入端正常工作情况下FB电压被环路钳在VREF附近。想用外部PWM控制它本质上是往这个节点灌或者拉一个额外的电流打破原来的分压平衡环路为了维持FBVREF只能调整Vout去抵消这个电流。所以正确的做法是PWM滤波后的电压Vpwm通过一只隔离电阻R3接到FB节点。看下面的等效关系。设R1是Vout到FB的上分压电阻R2是FB到地的下分压电阻R3是Vpwm到FB的注入电阻。稳定时FB≈VREF节点电流满足(Vout - VREF) / R1 VREF / R2 (VREF - Vpwm) / R3整理一下就是Vout VREF × (1 R1 / R2) R1 × (VREF - Vpwm) / R3这个公式是整个PWM动态调压的基石。第一项就是原来固定分压时的输出电压第二项是PWM注入带来的偏移量。注意看符号当Vpwm大于VREF时第二项为负Vout会下降当Vpwm小于VREF时第二项为正Vout会上升。也就是说占空比越大、Vpwm越高输出电压反而越低方向是反的。很多第一次搭电路的人在这里容易懵软件里做个取反逻辑就好。用具体数字走一遍。假设VREF0.8VR1100kΩR220kΩR3200kΩPWM滤波后的Vpwm范围0~3.3V。基础电压是0.8 × (1 100/20) 4.8V。偏移量等于100k/200k × (0.8 - Vpwm) 0.5 × (0.8 - Vpwm)。当Vpwm3.3V时Vout 4.8 0.5 × (-2.5) 3.55V当Vpwm0V时Vout 4.8 0.5 × 0.8 5.2V。所以这个参数下动态调压范围大约就是3.55V到5.2V方向也确实反着来。如果你需要更大的调压范围可以把R3减小让注入电流更强。但R3不能取得太小因为FB引脚能承受的灌入拉出电流有限数据手册上通常会给出一个范围一般就几个微安到几十微安。R3取几十kΩ到几百kΩ都比较安全太小的R3可能把FB拉出正常线性工作区导致DCDC直接保护或者振荡。2.2 RC低通滤波器不只是“去纹波”这么简单PWM输出是方波不能直接接到FB因为方波的瞬间跳变会强烈干扰内部环路。需要通过RC低通滤波把它变成一个平滑的直流电平。RC频率的选择会直接影响两件事一是PWM纹波能不能被滤干净二是动态调压的响应速度。举个例子。假设PWM频率20kHz用R10kΩ、C100nF算一下截止频率f 1 / (2πRC) ≈ 159Hz。20kHz相对于159Hz大约高出两个十倍频程还多一点一阶RC在这个频率的衰减大概能到42dB左右算下来残留在Vpwm上的PWM纹波大约有几十mV。这个值对于FB节点来说其实还是偏大因为FB网络对电压非常敏感这些纹波经过注入电阻进一步耦合到输出可能让Vout出现肉眼可见的毛刺。比较保险的做法是把滤波电容加大到1uF截止频率降到16Hz左右纹波能抑制到2mV级别代价是响应时间变到十毫秒量级。所以RC参数本质上是一个折中想快滤波就浅纹波大想干净滤波就深响应慢。动态调压要求不高的时候用一阶RC就好对纹波敏感的应用可以再加一级RC或者用运放做有源滤波。千万不要在RC后面直接跟着长走线连接到FB中间最好靠近FB引脚放一只1nF左右的去耦电容能滤掉高频噪声。2.3 不同DCDC芯片的FB结构决定了你能不能直接注入不是所有DCDC芯片的FB引脚都能外接注入电流。大部分Buck芯片的FB是高阻输入的误差放大器反相端可以这么操作但有的芯片在FB引脚内部做了嵌位二极管或者FB脚是直接连比较器注入电流方向不对就会触发保护或者导致工作异常。我之前在MP2307这类常用降压芯片上做过实验直接在FB上接一个PWM滤波电压如果不串限流电阻DCDC会出现间歇振荡输出电压忽高忽低。查看数据手册之后发现FB引脚内部有某种ESD保护网络正常时漏电流很小但外部强行灌入大电流就会把保护网络激活。解决办法是串一个限流电阻R3并且在FB到GND之间加一个1nF电容把高频分量导走。如果是反激式电源这类隔离拓扑反馈回路通常走TL431加光耦动态调压的思路类似把PWM滤波后的电压通过电阻接到TL431的REF端改变REF端的注入电流TL431会调整光耦电流从而改变DCDC的占空比。本质上还是在反馈节点“灌电流”或者“拉电流”但光耦的电流传输比随温度变化较大标定工作量会大一些。3. 实操从STM32输出PWM到DCDC动态调压的完整步骤3.1 硬件连接参考PWM生成和注入网络我们以STM32F103的TIM3为例生成一个20kHz的PWM信号PWM高电平3.3V输出经过RC低通滤波后接注入电阻R3再接入DCDC的FB节点。TIM3工作在PWM模式1计数时钟用72MHz。如果设置预分频器PSC71那么计数器频率就是1MHz再设置自动重装载值ARR49PWM频率就是1MHz/(491)20kHz。CCR寄存器控制占空比比如CCR25就是50%占空比。这个配置的占空比分辨率是1/50也就是2%。如果你要调出比较平滑的输出电压曲线50个档位通常不够因为每一档对应的Vout变化可能就有几十mV。想要更高分辨率可以把PWM频率降到4kHz计数周期变成250个分辨率提高到0.4%但RC滤波的截止频率也必须同步降低动态响应会慢很多。如果你希望既保持20kHz又想获得高分辨率可以考虑使用高级定时器或者带高分辨率PWM功能的MCU也可以用PWMDMA方式连续更新CCR不过那是另一个话题。电阻选型建议这样R1100kΩR220kΩR3200kΩRC滤波R10kΩC1uF。R1、R2、R3用1%精度比较好RC滤波电容建议用C0G或NP0材质避免X7R电容偏压后容量打折。整套电路的地要特别注意RC滤波器的地尽量靠近DCDC的模拟地不要直接接到功率电感下面的地铜皮上否则PWM纹波会从地线串到FB节点。3.2 占空比和输出电压的标定方法理论上我们可以用之前的公式反推占空比。Vpwm V_PWM_HIGH × D代入公式Vout A - B × D其中A VREF × (1 R1/R2) VREF × R1/R3B V_PWM_HIGH × R1/R3。以R1100kΩ、R220kΩ、R3200kΩ、V_PWM_HIGH3.3V、VREF0.8V为例A0.8×6 0.8×0.55.2VB3.3×0.51.65V。所以Vout 5.2 - 1.65D。D从0到1变化Vout大约从5.2V降到3.55V。但真实电路里电阻有误差、PWM高电平不是理想3.3V、RC滤波有残余纹波所以理论公式只能用来估算范围和方向。我通常的做法是先把PWM设置为几个固定占空比比如10%、30%、50%、70%、90%用万用表测Vout记录成一张表。再根据表做线性插值反推出目标电压对应的D值。如果后续要做闭环就更不需要精确拟合了用ADC把Vout采回来PID去调D让输出自动收敛到目标电压这样电阻漂移、温漂都能被补偿掉。3.3 动态切换电压时软件上不能直接“猛拧”如果你把CCR直接从10跳到200相当于给Vout一个很大的阶跃DCDC会瞬间调整占空比来响应很容易出现电压过冲、电感啸叫甚至触发过压保护。解决方法是软件斜坡每过1ms到5ms把目标CCR值往设定值方向调整一小步让Vout沿着一条平滑的斜坡走过去。这和电源启动时的软启动是一个道理。更稳妥的闭环控制是MCU通过ADC采样Vout和设定电压比较后计算出需要的目标D再用斜坡输出限制步长。这时候DCDC芯片内部环路是“内环”MCU控制的目标电压相当于“外环”。外环的带宽必须远低于内环否则两个环路会互相打架。比如DCDC内部环路带宽几十kHz你的PID调节周期放到1ms到10ms就应该注意1ms对应1kHz仍然要小心最好不要超过内环带宽的1/10实际我一般把外环周期做到5ms到20ms从调试结果看稳得多。3.4 进阶技巧限幅、去耦和地平面处理不管开环还是闭环D都在软件里做上下限钳位。否则当D非常接近0时Vout可能冲到高于安全电压损坏负载当D接近100%时Vout可能降到很低的电平导致DCDC进入断续模式电感电流不连续输出纹波变大。钳位值的设定依据就是第3.2节标定表的有效范围不要全范围放行。FB节点的去耦很关键。很多人以为RC后面已经“很干净”了直接把线拉回FB结果一整块PCB的噪声都耦合上去。更好的做法是RC滤波电路靠近DCDC芯片注入电阻R3尽量靠近FB引脚R3的FB端再并联一个1nF的低寄生电感电容到模拟地。如果板子上有多个地网络模拟地AGND和功率地PGND之间用0R电阻单点连接连接点选在输出电容的GND端这个细节对输出电压稳定性的帮助非常大我调过大大小小的电源不少纹波问题最后都发现是地线处理出了问题。4. 常见问题与调试实录4.1 现象输出有周期性“毛刺”示波器看到低频抖动先说结论多半不是PWM滤波不好而是PWM频率和DCDC开关频率产生了差拍。DCDC内部开关频率如果是400kHz外部PWM用20kHz两者在PCB上通过地线或电感辐射相互耦合就会产生某个较低频的拍频表现出来就是输出上有周期性包络。排查方法是用示波器做FFT看看毛刺频率是多大。对策有三个方向第一重新选择外部PWM频率避开DCDC开关频率的整数倍或接近的谐波第二把RC滤波的时间常数加大让Vpwm更加平滑第三检查PWM走线是否和FB走线平行太长距离如果是把两者拉开用GND屏蔽。4.2 现象动态切换电压时出现明显过冲和振铃这个问题我在早期做TEC温控供电时遇到过。电压从4.2V切到3.6V示波器上能看到Vout先掉到3V再反弹回3.6V来回振几下。第一个排查点是RC时间常数如果RC太大Vpwm对新占空比的响应慢DCDC输出就会“追过头”如果RC太小又会有纹波。我用的是10kΩ1uF切换过程大概几十毫秒振铃没有但速度不够快后来在允许范围内把R降到4.7kΩ响应快了振铃也没回来。第二个排查点是DCDC的环路补偿。如果你的芯片有COMP脚可以调整反馈补偿电容稍微增大零点电容能改善动态响应。不过这个操作牵一发动全身不建议没经验的人乱调优先在软件斜坡上做调整比如每步只改变1%的占空比间隔2ms效果立竿见影。4.3 现象拉载之后输出电压明显跌落调节能力变差一般不是DCDC芯片本身带载能力不够而是注入网络改变了FB节点的等效阻抗导致DCDC反馈环路的增益被削弱。比如R3取得太小它等于在FB和Vpwm之间并联了一个几百kΩ的电阻改变了分压网络的比例也会降低环路增益于是动态响应变差、负载调整率恶化。排查办法很简单先断开PWM注入网络用固定电阻分压看同样负载下Vout是否恢复。如果恢复说明R3影响了反馈网络。对策是增大R3或者在注入端加一个单位增益缓冲器把RC滤波后的电压通过运放缓冲后再接R3这样注入网络对FB的影响可以控制得更干净。4.4 现象MCU上电瞬间DCDC输出异常甚至打嗝这是启动顺序问题。MCU没初始化之前PWM引脚可能是高阻态或者被拉低如果是输出低电平相当于Vpwm0根据前面公式Vout会冲到高电压轻则过压保护重则损坏负载。解决方法是在PWM输出到RC滤波之间串一个几十kΩ的电阻并把RC滤波电容换成两个电容一个从PWM源端到地保证MCU未驱动时Vpwm被放低或者用串联电阻加上拉电阻让默认Vpwm处于安全电平。更保险的做法是用一个数字电位器或者模拟开关等MCU初始化完成后再把PWM接入注入网络不过会增加一点成本。4.5 常见问题速查表现象可能原因排查方向对策输出有周期性毛刺PWM频率和开关频率差拍示波器FFT看抖动频率换PWM频率加大滤波电压切换过冲、振铃RC响应和环路补偿不匹配测Vout切换波形软件斜坡调整RC带载电压跌落注入电阻改变反馈阻抗断开注入网络对比增大R3或加运放缓冲上电瞬间电压异常MCU启动阶段PWM状态未知测MCU启动时PWM脚电平加默认电平钳位电阻PWM调压范围不对分压电阻或注入电阻算错按公式核算并标定重新选阻值标定D纹波偏大RC截止频率偏高或地线干扰用示波器测Vpwm纹波增大C处理AGND/PGND4.6 高低温下的电压漂移问题如果PWM的高电平来源于MCU的数字电源而这个电源本身是LDO或者另一个DCDC温度变化时MCU供电变化Vpwm的高电平也会跟着变化最终Vout就会漂。对精度要求高的场景建议用DAC代替PWM或者在RC滤波后加一个精密稳压二极管钳位把Vpwm的幅度稳定住但这个做法会占用调压范围。另一个方案是用精密基准源给PWM的输出供电让Vpwm的高电平始终被钳在比如3.0V温度漂移就会小很多。当然最好的方案是用外部DAC芯片加精密基准这是成本和精度的折中没有绝对的好坏。我在实际调板子时的体会是PWM动态调压这套方案最核心的不是把公式背得多熟而是先搞明白FB节点的电流关系再处理好滤波和地线。公式只能帮你估算初始电阻真正稳定可靠地工作离不开示波器下的反复观察和标定。只要方向对参数多试几次总能稳定。希望这篇分享能帮你少走几步弯路尤其是别在地线和注入电阻上翻车。