峰值电流模式CCM BUCK变换器传递函数推导与环路补偿设计 1. 峰值电流模式CCM BUCK传递函数推导的完整思路拆解1.1 为什么峰值电流模式在工程中如此受宠搞电源的人都知道BUCK变换器的控制方式大致分两大流派电压模式和电流模式。电压模式是早期最直观的做法采样输出电压跟基准比较误差放大器输出一个控制电压直接去跟锯齿波比较生成PWM。逻辑简单但问题也很明显——环路里有两个极点补偿网络设计起来头疼而且对输入电压变化的响应慢音频衰减也一般。峰值电流模式则是在电压环的基础上加了一层“内环”电感电流的峰值被直接采样跟电压外环输出的控制信号比较逐周期决定开关管什么时候关断。这一下子就把电感这个储能元件从二阶系统里“藏”了起来功率级从二阶变成近似一阶补偿网络好设计得多。更关键的是逐周期限流天然存在短路或者过载时电感电流不会失控可靠性直接上一个台阶。我刚开始接触电源设计的时候觉得峰值电流模式无非就是多了一个采样电阻能有多复杂后来真正去推传递函数才发现这里面的门道比想象中深得多。尤其是当占空比超过0.5时如果不加斜坡补偿次谐波振荡会让你怀疑人生。而传递函数推导恰恰是理解这些现象、设计稳定环路的理论基础。1.2 CCM模式下传递函数推导的核心难点在哪CCM也就是连续导通模式电感电流在整个开关周期内都不归零。这是中大功率BUCK最常见的工况效率高、电流纹波小、EMI相对可控。但CCM下的峰值电流模式传递函数推导难点集中在几个地方。第一个难点是采样与保持效应。电感电流的峰值是在开关管导通期间逐渐上升的控制器在每个周期固定时刻采样。这个采样动作在频域上引入了额外的极点通常位于开关频率的一半附近。很多初学者推传递函数时直接忽略这个极点结果仿真跟实测对不上相位裕度差了一大截。第二个难点是斜坡补偿的引入。当占空比D大于0.5时电感电流的扰动会在周期之间被放大形成次谐波振荡。斜坡补偿的本质是在电流采样信号上叠加一个固定斜率的锯齿波等效于降低了电流环的增益。这个补偿量会直接改变传递函数的直流增益和极点位置推导时必须把它作为一个独立参数纳入。第三个难点是外环与内环的耦合。峰值电流模式的控制框图里电压外环的输出不是直接控制占空比而是控制电感电流的峰值。这意味着占空比d跟控制电压vc之间的关系不再是简单的1/Vm而是跟电感电流斜率、采样电阻、斜坡补偿斜率都有关系。这个关系式是整个推导的基石搞错了后面全错。1.3 推导前的模型假设与简化条件在动手推公式之前必须先把假设条件列清楚。这不是为了偷懒而是为了让推导结果有明确的适用范围。小信号假设所有变量都在稳态工作点附近做微小扰动二阶及以上的高阶项直接忽略。这是所有开关变换器小信号建模的前提不满足这个条件线性化的传递函数就没有意义。开关频率远高于环路带宽通常环路穿越频率取开关频率的1/10到1/5这样可以把开关纹波跟低频包络分开处理。如果穿越频率逼近开关频率采样效应和边带效应会变得非常显著平均模型失效。电感电流纹波足够小虽然CCM下电流不归零但纹波幅值相对于直流分量要小这样才能用平均电流代替瞬时电流做线性化。所有器件理想开关管导通电阻为零二极管正向压降为零电容ESR暂不考虑。这些非理想因素后续可以单独加进来修正但第一遍推导必须先把核心骨架搭清楚。斜坡补偿为线性锯齿波实际电路中斜坡补偿可能来自振荡器或者专门的斜率发生器这里假设它是一个斜率恒定的电压信号。把这些假设写清楚后面每一步推导才有据可依。我见过不少人推传递函数时东拼西凑公式倒是写了一大堆但问他假设条件是什么支支吾吾说不出来。这种推导仿真一跑就露馅。1.4 整体推导路线的选择与对比峰值电流模式BUCK的小信号传递函数推导主流路线有三条。第一条是状态空间平均法。把开关管导通和关断两个状态分别列状态方程然后按占空比加权平均再加小信号扰动。这条路数学上最严谨但计算量大而且峰值电流模式的内环采样效应不容易直接体现。第二条是PWM开关模型法。把开关管和二极管打包成一个三端开关网络用受控源等效。这种方法物理意义清晰适合手推但对峰值电流模式的电流环建模需要额外处理。第三条是电流环等效受控源法也是工程上最常用的。核心思路是把峰值电流模式的内环等效成一个受控电流源其值由控制电压和电感电流斜率共同决定。然后把这个受控源代入BUCK功率级推导控制到输出的传递函数。这条路线计算量适中物理意义明确而且斜坡补偿的影响可以直接体现在受控源的增益里。我个人的习惯是走第三条路线因为它跟实际电路对应得最好。你推出来的每一个中间变量都能在示波器上找到对应的波形。下面就以这条路线为主线把整个推导过程拆开来讲。2. 核心细节解析与实操要点2.1 峰值电流模式的内环建模从波形到公式先看一个开关周期内电感电流的波形。开关管导通时电感两端电压是Vin-Vout电流以斜率m1上升开关管关断时电感两端电压是-Vout电流以斜率m2下降。峰值电流模式控制器在每个周期开始时让开关管导通当采样到的电流信号达到控制电压vc对应的阈值时开关管关断。这里的关键参数有三个m1 (Vin - Vout) / L导通期间电感电流上升斜率m2 Vout / L关断期间电感电流下降斜率mc斜坡补偿的等效斜率折算到电流采样信号上控制电压vc跟电感电流峰值ipk之间的关系可以写成ipk vc / Ri - mc * D * Ts / (2 * Ri)其中Ri是电流采样增益Ts是开关周期D是占空比。这个式子的物理意义是控制电压对应的阈值减去斜坡补偿在导通期间累积的等效电流才是真正的电感电流峰值。然后考虑电感电流的平均值iL跟峰值ipk的关系。在CCM下电感电流在一个周期内的平均值等于峰值减去上升纹波的一半iL ipk - m1 * D * Ts / 2把上面两个式子联立消去ipk得到平均电感电流跟控制电压的关系iL vc / Ri - mc * D * Ts / (2 * Ri) - m1 * D * Ts / 2这个式子就是内环的静态关系。接下来做小信号扰动让vc、D、iL都带上小信号分量忽略二阶项得到iL_hat vc_hat / Ri - D * Ts / (2 * Ri) * mc_hat - (mc * Ts / (2 * Ri) m1 * Ts / 2) * D_hat - D * Ts / 2 * m1_hat注意m1本身跟Vin和Vout有关所以m1_hat也会引入输入电压和输出电压的扰动。这一步是很多人容易漏掉的地方如果只考虑vc和D的扰动推出来的传递函数会丢掉输入电压前馈的那部分影响。2.2 斜坡补偿量的计算与选择原则斜坡补偿斜率mc的选择直接决定了系统的稳定性和动态响应。工程上有一个经验公式mc m2 / 2也就是说斜坡补偿的等效斜率至少要大于关断期间电感电流下降斜率的一半。这个条件的由来可以从次谐波振荡的收敛性分析得到。当D小于0.5时m2本身比较小不加补偿也能稳定当D大于0.5时m2变大如果不加补偿扰动会在周期之间不断放大。具体到电路参数假设Vin12VVout5VL10uHTs10us开关频率100kHz那么m1 (12 - 5) / 10u 0.7 A/usm2 5 / 10u 0.5 A/usmc 0.25 A/us折算到电压域如果采样电阻Ri0.1V/A那么斜坡补偿电压斜率至少是0.025 V/us。实际电路中斜坡补偿通常由振荡器产生的锯齿波经过电阻分压得到设计时要留一定裕量一般取mc (0.5到1) * m2。注意斜坡补偿加得太多电流环增益下降系统响应变慢严重时甚至退化成电压模式。加得太少次谐波振荡压不住。我一般先在仿真里扫一遍mc的值看相位裕度和超调量的折中点再在实测中微调。2.3 功率级小信号模型的建立把内环等效成一个受控电流源之后BUCK功率级就变成了一个电流源给输出电容和负载供电的电路。输出电容Cout和负载电阻Rload并联电感在电流源模型里被“吸收”进了内环不再作为独立储能元件出现。输出端的小信号方程很简单vout_hat iL_hat * (Rload || (1 / (s * Cout)))展开就是vout_hat iL_hat * Rload / (1 s * Rload * Cout)这里出现了一个极点频率是1 / (2 * pi * Rload * Cout)。这个极点是输出电容和负载共同决定的跟电压模式下的主极点位置一样。区别在于电压模式下还有一个由电感引起的双极点而峰值电流模式下电感被内环“藏”起来了所以功率级只剩一个极点。但这并不意味着峰值电流模式的传递函数就简单了。前面提到的采样保持效应会在高频段引入一个额外的极点通常位于开关频率的一半。这个极点的存在限制了环路带宽的上限。如果穿越频率设计得离开关频率太近这个极点带来的相位滞后会让系统变得不稳定。2.4 采样保持效应的等效处理采样保持效应的建模工程上有两种常用方法。一种是离散时间建模把整个控制环路放在z域里分析考虑每个开关周期的采样动作。这种方法最精确但推导复杂而且结果不容易跟连续域的补偿网络设计对应。另一种是连续域近似用一个等效的极点来模拟采样保持的相位滞后。这个等效极点的频率通常取fp_sample fs / 2其中fs是开关频率。更精确一点的近似是fp_sample fs / (pi * (D 0.5))这个式子的意思是采样极点频率跟占空比有关。D越大极点频率越低相位滞后越严重。这也是为什么高占空比应用下峰值电流模式的带宽要压得更低。我在实际项目中习惯用第二种方法因为补偿网络还是在连续域里设计用等效极点修正一下相位裕度就够了。如果对精度要求特别高比如服务器电源或者通信电源那就得上离散域建模用Matlab或者Python扫频验证。3. 实操过程与核心环节实现3.1 完整传递函数的逐步推导现在把前面的所有环节串起来推一遍完整的控制到输出传递函数。第一步写出内环小信号方程。忽略输入电压扰动只考虑控制电压vc和占空比D的扰动iL_hat vc_hat / Ri - (mc * Ts / (2 * Ri) m1 * Ts / 2) * D_hat第二步写出占空比跟控制电压的关系。在峰值电流模式中占空比是由电感电流达到阈值的时间决定的。考虑电感电流上升斜率m1和斜坡补偿斜率mc占空比的小信号表达式为D_hat (vc_hat / Ri - iL_hat) / ((m1 mc) * Ts)这个式子的物理意义是控制电压跟电感电流平均值的差除以电流斜率乘以周期就是占空比的调整量。第三步把D_hat代入iL_hat的表达式消去D_hat得到iL_hat跟vc_hat的直接关系。经过整理可以得到iL_hat / vc_hat 1 / (Ri * (1 (mc m1) * Ts / (2 * Ri) ...))这里省略号代表高频修正项。在低频段这个比值近似为常数就是电流环的直流增益。第四步把iL_hat代入输出端方程vout_hat iL_hat * Rload / (1 s * Rload * Cout)最终得到控制到输出的传递函数Gvc(s) (vout_hat / vc_hat) (Rload / Ri) / (1 s * Rload * Cout) * (1 / (1 s / wp_sample))其中wp_sample就是采样保持引入的等效极点。这个结果看起来很简单但每一个参数的来源都要搞清楚。Rload / Ri是直流增益由负载和采样电阻决定输出极点由负载和输出电容决定采样极点由开关频率和占空比决定。三个部分乘在一起就是完整的传递函数。3.2 关键参数的提取与计算实例拿一个实际的设计案例来算一遍。假设Vin 24VVout 12VIout 5AL 22uHCout 220uFfs 200kHzTs 5usRi 0.05V/A斜坡补偿mc 0.3 A/us先算直流工作点D Vout / Vin 0.5m1 (24 - 12) / 22u 0.545 A/usm2 12 / 22u 0.545 A/usRload Vout / Iout 12 / 5 2.4 ohm然后算传递函数的各个参数直流增益Rload / Ri 2.4 / 0.05 48换算成dB是33.6dB输出极点fp_out 1 / (2 * pi * 2.4 * 220u) 301 Hz采样极点fp_sample fs / (pi * (D 0.5)) 200k / (pi * 1.0) 63.7 kHz从这些数字可以看出输出极点在300Hz左右采样极点在60kHz以上两者之间有很大的频率间隔。这意味着在穿越频率附近主要是输出极点在贡献相位滞后采样极点的影响可以暂时忽略。但如果把穿越频率设计到20kHz以上采样极点的相位滞后就不能忽视了。3.3 仿真验证用Python扫频对比推完公式一定要用仿真验证。我习惯用Python写一个小脚本把推导出来的传递函数跟Simplis或者Simulink的开关模型扫频结果对比。import numpy as np import matplotlib.pyplot as plt # 参数 Vin 24 Vout 12 Iout 5 L 22e-6 Cout 220e-6 fs 200e3 Ts 1/fs Ri 0.05 mc 0.3e6 # A/s D Vout / Vin m1 (Vin - Vout) / L m2 Vout / L Rload Vout / Iout # 传递函数参数 Gdc Rload / Ri fp_out 1 / (2 * np.pi * Rload * Cout) fp_sample fs / (np.pi * (D 0.5)) # 频率扫描 f np.logspace(1, 6, 1000) s 1j * 2 * np.pi * f # 传递函数 G Gdc / (1 s / (2 * np.pi * fp_out)) / (1 s / (2 * np.pi * fp_sample)) # 画波特图 plt.figure() plt.subplot(2, 1, 1) plt.semilogx(f, 20 * np.log10(np.abs(G))) plt.ylabel(Gain (dB)) plt.grid(True) plt.subplot(2, 1, 2) plt.semilogx(f, np.angle(G, degTrue)) plt.ylabel(Phase (deg)) plt.xlabel(Frequency (Hz)) plt.grid(True) plt.show()跑完这个脚本你会看到幅频特性在300Hz之前是平的然后以-20dB/dec下降相频特性从0度开始在300Hz附近降到-45度在60kHz附近再降一截。这个结果跟Simplis的平均模型扫频结果基本吻合误差主要来自采样极点的近似处理。提示如果你用Simulink做扫频记得把开关频率设得足够高仿真步长要小于开关周期的1/100否则扫出来的高频段会失真。另外扫频信号幅度要小保证系统工作在小信号线性区。3.4 补偿网络的设计与参数整定有了传递函数补偿网络的设计就有据可依了。峰值电流模式BUCK的功率级在低频段是一个单极点系统所以补偿网络通常用Type II补偿器也就是一个积分器加一个零点和一个高频极点。Type II补偿器的传递函数是Gc(s) (wp0 / s) * (1 s / wz) / (1 s / wp)其中wp0是积分器的单位增益频率wz是零点频率wp是高频极点频率。设计步骤确定穿越频率fc。一般取fc fs / 10到fs / 5。对于上面的例子fs200kHz取fc20kHz。在fc处功率级的增益是Gdc / (fc / fp_out) 48 / (20k / 301) 0.72换算成dB是-2.8dB。所以补偿器在fc处需要提供2.8dB的增益。把补偿器的零点放在输出极点附近wz 2 * pi * fp_out这样在fc处相位滞后最小。高频极点放在采样极点附近或者略低wp 2 * pi * fp_sample / 2用来抑制高频噪声。根据fc处的增益要求反推wp0。算出来的补偿器参数代入环路增益T(s) Gvc(s) * Gc(s)再扫一遍波特图看相位裕度是否在45度到60度之间。如果不够微调零点和高频极点的位置。我个人的经验是相位裕度不要追求太高50度左右比较合适。太高了响应慢太低了超调大。另外实际电路中光耦或者运放的带宽也会影响补偿效果仿真时最好把这些非理想因素也加进去。4. 常见问题与排查技巧实录4.1 推导结果跟仿真对不上怎么办这是最常见的问题。辛辛苦苦推了一堆公式结果扫频一看幅频特性差了十几个dB相位也完全对不上。遇到这种情况按下面的顺序排查。第一检查直流工作点。占空比D是不是算对了电感电流平均值是不是等于负载电流如果直流工作点错了小信号模型的基础就塌了。我见过有人把D算成Vout/(VinVout)结果整个传递函数的增益都偏了。第二检查斜坡补偿的符号。斜坡补偿是加在电流采样信号上的等效于降低了控制电压的有效值。如果你在公式里把mc的符号搞反了直流增益会偏大相位也会异常。第三检查采样极点的近似。前面用的fp_sample fs / (pi * (D 0.5))只是一个近似公式。如果D接近1这个公式的误差会变大。更精确的做法是用离散域模型或者直接用仿真扫频提取采样极点。第四检查仿真设置。扫频信号的幅度是不是太大了仿真步长是不是太粗了平均模型跟开关模型的差异是不是在预期范围内这些都会影响对比结果。4.2 次谐波振荡的识别与解决次谐波振荡的表现是开关波形每隔一个周期宽、一个周期窄交替出现。在输出纹波上你会看到频率为开关频率一半的振荡分量。用示波器看电感电流波形包络明显抖动。产生的原因是当D大于0.5时电感电流的扰动在周期之间的传递函数有一个大于1的极点。具体来说扰动从第n个周期传到第n1个周期放大倍数是D / (1-D)。当D0.6时放大倍数是1.5扰动会越来越大。解决办法就是加斜坡补偿。补偿量mc要满足mc m2 * (1 - D) / (2 * D)对于D0.6m20.5A/usmc 0.5 * 0.4 / 1.2 0.167 A/us。实际取0.3 A/us留了一倍裕量。注意斜坡补偿加得太多虽然次谐波压住了但电流环的增益下降负载瞬态响应会变慢。我一般先在仿真里扫mc的值看次谐波幅度和负载超调量的折中再在实测中微调。实测时用电流探头看电感电流包络调到包络干净为止。4.3 高占空比下的带宽限制高占空比应用比如Vin5VVout4VD0.8这时候采样极点频率会降到fp_sample fs / (pi * (0.8 0.5)) fs / 4.08如果fs500kHzfp_sample只有122kHz。而输出极点可能只有几百Hz。两个极点之间的频率间隔变小相位滞后在穿越频率附近累积得更快。这时候如果还把穿越频率设在fs/1050kHz相位裕度可能只剩30度系统会振荡。解决办法有两个一是降低穿越频率比如降到fs/2025kHz二是用Type III补偿器多一个零点来抬相位。但Type III补偿器对噪声更敏感设计时要小心。我个人的经验是D超过0.7时穿越频率不要超过fs/15。如果动态响应要求高那就得考虑两相交错或者换拓扑了。4.4 常见问题速查表问题现象可能原因排查方法解决措施推导增益比仿真高斜坡补偿符号反了检查mc在公式中的符号修正符号重新推导相位裕度不足采样极点近似不准用离散域模型对比降低穿越频率或加Type III补偿次谐波振荡斜坡补偿不足示波器看电感电流包络增大mc满足mc m2*(1-D)/(2D)负载瞬态超调大带宽太低或相位裕度太小扫频看穿越频率和相位裕度提高fc或调整零点位置高频段增益异常仿真步长太粗减小仿真步长到Ts/100重新扫频直流增益偏差大直流工作点算错检查D和iL的静态值重新计算工作点4.5 从推导到实测的闭环验证推完传递函数、设计完补偿网络最后一步是实测验证。我一般会做三组测试。第一组是环路增益扫频。用频率响应分析仪注入小信号扫出实际的环路增益和相位。跟仿真结果对比如果穿越频率和相位裕度在可接受范围内说明推导和补偿设计基本正确。第二组是负载瞬态测试。用电子负载做阶跃变化看输出电压的超调量和恢复时间。如果超调量跟仿真预测的差不多说明小信号模型是准的。第三组是输入电压瞬态测试。改变输入电压看输出电压的扰动。峰值电流模式对输入电压变化有天然的前馈作用推导中如果忽略了m1的扰动这组测试就会暴露问题。实测中常见的偏差来源包括电容ESR、电感直流电阻、开关管导通电阻、采样电路的带宽限制、光耦的传输延迟。这些非理想因素在初步推导时可以忽略但在最终验证时必须考虑。如果实测跟仿真偏差超过20%就要回头检查模型里是不是漏掉了关键的非理想因素。5. 推导之外的工程经验与扩展思考5.1 数字电源中的离散化实现现在越来越多的电源用数字控制器比如DSP或者专用数字电源芯片。峰值电流模式的传递函数在数字域里实现时需要做离散化。常用的方法有零阶保持器等效、双线性变换、匹配零极点法。零阶保持器等效最简单把连续域的传递函数G(s)替换成(1 - z^-1) * Z[G(s)/s]。双线性变换精度更高但高频段的频率畸变需要预畸变处理。匹配零极点法适合手算但只适用于低阶系统。我个人的经验是如果开关频率跟采样频率一致用零阶保持器等效就够了。如果采样频率是开关频率的两倍以上双线性变换更准。离散化之后补偿器也要在z域里重新设计不能直接把连续域的补偿器离散化否则相位裕度会损失。5.2 多相交错对传递函数的影响多相交错BUCK在大电流应用里很常见。N相交错每相开关频率fs等效输出纹波频率是N*fs。从传递函数的角度看交错并不改变单相的功率级传递函数但输出电容的等效串联电阻和纹波电流会变化。真正需要注意的是采样效应。如果多相共用一套电流采样采样频率还是fs但每相的电流波形相位不同。这时候采样极点的位置会跟单相不一样需要重新推导。如果每相独立采样那传递函数跟单相基本一致只是直流增益要乘以N。我在一个48V转1V、100A的服务器电源项目里用过四相交错。实测发现交错之后输出纹波频率高了四倍输出电容可以减小但环路带宽并没有明显提升。因为采样极点还是由单相开关频率决定的交错不改变这个限制。5.3 峰值电流模式与电压模式的选型对比对比项峰值电流模式电压模式功率级阶数近似一阶二阶补偿网络Type II即可Type III常用逐周期限流天然具备需要额外电路输入前馈天然具备需要额外电路抗噪能力较弱电流采样易受干扰较强占空比范围受斜坡补偿限制宽多相均流容易实现较难选型时如果输入电压范围宽、负载变化大、需要快速动态响应峰值电流模式是首选。如果输入电压稳定、噪声环境恶劣、占空比接近极限电压模式可能更合适。当然现在很多控制器支持两种模式切换根据工况自动选择。5.4 我个人在推导中的几个习惯第一先画波形再推公式。把电感电流、控制电压、PWM信号的波形画出来标清楚每个时间点的值然后再写方程。这样不容易漏掉符号和系数。第二用数值代入验证中间步骤。每推完一步代入一组具体数值看看量纲对不对、数量级合不合理。比如直流增益算出来是48换算成dB是33.6dB这个值跟仿真对比一下如果差太多说明中间某一步错了。第三保留推导草稿。传递函数推导往往要反复修改今天觉得对了明天发现漏了一项。把每一步的假设、方程、化简过程都写清楚后面排查问题时能省很多时间。第四仿真和实测双验证。推导再漂亮仿真对不上就是白搭。仿真对了实测对不上说明模型里还有非理想因素没考虑。只有三者一致推导才算真正完成。5.5 后续可以扩展的方向这篇博文主要讲的是CCM模式下峰值电流模式BUCK的传递函数推导。实际工程中还有很多相关方向值得深入。比如DCM模式下的传递函数电感电流在每个周期结束时归零功率级的阶数跟CCM不一样传递函数的形式也不同。DCM下峰值电流模式的建模需要引入一个新的状态变量来描述电感电流归零后的谐振过程。再比如Boost和Buck-Boost拓扑的峰值电流模式传递函数推导思路跟BUCK类似但电感电流的斜率表达式不同右半平面零点的位置也不同。Boost的右半平面零点对环路稳定性影响很大补偿网络设计要特别小心。还有平均电流模式跟峰值电流模式的区别在于内环采样的是电感电流的平均值而不是峰值。平均电流模式的抗噪能力更强但动态响应稍慢。传递函数推导时内环的等效受控源模型需要调整。这些方向我后续会陆续整理出来感兴趣的朋友可以持续关注。电源设计这个领域理论推导和工程实践缺一不可。推得清楚才能设计得明白测得准确才能改得放心。