说实话最近好几个做电源的朋友都问过我在LTspice里怎么测Buck环路的相位裕度卡住的点几乎一模一样知道要扫波特图但不知道在哪断开环路、怎么注入扰动更别说把网上的Type II补偿传递函数公式和仿真结果对上号。我自己第一次做的时候也折腾了大半天后来把跨导放大器、功率级模型、环路注入这几块串起来才真正把LTspice当成一台“虚拟的环路分析仪”用。这篇我会从最底层的功率级传递函数讲起接着拆跨导放大器怎么搭补偿网络最后在LTspice里搭出完整的环路增益测试电路一步步扫出波特图、判断稳定性。整个过程可以直接照抄到你自己的Buck设计里。不管你是刚接触开关电源仿真的学生还是在做DC-DC的硬件工程师只要跟着走一遍基本就能把“环路补偿”这四个字变成本能操作。1. 为什么要在LTspice里做Buck环路仿真1.1 环路仿真到底解决什么问题很多刚接触电源设计的人对“环路”没什么实感以为把功率级搭出来、输出电压正确就完事了。但Buck电路是一个闭环系统输出电压经过分压电阻采样送进误差放大器再通过PWM比较器控制占空比。这个闭环里任何一个环节的增益和相位不合适就可能出现输出振荡、负载阶跃响应拖尾甚至带载掉电压。在真实板子上调试环路是最痛苦的因为要反复更换补偿电阻电容、焊来焊去、用网络分析仪或者频率响应分析仪测环路。LTspice的价值在于它可以免费、无限次地对你设计的电路做AC小信号分析直接得到环路增益和相位曲线让你在画PCB之前就把补偿参数选好。换句话说LTspice不是用来替代理论推导的它更像一个“验证台”把传递函数公式和实际电路行为对应起来。这也是我为什么建议先把传递函数推导过一遍再动手仿真否则你连波特图上的拐点是怎么来的都看不明白。1.2 从跨导放大器到波特图的完整信号链路要理解环路脑子里要有一条清晰的信号链输出电压 (V_{out}) 经过电阻分压得到反馈电压 (V_{FB})反馈电压与参考电压 (V_{ref}) 的误差送到跨导放大器OTA的输入端OTA把电压误差转换成电流这个电流流过补偿网络形成控制电压 (V_c)。(V_c) 再进入PWM比较器与固定频率的锯齿波比较产生占空比 (D)最后通过功率级滤波得到输出电压。这条链路上有三个核心部分误差放大与补偿这里用的是跨导放大器它的传递函数是 (I_{out} g_m \cdot (V_{inp} - V_{inm}))特点是输出阻抗很高适合直接驱动RC补偿网络。补偿网络决定环路的零极点位置直接影响带宽和相位裕度。PWM调制器把控制电压 (V_c) 映射成占空比增益大约等于锯齿波幅值的倒数即 (F_m 1/V_{ramp})。功率级包括开关管、电感、电容、负载小信号模型是一个二阶低通滤波器带有由电感电容决定的双极点以及由输出电容ESR引入的零点。所谓“环路增益波特图”就是把反馈网络断开在断开处注入小信号测量信号绕环路一圈后返回时幅度和相位的变化。理解了这条链后面所有操作都有了立足点。1.3 仿真前的准备工作下载、模型文件管理LTspice本身是免费的去官网下载安装即可。这里提一句很多人会迷惑的问题保存电路后文件夹里除了.asc原理图文件还会出现.raw波形数据、.log运行日志、.net网表等文件这些都是正常产物不是垃圾文件。如果你修改了原理图重新仿真.raw会被覆盖但旧的手动保存的文件可能还在注意识别即可。另外如果你要用厂商的MOSFET或者特定PWM控制器模型一般通过.include或.lib指令把模型文件加载进来。在原理图上放置一个SPICE Directive文本写上.include your_model.lib然后在元件属性里把Value改成模型名就可以了。如果遇到Unknown schematic syntax这类报错多半是粘贴的文本里有非法字符或者模型文件路径没写对检查一下文本层内容通常就能解决。2. Buck功率级传递函数环路的“被控对象”2.1 功率级小信号模型的关键环节做环路补偿之前必须先搞清楚功率级的传递函数它是整个环路的“被控对象”。电压模式Buck在连续导通模式CCM下从控制电压 (V_c) 到输出电压 (V_{out}) 的小信号传递函数可以写成[ G_{vd}(s) V_{in} \cdot \frac{1 \frac{s}{\omega_{ESR}}}{1 \frac{s}{Q \cdot \omega_0} \left(\frac{s}{\omega_0}\right)^2} ]其中(\omega_0 \frac{1}{\sqrt{L \cdot C}})是LC滤波器的自然谐振角频率(Q R_{load} \cdot \sqrt{\frac{C}{L}})是品质因数(\omega_{ESR} \frac{1}{R_{ESR} \cdot C})是输出电容ESR引入的零点角频率。这个公式有两个典型特征。第一LC双极点会让增益在谐振频率之后以-40dB/dec的斜率下降同时相位急速拉向-180°附近。第二ESR零点会提供一个20dB/dec的上升抵消一部分高频衰减。不同的电容类型ESR大小差异极大比如电解电容ESR可能有几十毫欧到几百毫欧MLCC可能只有几毫欧这会让零点频率相差很远直接影响补偿策略。2.2 功率级波特图特征与主导极点我们用一个具体例子来算一遍。假设输入12V输出1.2V开关频率600kHz电感 (L 2.2\mu H)输出电容 (C 47\mu F)ESR取5mΩ负载电流5A等效负载电阻 (R_{load} 0.24\Omega)。先算LC谐振频率[ f_0 \frac{1}{2\pi\sqrt{2.2\times10^{-6} \times 47\times10^{-6}}} \approx 15.6\text{kHz} ]品质因数[ Q 0.24 \times \sqrt{\frac{47\times10^{-6}}{2.2\times10^{-6}}} \approx 1.11 ]ESR零点频率[ f_{ESR} \frac{1}{2\pi \times 0.005 \times 47\times10^{-6}} \approx 677\text{kHz} ]这意味着功率级在15.6kHz处有一个幅度比较高的谐振峰之后以-40dB/dec下降一直要到677kHz才有ESR零点把斜率拉回-20dB/dec。对补偿网络来说我们的任务就是在LC双极点附近放一个零点抵消它再在高频处放一个极点压制开关噪声和增益同时保证穿越频率处的相位裕度足够。注意当负载电阻变化时(Q) 会变。轻载时 (R_{load}) 大(Q) 变大谐振峰的尖起来越明显相位裕度也可能变差。所以仿真时不能只测一个负载点建议把满载和轻载都扫一下。2.3 用LTspice验证开环功率级特性在正式搭闭环之前可以在LTspice里把功率级单独拉出来验证传递函数。方法是固定PWM比较器输出一个恒定占空比比如用一个恒定电压源作为控制信号然后在控制端叠加一个AC1的小信号源对输出做AC扫描。具体做法是放置一个电压源 (V_{ctrl})直流值设成对应目标占空比的电压再串一个小电压源 (V_{ac})AC幅度填1。这样AC分析时等效于在控制端注入一个小扰动。仿真完看 (V_{out}) 的幅频曲线应该能看到15.6kHz附近的谐振峰以及高频段-40dB/dec的斜率。这一步确认了功率级模型和理论计算的一致性后面补偿起来心里就有底。3. 跨导放大器OTA补偿网络建模3.1 跨导放大器与普通运放的区别传统运放VFA输出是低阻抗电压源而跨导放大器OTA输出是受输入差分电压控制的电流源。这个特性在电源补偿里有天然优势OTA的输出电流直接对补偿网络的电容充放电很容易构成积分器而积分器在低频有很高增益可以实现输出电压的精确调节同时在高频把环路增益压下去。另一个区别是OTA的输入失调电流一般很小输入端不取电流反馈分压电阻可以选得比较大减小静态功耗。很多现代DC-DC控制芯片比如TI的TPS系列、ADI的很多PWM控制器内部误差放大器都是OTA结构所以弄清楚OTA的建模方式非常实用。3.2 Type II补偿网络的传递函数推导用OTA做补偿时常见接法是OTA输出端接一个RC网络到地这个网络就是补偿阻抗 (Z_{comp})控制电压 (V_c I_{out} \cdot Z_{comp})。由于 (I_{out} g_m \cdot (V_{ref} - V_{FB}))补偿器的传递函数就是[ G_c(s) \frac{V_c}{V_{FB} - V_{ref}} -g_m \cdot Z_{comp}(s) ]典型的Type II补偿网络是(R_z) 与 (C_z) 串联再与 (C_p) 并联接到OTA输出端和地之间。这个阻抗可以写成[ Z_{comp}(s) \approx \frac{1 s R_z C_z}{s(C_z C_p)\left(1 s R_z \frac{C_z C_p}{C_z C_p}\right)} ]当 (C_z \gg C_p) 时可以简化成低频增益由原点极点决定提供高直流增益零点频率 (f_z \frac{1}{2\pi R_z C_z})用来抵消功率级LC双极点极点频率 (f_p \frac{1}{2\pi R_z C_p})用来削减高频增益抑制开关噪声。整个补偿器的增益系数里带有 (g_m)也就是说OTA的跨导直接参与增益计算。很多人在LTspice里搭仿真时随便用一个理想运放替代OTA结果补偿参数完全对不上就是因为忽略了 (g_m) 这个系数。3.3 在LTspice里用行为源搭建OTALTspice里搭建OTA模型非常简单。可以用一个电压控制电流源VCCS来实现Symbol里选择g符号在Value里填入跨导增益比如g1 out 0 in_plus in_minus 500u意思是输出电流 (I(out,0) 500\mu S \times (V(in_plus) - V(in_minus)))。如果你希望OTA输出有饱和特性可以用LTspice的B类行为源写B1 out 0 Ilimit(500u*V(in_plus,in_minus), -1m, 1m)这样就把输出电流限制在±1mA模拟真实OTA的有限摆率特性。要注意的是行为源在瞬态仿真时可能因为不连续性导致收敛变慢纯AC分析阶段建议先用简单VCCS稳定后再加限幅。更高级的验证方法是直接用一个Laplace表达式定义传递函数比如E_comp out 0 Laplace -500u * (1s*4.7k*2.2n) / (s*(2.2n100p)*(1s*4.7k*100p))在AC分析里这个源的行为与你实际搭的RC网络应当完全一致。如果两者波形重合说明你搭建的补偿网络物理实现没有问题这个对比验证是我自己很常用的方法。3.4 选择补偿参数从目标带宽倒推补偿参数不是拍脑袋定的。设计目标一般是让环路穿越频率落在开关频率的1/10到1/5之间。对于600kHz的Buck穿越频率可以取60kHz左右。低于这个值动态响应偏慢高于这个值可能放大高频噪声而且当穿越频率接近开关频率的一半时数字控制延迟或者PWM延迟带来的相位滞后会非常明显。从60kHz这个目标倒推LC双极点大约在15.6kHz先把补偿零点也放在15.6kHz附近。这样功率级-40dB/dec的斜率被补偿器零点抵消成-20dB/dec环路增益在穿越频率附近以-20dB/dec穿过0dB相位裕度才比较健康。初选参数可以这样算(f_z 15.6\text{kHz})取 (R_z 4.7k\Omega)则 (C_z 1/(2\pi \times 4.7k \times 15.6k) \approx 2.2nF)。高频极点可以放在 (f_p \approx 300kHz)则 (C_p 1/(2\pi \times 4.7k \times 300k) \approx 113pF)取100pF。这个组合可以作为第一次仿真的起点后面根据波特图再微调。4. 环路增益测量在LTspice里复现“波特图测试”4.1 断开点选择与直流工作点保护要在LTspice里测环路增益核心操作是“在环路的某个断开点注入小信号再测量绕一圈回来的幅度和相位”。断开点最好选在信号流向清晰、阻抗合适的位置。最常用的是误差放大器输出 (V_c) 和PWM比较器输入之间的连线或者输出电压采样点与反馈分压电阻之间的连线。断开的直接后果是直流工作点可能发生变化。因为原电路是闭环的输出通过反馈网络稳定在一个固定值断开后反馈回路不再起作用某些节点电压可能漂到不合理的值甚至导致仿真不收敛。解决办法是使用“偏置网络”在断开点的两端并联一个极大电感 (L_{iso})交流下阻抗极高相当于开路直流下电阻极小相当于短接从而维持原工作点。另一个做法是在注入信号源支路串联一个极大电容 (C_{block})直流下电容隔断直流通路交流下阻抗极小让AC信号通过。这个电容保证注入源的直流不会影响电路偏置。4.2 方案一交流源注入扫频法这是最直观的方法。操作步骤如下在原理图上把断开点两侧节点分别命名为a上游和b下游。在a、b之间插入一个AC电压源Vtest正极接b负极接aAC幅度填1直流值填0。在a、b两端并联一个大电感Liso 1G保证直流偏置正常。在Vtest支路上串联一个1T的大电容这样交流信号能通过直流被阻断。运行AC分析例如.ac dec 100 10 1Meg。显示波特图时把纵轴设置为电压增益表达式。测量结果的表达式需要根据你的断开点方向调整。我常用的表达式是V(b) / V(a)取20*log10的幅值曲线和相位曲线。如果得到的相位曲线在穿越频率处是从-180°附近向上摆说明符号或方向反了改成-V(b)/V(a)或者取倒数即可。不要死记公式要会看图判断负反馈系统的环路增益波特图在低频段应呈现高增益相位接近-180°在中频穿越处相位应高于-180°也就是相位裕度为正。4.3 方案二两侧探针比值法如果你觉得加电感电容的偏置网络麻烦还有一个更接近实际环路分析仪原理的做法直接把断开点切开在断开处串联小信号源然后同时测量注入源两侧节点对地的交流电压。节点a是返回信号侧节点b是接收注入信号侧。注入源Vtest正极接b负极接a。那么注入信号本身等于 (V(b) - V(a))而环路对注入信号的响应就体现在 (V(a)) 上。环路增益可以写成[ T(s) -\frac{V(a)}{V(b) - V(a)} ]为什么有个负号因为我们的断开点和反馈极性决定了返回信号需要抵消注入信号这是负反馈的基本要求。实际测量时如果发现波特图形状明显不对大概率是符号问题。这种方法的缺点是理想电压源作为注入源输出阻抗为零会改变断口处的阻抗环境引入测量误差。在大多数Buck环路里由于功率级输出阻抗较低电压注入法的误差在可接受范围内如果你追求更精确的结果可以分别用零阻抗注入和无穷大阻抗注入两次测试取几何平均对应Middlebrook方法的简化版。4.4 仿真指令与探针设置.ac、八倍频程等LTspice的AC仿真是线性化频域分析它不像瞬态仿真那样真正让开关管来回切换而是根据工作点对电路做小信号线性化。因此仿真速度非常快几十秒甚至几秒就能扫完。常用指令.ac dec 100 10 1Meg解释一下dec表示每十倍频程取点数100是每十倍频程100个点10是起始频率10Hz1Meg是终止频率1MHz。点太少曲线会不够平滑点太多则浪费时间。对开关电源环路来说从10Hz扫到1MHz或者3倍开关频率通常已经足够。仿真完成后在波形窗口里右键Y轴可以把横轴设为对数坐标纵轴选择Bode模式LTspice会直接显示幅频和相频两个窗格。也可以手动输入表达式20*log10(mag(V(b)/V(a))) phase(V(b)/V(a))这样很方便地查看穿越频率、相位裕度和增益裕度。我个人建议在波形的Add Trace里直接写表达式灵活度最高。5. 波特图调试实战从“勉强稳定”到“留足裕量”5.1 看懂环路增益波特图穿越频率、相位裕度、增益裕度当我们成功扫出环路的波特图之后怎么判断好坏主要看三个指标。第一是穿越频率crossover frequency(f_c)即环路增益幅值等于0dB的那个频率。(f_c) 决定了闭环带宽数值越高动态响应越快但太高容易放大高频噪声一般建议 (f_c f_{sw}/5)甚至对于保守设计取 (f_{sw}/10)。第二是相位裕度phase margin(PM)在穿越频率处读取相位用-180°减去该相位。(PM) 大于0系统才稳定工程上建议至少45°最好在55°到70°之间。PM太小时负载阶跃响应会出现振铃甚至输出持续振荡。第三是增益裕度gain margin(GM)在相位穿越-180°的那个频率处读取幅值距离0dB还有多少dB。一般要求 (GM 6dB)最好10dB以上。举个例子假设你在60kHz穿越读到的相位是-115°那么 (PM 180° - 115° 65°)这个状态比较健康。如果穿越频率处相位是-160°(PM 20°)那就非常危险必须调补偿参数。5.2 补偿参数变化对波特图的影响修改补偿参数时可以参考下面几条规律增大 (R_z)补偿零点和极点同时向低频移动并且因为OTA的输出阻抗变大低频增益也变大。这会让穿越频率升高、相位裕度可能变大也可能变小要看零点位置是否落在LC双极点附近。增大 (C_z)零点向低频移动同时由于积分电容变大低频增益下降。如果在穿越频率处出现-20dB/dec的平坦段可以适当调整(C_z)让增益曲线更平滑。增大 (C_p)高频极点向低频移动高频衰减更厉害。这个电容主要用来压制高频尖峰如果开关噪声或者次谐波振荡风险大可以把(C_p)调大但注意极点不要低到吞噬相位裕度。我调试时习惯每次只改一个参数跑一次AC扫描对比前后波特图。千万别同时改动多个参数否则出了问题根本不知道是哪个改动引起的。5.3 一个完整调试案例的操作实录回到前面的例子初始补偿参数(R_z 4.7k\Omega)(C_z 2.2nF)(C_p 100pF)OTA的 (g_m 500\mu S)。第一次仿真结果通常会发现穿越频率偏低比如只在30kHz左右相位裕度可能还有80°这说明环路偏保守动态响应慢。此时可以减小(C_z)让零点频率提高同时适当增大(R_z)提升中频增益。比如把 (C_z) 从2.2nF改成1.5nF零点向24kHz移动穿越频率可能升到50kHz左右相位裕度仍然保持在60°以上。如果发现高频处增益下降不够快或者波形上有明显尖峰就把(C_p)从100pF增加到220pF让高频极点提前到更低频率把开关频率附近的增益压下去。这会对相位裕度产生一些损耗所以要重新检查60kHz附近的相位。多轮迭代后我一般会得到满意的结果穿越频率在开关频率的1/10左右相位裕度60°上下增益裕度大于10dB。这时再把负载电阻从0.24Ω改成2.4Ω轻载重新跑一遍确认轻载下相位裕度没有急剧恶化。这个“多负载点复核”是很多教程不会提但实际工程里非常必要的步骤。5.4 如果接的是数字控制器离散化思路现在很多Buck控制器已经从模拟补偿器换成数字补偿器环路里多了一个ADC采样和数字PWM模块。这时候LTspice依然有用只不过要把连续域的补偿器换成离散域。模拟补偿器的传递函数 (G_c(s)) 可以通过双线性变换Tustin或零阶保持器离散化映射到z域。离散化后每个开关周期执行一次控制计算不可避免会引入一拍甚至半拍的延迟这个延迟在穿越频率处贡献的相位滞后约为[ \Delta \phi 360^\circ \cdot f_c \cdot T_s ]其中 (T_s) 是采样周期。如果采样周期是1.67μs600kHz开关频率穿越频率取60kHz那么延迟带来的相位滞后约36°这是非常大的数字。所以数字控制环路的设计目标穿越频率通常低于模拟方案或者在补偿器里加一个超前环节来抵消延迟。在LTspice里验证离散化效果可以把数字延迟用一阶拉普拉斯近似 (e^{-sT} \approx 1 - sT/2) 或者直接用理想延迟原件建模然后重新跑环路增益曲线。这样你就能直观看到离散化对相位裕度的侵蚀程度。6. 常见问题与排查技巧实录6.1 LTspice仿真操作常见坑在朋友圈和论坛里看到最多的问题其实是LTspice本身的操作问题跟环路理论无关。这里列几个我亲测踩过的坑。第一AC仿真时节点电压没反应。多半是电压源属性里的AC幅度没填LTspice默认AC幅度是0你必须在电压源属性里把AC Amplitude设为1。很多人只设置了直流值扫出来当然是一条平线。第二unknown schematic syntax报错。这通常不是电路元件的错误而是SPICE指令文本里写了非法内容。比如你从网页复制了一句指令里面混入了全角符号或者特殊字符LTspice就会报这个错。检查方法右键原理图空白处选Edit SPICE Directive逐行检查。第三跑AC分析时提示“singular matrix”或者不收敛。常见原因是电感电容值太小/太大或者有大电感和理想电压源直接并联。把偏置网络里的1G电感改成1T或者加一点点串联电阻通常能解决问题。第四保存文件后出现一堆.raw、.log、.net文件。这属于LTspice的正常输出不用刻意清理。如果你用版本管理工具管理原理图只提交.asc和.plt文件即可。6.2 环路仿真结果异常的排查思路环路仿真扫出来的波特图如果跟理论预期相差十万八千里先别急着怀疑电路按下面顺序排查。先看直流工作点。AC仿真是基于直流工作点做线性化的如果工作点不对后面全错。运行仿真后按D键查看关键节点电压输出电压是否等于目标值、误差放大器的两个输入是否相等、PWM比较器的输入是否在合理范围内。任何一项不正常都说明直流偏置被破坏了。再看注入点选择。断开点如果选在低阻抗节点注入源的负载效应会把环路增益测低。我建议优先在反馈分压电阻和输出点之间断开这个位置阻抗相对较高注入误差小。然后看仿真频率范围。如果起始频率太高比如从1kHz开始扫你可能会错过低频高增益段看不出积分器效果如果终止频率太低比如只到100kHz又可能看不到高频极点误以为环路在高频很稳。电源环路仿真建议从10Hz甚至1Hz开始终止频率至少3倍开关频率。6.3 模型文件与语法相关的经验有时我们需要用厂商提供的PWM控制器SPICE模型但这些模型可能是为其他仿真器写的直接扔进LTspice会报错。比较常见的问题是模型里使用了TABLE、IF等LTspice支持不够完善的语法或者引用了SIN等源函数里有不兼容的参数。我的经验是先用最简单的理想化模型搭通主回路验证控制策略和补偿思路确有必要时再替换成厂商模型做精细仿真。这样既保证仿真速度也避免被模型兼容性问题卡住。如果你真的需要导入复杂的第三方模型可以用.lib或.include指令务必确认模型文件路径和指令写法都正确。另外一个实用技巧LTspice的Laplace表达式在AC分析下很快但在瞬态仿真里容易收敛异常。所以如果你后面要做负载阶跃的瞬态仿真建议用实际的R、C元件搭补偿网络而不是用Laplace源。7. 写在最后的一点个人体会做了这么多年电源设计我越来越觉得环路仿真不是“会操作LTspice”就够关键是心里要有传递函数的图景。你看到的每一个零点、极点都能对应回电路里某个元件你在波特图上每移动一个拐点都知道是在动哪个RC。LTspice只是把那根看不见的“环路增益曲线”拉到你面前而已。按照我自己的流程每次拿到一个新的Buck方案永远是先在LTspice里把功率级传递函数验证一遍然后搭OTA补偿网络最后用注入法测整个环路的波特图。这个过程熟练之后从零到拿到一组合格的补偿参数通常不超过半小时。希望这篇文章能帮你把这条路走通少走我当年绕过的那些弯路。
