
1. 从一个让人头疼的波形说起为什么BUCK电路不能只用稳态公式算刚接触开关电源那会儿我对BUCK电路的理解停留在占空比乘以输入电压等于输出电压这个层面。算电感、算电容、选MOS管全靠这套稳态公式做出来的板子也能跑。直到有一次做一个12V转3.3V、负载电流从0.5A到8A动态跳变的项目输出电压在负载突变时直接跌了400mV恢复时间超过200微秒后级MCU直接复位。我拿着示波器盯着那个波形看了半天才意识到问题出在我从来没认真对待过BUCK电路的动态行为。稳态公式告诉你的是最终会稳定在多少伏但它不告诉你从0.5A跳到8A的那一瞬间电压会掉多少、多久能回来。要回答这些问题必须建立BUCK电路的动态模型。而动态模型分两种大信号模型和小信号模型。这两个词听起来很学术但说白了大信号模型描述的是电路在大范围扰动下的行为比如启动、短路、负载大幅跳变小信号模型描述的是电路在工作点附近微小扰动下的线性化行为比如稳态下负载小幅波动、输入电压纹波。为什么两个都要因为它们的用途完全不同。大信号模型用来分析启动过程、限流保护、大负载跳变这时候电路的非线性特征非常明显占空比可能从0直接拉到最大电感电流可能从连续模式进入断续模式。小信号模型用来设计补偿网络、分析环路稳定性、算相位裕度这时候电路在工作点附近可以近似为线性系统用传递函数就能完整描述。我踩过的最大坑就是拿小信号模型去分析启动过程或者拿大信号模型去设计PID参数。前者会得出完全错误的结论因为启动时电路根本不满足小信号假设后者会让你无从下手因为大信号模型是非线性的没有传递函数可用。这篇内容我打算把BUCK电路从大信号到小信号的完整推导链路捋一遍包括状态空间平均法的每一步怎么来的、为什么这么近似、最终传递函数怎么用。适合已经懂BUCK基本工作原理、但想深入理解动态建模的电源工程师也适合正在学电力电子建模的学生。推导过程我会尽量把每一步的物理意义讲清楚而不是堆公式。2. 大信号模型状态空间平均法的每一步到底在做什么2.1 为什么不能直接对开关电路列写状态方程BUCK电路有两个开关状态开关管导通时电感两端电压是Vin-Vout电感电流上升开关管关断时电感通过续流二极管或同步整流管续流电感两端电压是-Vout电感电流下降。每个状态都可以列写一组线性状态方程但问题是这两个状态在周期性切换整个系统是时变的。你当然可以对每个状态分别列方程然后用周期平均的方式处理。但直接平均会丢失开关纹波的信息而且平均后的方程是否还能描述系统行为需要理论支撑。状态空间平均法的核心思想就是当开关频率远高于电路的自然频率LC谐振频率时可以用一个开关周期内的平均值来近似瞬时值从而把时变系统转化为时不变系统。这个假设的物理含义是电感电流和电容电压在一个开关周期内变化很小它们主要跟随开关周期的平均值缓慢变化。换句话说开关纹波是小的平均值是大的。这就是为什么叫大信号模型——它描述的是平均值的动态行为而这个平均值可以有大范围的变动。2.2 两个开关状态的方程列写设电感电流为iL电容电压为vC等于输出电压vout负载电阻为R。开关管导通期间占空比d持续时间dTs电感电压方程L diL/dt Vin - vC电容电流方程C dvC/dt iL - vC/R开关管关断期间持续时间(1-d)Ts电感电压方程L diL/dt -vC电容电流方程C dvC/dt iL - vC/R注意这里假设了二极管导通压降为零、开关管导通电阻为零这是理想化处理。实际建模时可以把这些寄生参数加进去但推导思路完全一样。2.3 周期平均操作的具体步骤把上面两组方程分别乘以d和(1-d)然后相加得到平均方程L d⟨iL⟩/dt d·Vin - ⟨vC⟩C d⟨vC⟩/dt ⟨iL⟩ - ⟨vC⟩/R这里⟨iL⟩和⟨vC⟩表示一个开关周期内的平均值。注意d·Vin这一项导通时电感电压是Vin-vC关断时是-vC平均后就是d(Vin-vC)(1-d)(-vC) d·Vin - vC。这个结果非常直观从电感两端看输入电压被占空比斩波了等效为一个受d控制的电压源d·Vin。这就是状态空间平均法的核心结论BUCK电路的平均模型可以等效为一个变压器变比1:d加一个LC滤波器。这个等效电路在Simulink里可以直接搭出来用受控电压源实现d·Vin后面接LC和负载。2.4 大信号模型能回答什么问题有了这个平均模型你可以做几件事第一分析启动过程。假设d从0阶跃到某个值你可以解这个非线性微分方程其实对BUCK来说d固定时方程是线性的得到iL和vC的响应。如果考虑软启动d是缓慢上升的也可以分段求解。第二分析负载大范围跳变。比如负载从满载切到空载vC会上升iL会下降你可以用这个模型估算过冲量和恢复时间。注意这时候如果电感电流降到零电路进入DCM断续导通模式平均方程需要修正因为关断期间电感电流为零时vC的方程会变。第三分析输入电压大范围变化。比如输入从12V掉到8Vd需要相应调整你可以用这个模型看输出电压怎么变化。但大信号模型的局限也很明显它是非线性的因为d乘以Vind和状态变量耦合没有传递函数不能直接用经典控制理论设计补偿器。而且它只描述了平均值丢失了开关纹波信息不能用来分析纹波大小。注意状态空间平均法成立的前提是开关频率远高于LC谐振频率。一般要求开关频率至少是LC谐振频率的5到10倍。如果你的开关频率只有100kHz而LC谐振频率到了50kHz那平均模型就不准了需要考虑采样效应。3. 小信号模型在工作点附近线性化的完整推导3.1 为什么要线性化大信号模型虽然能描述大范围行为但没法用传递函数。而设计补偿网络、分析环路稳定性最方便的工具就是传递函数。线性系统有完整的频域分析理论非线性系统没有。所以我们需要在工作点附近把非线性方程线性化。具体做法是假设系统在一个稳态工作点附近受到小扰动把每个变量写成稳态值小扰动量的形式代入原方程然后忽略二阶及以上的小量。这样得到的方程就是线性的可以求传递函数。3.2 分离稳态和扰动设稳态占空比为D稳态电感电流为IL稳态电容电压为VC。加入小扰动d D d̂d̂是小扰动量iL IL îLvC VC v̂CVin Vin v̂in输入电压也可能有扰动把这些代入平均方程L d(ILîL)/dt (Dd̂)(Vinv̂in) - (VCv̂C)C d(VCv̂C)/dt (ILîL) - (VCv̂C)/R展开后把稳态项和扰动项分开。稳态项满足0 D·Vin - VC0 IL - VC/R这正好是BUCK的稳态关系VC D·VinIL VC/R。扰动项忽略d̂·v̂in这类二阶小量L dîL/dt D·v̂in d̂·Vin - v̂CC dv̂C/dt îL - v̂C/R注意d̂·Vin这一项d̂是小量Vin是稳态值乘积是一阶小量必须保留。而d̂·v̂in是两个小量相乘是二阶小量忽略。3.3 从时域方程到传递函数对扰动方程做拉普拉斯变换假设零初始条件sL·îL(s) D·v̂in(s) d̂(s)·Vin - v̂C(s)sC·v̂C(s) îL(s) - v̂C(s)/R我们的目标是求控制到输出传递函数Gvd(s) v̂C(s)/d̂(s)假设输入电压扰动为零v̂in0。从第二个方程解出îLîL (sC 1/R)·v̂C代入第一个方程sL·(sC 1/R)·v̂C d̂·Vin - v̂C整理v̂C·(s²LC sL/R 1) d̂·Vin所以Gvd(s) v̂C(s)/d̂(s) Vin / (s²LC sL/R 1)这就是BUCK电路功率级的控制到输出传递函数。写成标准形式Gvd(s) Vin / (1 s/(Q·ω0) (s/ω0)²)其中ω0 1/√(LC)是LC谐振角频率Q R·√(C/L)是品质因数。3.4 传递函数的物理意义解读这个传递函数告诉我们几个关键信息直流增益是Vin。也就是说占空比变化1%输出电压变化Vin的1%。这符合直觉占空比直接控制输入电压的接通比例。在低频段远低于ω0传递函数近似为Vin相位接近0度。这时候电感电容还没起作用输出电压跟随占空比变化。在ω0附近出现谐振峰峰值高度由Q决定。Q越大峰值越高相位变化越剧烈。Q R·√(C/L)负载越重R越小Q越小谐振峰越低。这就是为什么重载时环路更稳定轻载时容易振荡。在高于ω0的频段传递函数以-40dB/dec的斜率下降相位趋近-180度。这是因为LC滤波器是二阶的高频衰减很快。提示实际电路中电感的直流电阻DCR和电容的等效串联电阻ESR会改变传递函数。ESR会在高频段引入一个零点DCR会降低Q值。这些寄生参数在建模时最好加上否则仿真和实测可能对不上。4. 从传递函数到补偿器PID参数到底怎么算4.1 为什么BUCK功率级需要补偿看Gvd(s)的相位在低频段是0度在ω0附近快速下降到-180度。如果闭环系统在这个频段还有增益那相位裕度就不够系统会振荡。所以必须加补偿器在ω0附近提升相位保证足够的相位裕度。常用的补偿器是PID或者Type III补偿器。PID的传递函数是Gc(s) Kp Ki/s Kd·s比例项提供即时响应积分项消除稳态误差微分项提供相位超前。对BUCK来说积分项是必须的因为功率级在直流处有增益但有限要消除稳态误差需要积分器。4.2 用穿越频率和相位裕度反推参数设计补偿器的标准流程是第一步确定穿越频率fc。一般取开关频率的1/10到1/5。比如开关频率500kHzfc取50kHz到100kHz。fc越高动态响应越快但太高的fc会受开关纹波和采样效应影响。第二步计算功率级在fc处的增益和相位。把sj2πfc代入Gvd(s)算出幅值和相位。第三步确定补偿器在fc处需要提供的增益和相位。增益要使得环路总增益在fc处为10dB相位要使得总相位在fc处大于-180度加上相位裕度一般取45度到60度。第四步根据需要的增益和相位解出Kp、Ki、Kd。这个过程说起来简单但实际算的时候有几个坑。第一个坑是功率级的Q值随负载变化轻载时Q大谐振峰高相位下降快补偿器要提供更多相位。第二个坑是ESR零点它会在高频段提供相位提升设计时可以利用。第三个坑是数字控制的延迟会额外引入相位滞后必须留够裕量。4.3 一个具体的计算例子假设Vin12VVout3.3VL10μHC100μFR1Ω负载3.3A开关频率500kHz。先算ω0 1/√(10e-6 × 100e-6) 1/√(1e-9) 31623 rad/s对应频率约5kHz。Q R·√(C/L) 1 × √(100e-6/10e-6) 1 × √10 ≈ 3.16。取fc 50kHz远高于ω0。在fc处Gvd的幅值约为Vin/(ω/ω0)² 12/(50/5)² 12/100 0.12即-18.4dB。相位约为-180度因为远高于ω0。要使得环路在50kHz处0dB补偿器需要提供18.4dB的增益即约8.3倍。要使得相位裕度为45度补偿器需要提供-18045-135度即补偿器相位为45度因为功率级已经是-180度。用PID实现在fc处Kp的增益为8.3Ki/(2πfc)和Kd·2πfc要配合提供45度相位。具体解方程这里不展开但思路就是这样。注意这个例子忽略了ESR零点和数字延迟。实际设计时ESR零点一般在几十kHz到几百kHz会提供相位提升可以降低对补偿器的要求。数字延迟一般是一个开关周期在500kHz时是2μs对应50kHz处约36度相位滞后必须从相位裕度里扣掉。5. 仿真验证Simulink和LTspice里怎么搭模型5.1 Simulink里搭平均模型Simulink里搭BUCK平均模型非常直接。用受控电压源实现d·Vin后面接电感、电容、负载。d用PWM发生器或者直接给阶跃信号。要观察传递函数可以用Simulink的Linear Analysis工具在稳态工作点附近做小信号线性化直接得到Gvd(s)的波特图。具体步骤先让模型跑到稳态d固定为D3.3/120.275然后用Linear Analysis的Trim功能找到工作点再用Bode功能画波特图。这样得到的波特图应该和理论推导的Gvd(s)一致。如果想直接看传递函数可以用Simulink的Transfer Function模块把推导出的Gvd(s)填进去和平均模型对比。两者在低频段应该完全重合在高频段接近开关频率会有差异因为平均模型不包含开关纹波。5.2 LTspice里搭开关模型LTspice里搭的是开关级模型用真实的MOS管和二极管或者用理想开关。这样可以看到开关纹波也可以做环路分析。LTspice的环路分析需要用AC扫描在反馈环路里注入小信号测量环路增益。具体做法在反馈分压电阻中间注入AC信号用.LOOP命令或者手动计算。LTspice的AC分析是在工作点附近线性化的所以得到的就是小信号特性。注意LTspice的AC分析需要电路先跑到稳态可以用.tran跑一段时间然后用.ic设置初始条件再跑.ac。5.3 仿真和实测对不上的常见原因第一个原因寄生参数没加。电感的DCR、电容的ESR、MOS管的导通电阻、二极管的压降这些都会影响传递函数。特别是ESR零点如果不加高频段相位会对不上。第二个原因工作点不对。小信号模型是在特定工作点线性化的如果仿真时负载和理论计算时的负载不一样Q值就不一样谐振峰也不一样。第三个原因数字延迟没考虑。如果是数字控制ADC采样、计算、PWM更新都有延迟这些在模拟仿真里没有会导致相位裕度比仿真值低。第四个原因平均模型和开关模型的差异。平均模型在开关频率附近不准如果穿越频率接近开关频率的1/5差异会很明显。6. 数字电源里的离散化从s域到z域的关键细节6.1 为什么数字电源必须离散化模拟补偿器用运放和RC网络实现传递函数是连续的。数字补偿器用MCU或DSP实现处理的是离散采样点传递函数是z域的。所以必须把s域的补偿器转换成z域这个过程叫离散化。离散化的方法有很多前向欧拉、后向欧拉、双线性变换Tustin、零极点匹配等。不同方法得到的z域传递函数不同对系统性能的影响也不同。6.2 双线性变换的推导和特点双线性变换是最常用的方法因为它把s平面的虚轴映射到z平面的单位圆上频率对应关系是s (2/T)·(z-1)/(z1)其中T是采样周期。这个变换的优点是频率畸变小缺点是高频段有频率 warping。对于BUCK补偿器穿越频率一般远低于采样频率warping影响不大。具体操作把Gc(s)里的s用(2/T)·(z-1)/(z1)替换整理成z的有理分式然后写成差分方程就可以在MCU里实现了。6.3 数字延迟的处理数字控制有一个固有的延迟从ADC采样到PWM更新至少有一个采样周期的延迟。这个延迟在s域里是e^(-sT)在z域里是z^(-1)。设计补偿器时必须把这个延迟考虑进去否则实际相位裕度会比设计值低。处理方法在环路模型里串一个z^(-1)然后重新设计补偿器。或者在设计模拟补偿器时把相位裕度目标提高预留出延迟的相位损失。提示数字电源的采样频率一般等于开关频率所以延迟就是一个开关周期。如果开关频率500kHz延迟2μs在50kHz处相位滞后36度。这个数字很可观设计时必须扣掉。7. 几个容易搞混的概念和我的实操心得7.1 大信号和小信号的边界在哪里很多人问负载跳变多大算大信号多大算小信号其实没有严格界限。一般来说如果扰动导致占空比变化超过10%或者电感电流变化超过20%非线性效应就明显了小信号模型开始不准。但具体要看应用对精度要求高的场合5%的扰动就可能需要大信号分析。我的经验是设计补偿器时用小信号模型验证动态响应时用大信号模型。两者结合才能既保证稳定性又保证动态性能。7.2 为什么理论计算和实测总是有差距理论计算用的是理想模型实测有寄生参数、有噪声、有延迟。差距主要来自几个方面电感的非线性饱和、电容的直流偏压效应容量下降、MOS管的开关时间、驱动电路的延迟。这些因素在建模时很难全部考虑所以实测和理论有10%到20%的差距是正常的。我的做法是理论计算确定大致参数仿真验证趋势实测微调。不要指望一次算准迭代两三次很正常。7.3 一个实用的调试技巧如果环路不稳定先看波特图。用频响分析仪或者示波器测环路增益看穿越频率和相位裕度。如果相位裕度不够先检查补偿器参数再检查延迟最后检查寄生参数。很多时候问题出在延迟上特别是数字电源。另一个技巧在Simulink里搭一个和实际电路参数一致的模型把实测的波形和仿真对比。如果对不上说明模型有问题先修模型再调电路。这样比盲目试参数高效得多。7.4 元件选型对模型的影响电感的选型直接影响Q值和谐振频率。电感越大ω0越低但DCR也越大Q值越低。电容的ESR影响高频零点位置ESR越小零点越高对相位提升越少。MOS管的导通电阻影响效率也影响阻尼。我的选型原则是先根据纹波要求选电感再根据动态响应要求选电容最后根据效率和热设计选MOS管。选完之后把寄生参数代入模型重新验证环路稳定性。如果稳定性不够再调整补偿器参数。8. 把模型用起来从推导到落地的完整链路推导大信号和小信号模型最终目的是指导设计。我的完整流程是这样的第一步根据输入输出要求用稳态公式算占空比、电感、电容的初始值。第二步用状态空间平均法建立大信号模型在Simulink里搭出来验证启动过程和负载跳变响应。第三步在工作点附近线性化得到Gvd(s)画波特图确认谐振频率和Q值。第四步根据穿越频率和相位裕度要求设计补偿器得到Kp、Ki、Kd。第五步如果是数字控制把补偿器离散化考虑延迟重新验证相位裕度。第六步用LTspice搭开关模型验证开关纹波和环路稳定性。第七步打板实测用频响分析仪测环路微调补偿器参数。这个流程走下来基本能保证一次成功。我做过十几个BUCK项目按这个流程走的最多调两次就能稳定。跳过建模直接试参数的往往要调十几遍而且换个负载条件又不行了。注意建模不是万能的它提供的是方向和范围不是精确值。实际调试时示波器和频响分析仪才是最终裁判。模型帮你缩小搜索范围但最后的参数还是要靠实测确定。9. 写在最后我踩过的三个典型坑第一个坑拿小信号模型分析启动。早期我做软启动用Gvd(s)算启动时间结果完全不对。后来才明白启动时占空比从0到D是大信号过程必须用大信号模型。第二个坑忽略ESR零点。有一次设计补偿器理论相位裕度60度实测只有20度振荡了。查了半天发现电容ESR比我预期的小很多零点跑到很高频没起到相位提升作用。后来换了ESR合适的电容问题解决。第三个坑数字延迟没扣。做数字电源时按模拟方法设计补偿器相位裕度算出来45度实际只有10度。后来把延迟加进去重新设计把目标相位裕度提到60度实际测出来45度稳定了。这三个坑的共同点是模型和实际有差距但差距是可以量化和补偿的。关键是要知道差距在哪里然后有针对性地留裕量。建模的价值不在于算得多准而在于让你知道哪些因素重要、哪些可以忽略、哪些必须留裕量。