我先把话说在前面:LTspice 做 BUCK 环路仿真这件事,看起来门槛不高,网上教程也一抓一大把,但真正能把“传递函数”和“波特图”这俩词落到屏幕上、并且测出来的曲线还能跟理论对得上的,其实不多。很多人卡在三个地方:一是不知道搭什么电路才能测环路,二是不知道激励信号往哪儿加,三是不知道测出来的相位曲线为什么跟书上长得不一样。这篇东西就是把这条路完整走一遍,从数学模型到仿真电路,再到波特图实测,全部用 LTspice 一个工具打通,不掺别的东西。
先别急着想那堆高频开关纹波、同步整流死区时间、layout 寄生参数,那些都是后话。环路分析有个基本前提——我们关心的不是开关频率附近的行为,而是远低于开关频率的“平均行为”。所以最干净、最高效的仿真路径,不是搭一个带 MOS 管和电感的完整开关级 BUCK,而是搭一个“平均模型”,把 BUCK 功率级等效成一个受控源网络,然后用 LTspice 自带的 AC 小信号分析直接扫频。这样得出的传递函数和波特图,物理意义清晰,仿真速度快,调参也方便,等你把补偿网络参数定得差不多了,再回到开关级模型去验证,那才是完整闭环。
下面我按实操流程把每个环节拆开讲,尽量把我踩过的坑和验证过的细节都写在里面。
1. 整体设计思路:为什么先做平均模型,而不是一上来就搭开关级 BUCK
1.1 开关级模型在环路测量里的尴尬
很多初学者第一次尝试环路仿真,习惯性动作是打开 LTspice,把一颗实际的 BUCK 芯片或者分立 MOS 管同步整流电路搭出来,然后试图在输出电压反馈回路上做波特图测量。这个思路听起来是对的,但实际操作会非常难受。
开关级模型的输出电压天然带有开关纹波,AC 小信号分析在线性时不变系统里才有意义,而开关电路本质上是时变系统。LTspice 的 .ac 分析是在一个静态工作点附近做线性化,开关器件在仿真里要么处于导通要么处于关断,你得不到一个连续的、稳定的平均工作点,扫频结果往往是一团乱麻,相位曲线在中频段疯狂跳变,增益曲线更是没法看。
所以实践中的普遍做法是:用“平均模型”替代开关器件。常见的平均模型实现办法有三种:一是用分立压控电压源和压控电流源搭建(behavioral source),二是用专用的平均模型子电路(很多芯片厂商会提供),三是在仿真里跑瞬态、用 FFT 提取特定频率响应(那种属于谐波平衡思路,LTspice 里不常用)。我们这儿选第一种,因为最通用、最可控,还能顺便加深对功率级传递函数的理解。
1.2 平均模型到底在平均什么
我把话说得更具体一点:BUCK 功率级的核心变量是占空比 d、输入电压 Vin、电感电流 iL、输出电压 Vout。平均模型做的事情,是把开关网络等效成两个受控关系——
- 开关网络的平均输出电压近似等于 d 乘以 Vin
- 开关网络的平均输入电流近似等于 d 乘以 iL
这个思想的本质是把 PWM 调制器+开关管+二极管(或同步管)看成一个线性化的“占空比控制变压器”,它把直流电压按占空比变换,再把电流按占空比回馈到输入端。只要开关频率远高于环路带宽(一般要求高 10 倍以上),这个等效关系在环路频段内就足够准确。
用 LTspice 的“behavioral voltage source”和“behavioral current source”可以直接表达这种数学关系。你不需要给 MOS 管建模,不需要设定驱动波形,不用关心死区,也不会有仿真不收敛的幺蛾子。这并不丢人,环路设计本来就是在平均意义上做的。
1.3 三种模型对应设计流程的不同阶段
我自己实际设计 BUCK 环路时,会分三步走,三种模型各干各的活:
第一步,用平均模型粗调补偿参数。只看环路增益、相位裕度、穿越频率,这个阶段脑子要清醒,参数要调得快,一次 .ac 仿真几秒钟就出结果。
第二步,用开关级模型跑时域验证。确认补偿参数没问题,带上 MOS 管、电感、电容、ESR、负载阶跃,看输出电压的瞬态响应、开机浪涌、负载跳变时有没有振铃或者失稳。
第三步,如果有条件,做一次闭环瞬态+频率提取的交叉验证。比如用不同负载阶跃看恢复波形,估算实际相位裕度。这步不是必需的,但做了你会更踏实。
下面的实操主要聚焦第一步和第二步的交界处——就是你怎么把平均模型和补偿网络搭起来,又怎么用 LTspice 把波特图导出来。
2. 搭建 BUCK 平均模型的完整步骤
2.1 功率级核心元器件定义
假设我们要设计一个 12V 输入、3.3V 输出的同步 BUCK,开关频率 500kHz,电感 4.7μH,输出电容 22μF 陶瓷加 100μF 电解(陶瓷 ESR 很低,电解 ESR 大约 20mΩ 左右,方便我们后面看 ESR 零点影响)。这些参数先记下,后面传递函数和波特图都要跟它对上:
- Vin = 12V
- Vout = 3.3V
- fsw = 500kHz
- L = 4.7μH
- Cout = 100μF(ESR = 20mΩ) + 22μF(ESR约5mΩ)
- 负载 R_load = 1Ω(输出 3.3A)
- 工作模式: CCM(电感电流连续)
平均模型里不需要真的电感吗?需要,电感电容还是保留的。因为你测的是补偿网络到输出那一整条功率级的频率响应,LC 滤波器的双极点特性必须真实反映出来。平均模型替代的只是“开关网络”,电感、电容、负载电阻这些线性元件全部保留。
2.2 受控源实现占空比到输出电压的转换
在 LTspice 里新建一个原理图,放置以下元件:
- 电压源 V_in,12V
- 电感 L1,4.7μH,串联电阻设 50mΩ 作为 DCR
- 电容 C1,100μF,ESR=20mΩ;C2,22μF,ESR=5mΩ
- 电阻 R_load,1Ω
- 一个行为电压源 B1(用来模拟开关网络的输出电压)
- 一个行为电流源 B2(用来模拟开关网络的输入电流回馈)
B1 的正端接电感 L1 的前端(也就是开关节点 SW 的平均电位),负端接地。B1 的表达式写成:
V = V(ctrl_dc) * V(in_avg)其中 V(ctrl_dc) 是占空比信号节点的电压,V(in_avg) 是输入电压节点的电压。占空比信号可以由外部电路给定,也可以在初始用 0.275 的直流值给定(3.3V/12V ≈ 0.275)。
B2 从输入电源吸取电流,表达式为:
I = V(ctrl_dc) * I(L1)这里 I(L1) 是流过电感的电流。这个表达式实现了“输入电流=占空比×电感电流”,理想变压器关系。
这里有个关键细节:占空比信号 V(ctrl_dc) 在仿真里是 0 到 1 之间的电压值,但它不是 PWM 脉冲。它要么是直流工作点里一个恒定的电压(比如 .dc 或者 .ac 仿真中的工作点),要么是补偿网络输出的低频小信号叠加直流分量。用这样一个“模拟占空比”信号,就绕开了 PWM 比较器,直接在线性域里分析。
2.3 占空比控制的实现:从补偿输出到 ctrl 节点
补偿网络输出的信号是一个电压值,它表示“误差放大器输出”,通常写成 Vcomp。但是 BUCK 功率级对占空比的依赖不是直接线性的,而是通过 PWM 调制器映射:d = Vcomp / Vramp,其中 Vramp 是 PWM 锯齿波幅值。
在平均模型里,可以把这个映射做成一个比例系数,也就是在 B1 和 B2 的表达式里直接除以 Vramp 幅值。比如锯齿波幅值是 1V,那么:
V = V(comp) * V(in_avg) I = V(comp) * I(L1)如果锯齿波幅值是 2V,那占空比增益只有 1/2,直接影响环路增益大小。这个细节很容易被忽略,但它会实打实影响你最终测到的穿越频率。我在实操时习惯单独做一个节点 vramp_ref,用 1V 直流源表示 Vramp 幅值,然后在表达式里写 V(comp)/V(vramp_ref) * V(in_avg),这样修改 Vramp 幅值只需要改一个元件值,清晰又方便。
2.4 补偿网络的实际电路
补偿网络用 Type II 或 Type III。对于 3.3V 输出的低 ESR 陶瓷电容方案,一般建议 Type III,因为陶瓷电容 ESR 零点很高,输出电容的双极点附近没有 ESR 零点来抵消相位延迟,必须用 Type III 在穿越频率附近提高相位。
补偿网络以 TL431 或者运放形式搭建都行。在 LTspice 里用运放最直观。用一个电压控制电压源 E1 当误差放大器(或者直接放一个实际运放模型,比如 LT1001、LT1013)加上三组 RC 网络:
- R_upper 反馈上分压电阻:20kΩ
- R_lower 反馈下分压电阻:10kΩ,参考电压 1.1V,所以输出设定在 3.3V
- 积分电容 C_int:1nF
- 零点电阻 R_z1:20kΩ,串联 C_z1:10nF,构成一个零点
- 高频极点电阻 R_p1:1kΩ,串联 C_p1:330pF,构成一个极点
这些参数是我在一个 500kHz 开关频率 BUCK 上的常用起步值,实际要靠波特图去修正。
这里补充一句:Type III 补偿的传递函数典型形式是两个零点、两个极点(含一个原点极点)。两个零点主要用来抵消 LC 双极点造成的相位滞后,一个高频极点用来压低开关频率附近的高频增益。具体值要靠计算迭代,但迭代的依据就是波特图,这也是我们做仿真的意义。
3. 从传递函数到波特图的测量原理
3.1 为什么要在闭环里“注入信号”而不是直接开环扫
你要测环路增益 T(s),也就是整个环路的开环增益,但它藏在闭环系统里,不能直接断开测。直接断开反馈,工作点会跑飞,补偿网络的状态也不对,测出来的东西毫无意义。
所以工程上常用“Middlebrook 注入法”——在环路里找一个合适的注入点,插入一个极小的交流电压源,然后在注入点两侧分别测电压,用这两个电压的比值算出环路增益。这个方法不需要破坏直流工作点,因为注入源只加了小信号扰动,直流路径还是导通的。
这个原理我说得通俗一点:你在环路里塞了一个“窃听器”,它不改变电路的直流工作状态,只往环路里送一个微弱的小信号,然后在窃听器两侧分别听从这个信号往前传和往后传的幅度和相位,两者的差值就是环路对这一点的响应。
3.2 电压注入和电流注入的选择
Middlebrook 原始方法里有个关键准则:注入点的阻抗必须足够低或足够高,确保信号是以“电压”还是“电流”形式注入不会影响结果。实际操作中,最常用的方式是电压注入,也就是在反馈分压电阻到 FB 引脚(或者补偿网络输入)之间串联一个 1V 的交流源,然后在源的两端分别测电压。
具体做法是在原理图上画一个电压源 V_inj,串联在反馈分压网络和误差放大器输入端之间。这个电压源的值设成“AC 1V”:
V_inj N_fb N_eain DC 0 AC 1DC 0 表示它不影响直流工作点,AC 1 表示在 .ac 扫频时它会输出 1V 的小信号扰动。
然后在 V_inj 的左边和右边分别定义两个节点,测量这两个节点的电压,环路增益 T(s) 计算公式为:
T(s) = - Vf / Ve其中 Vf 是从注入源看到的“返回电压”(从输出侧经反馈网络传回来的信号),Ve 是“注入电压”(从注入源出发往前传到误差放大器的信号)。为什么取负号?因为环路反馈默认是负反馈,环路增益的定义本身包含一个负号,这样 T(s) 的相位曲线才是我们熟悉的从 180° 向 0° 方向变化的形状。
3.3 LTspice 里怎么算 T(s):用 FRA 的“手动版”
LTspice 本身没有一键 FRA 工具(频率响应分析仪),但它的 .ac 分析加上一点数学运算就能实现同样的效果。
你在原理图里定义两个电压探针节点,比如叫 v_return 和 v_error,然后用 .ac 分析跑一遍 100Hz 到 100kHz(或者 1MHz),LTspice 会输出每个频率点上这两个电压的幅度和相位。随后在波形窗口里直接用表达式相除:
V(v_return) / V(v_error)记得加负号:
-V(v_return) / V(v_error)用对数坐标看幅度曲线,用线性坐标看相位曲线,就能得到环路增益的波特图。
这里有个特别重要的细节:LTspice 的波形表达式默认是用复数直接相除,相位信息会被正确保留。你不要先分别看两条电压曲线再脑内相减,那样误差会很大。直接写表达式让 LTspice 算,得到的就是复数增益。
3.4 功率级传递函数为什么要单独看
整条环路的增益能测出来,不过我还强烈建议先单独看功率级传递函数——也就是“占空比到输出电压”的传递函数 Gvd(s),以及“占空比到电感电流”的传递函数 Gid(s)。原因很简单:补偿网络设计必须知道功率级在哪些频点有极点、哪些频点有零点,才能决定补偿网络把零极点放在哪儿。
在平均模型电路里单独测 Gvd 非常容易:把补偿网络断开,在 ctrl 节点上加一个“1V DC + 1V AC”的电压源,也就是:
V_ctrl ctrl 0 DC 1 AC 1然后 .ac 分析中测量 V(out) 的曲线,这条曲线就是 Gvd(s) 乘以一个常数(因为 ctrl 节点电压 1V 相当于占空比 1,实际上这个比例得看控制到占空比的系数)。在 BUCK 平均模型里,Gvd 的理论表达式是:
Gvd(s) = Vin × (1 + s×ESR×C) / (1 + s/(Q×ω0) + s²/ω0²)
其中 ω0 = 1/sqrt(L×C),Q = R_load × sqrt(C/L)(忽略 ESR 影响时)。这个表达式有两个核心特征:第一,LC 双极点在 f0 ≈ 1/(2π×sqrt(L×C)) 处,-40dB/dec 下降;第二,ESR 零点在 f_esr ≈ 1/(2π×ESR×C) 处,之后斜率变成 -20dB/dec。
测出来如果跟理论对不上,不要先怀疑 LTspice,先检查你的平均模型表达式的符号和增益有没有写错。
4. 波特图实测:LTspice 操作全流程
4.1 原理图搭建清单和节点定义
我把完整搭建步骤列一遍,方便直接照抄。为了减少冗余,我只列出关键元件和连接关系。
电源部分:
- V_in:DC 12V,与 B2 电流源串联,B2 另一端接地
- B1:电压源,正端接 SW 节点,负端接地,表达式 V = V(ctrl)/V(vramp_ref) * V(in)
- V(vramp_ref):1V 直流源,作为锯齿波幅值参考
- B2:电流源,从 V_in 正端抽流,表达式 I = V(ctrl)/V(vramp_ref) * I(L1)
功率级部分:
- L1:SW 到 Vout,4.7μH,Rseries=50mΩ
- C1:Vout 到地,100μF,Rseries=20mΩ
- C2:Vout 到地,22μF,Rseries=5mΩ
- R_load:Vout 到地,1Ω
反馈和补偿部分:
- R1(反馈上臂):Vout 到 N_fb 节点,20kΩ
- R2(反馈下臂):N_fb 到地,10kΩ
- V_inj:N_fb 到 N_eain,DC 0,AC 1
- E1:误差放大器,N_eain 到 Vcomp,增益可设大(10 万倍以上模拟运放开环增益),或直接放一个运放宏模型(我实测 LT1001 在这个频段表现很好)
- 补偿网络 RC 接在 E1 的输出 Vcomp 和 N_eain 之间,形成反馈
这里有个点要特别解释:误差放大器的反相输入端 N_eain 接 V_inj 的输出脚,同相输入端接基准电压 V_ref(比如 1.1V)。那么 Vcomp 的直流电压会自动调整到让 N_fb 的直流电位约等于 V_ref,这就是负反馈的直流工作点自洽。
4.2 设置 .ac 扫描参数
在 LTspice 里点击 Simulate → Edit Simulation Command,输入:
.ac dec 50 100 1Meg意思是 100Hz 到 1MHz,每十倍频程 50 个点。50 个点足够平滑了,再多没必要。如果有需要,低频可以下探到 10Hz,但 BUCK 环路穿越频率一般都在几 kHz 到几十 kHz,100Hz 起步足够。
同时要确认 .ac 分析前 LTspice 会先自动计算直流工作点。它会在扫描前把 V_inj 的直流电压设成 0,然后算出各节点直流电压,再在这个工作点上做小信号线性化。这个流程是自动的,但你要确保电路里没有故意设置的初始条件冲突(比如 .ic 语句会导致工作点不对,建议先去掉)。
4.3 在波形窗口里写出环路增益表达式并取波特图
运行仿真后,在波形窗口添加一个新 plot,然后在表达式栏输入:
-V(n_eain) / V(n_fb)或者反过来,取决于你的信号流向。我的习惯是统一用“从注入源看进去,右侧往回看是 V(n_eain),左侧从反馈网络来的是 V(n_fb),返回电压和注入电压的比值就是环增益”。总之先跑一次,如果测出来的低频增益很高、相位从 180° 附近向下掉,那就是对的方向;如果相位从 0° 开始掉,说明符号反了,加个负号就好。
启用 Bode 图显示方式:在波形窗口右键 → 选择 Bode plot 模式,LTspice 会同时显示增益和相位曲线,非常直观。
我前面这样搭完,第一次跑出来的环路增益大致是:低频增益约 60dB 以上,在 LC 双极点频率(约 7.3kHz)附近看到 -40dB/dec 的快速下降,然后补偿网络两个零点(设计在 1.5kHz 和 2.2kHz)把相位拉回来,最终穿越频率在 25kHz 附近,相位裕度在 50° 左右。这个结果跟理论设计值比较接近,说明模型和测试方法都对了。
4.4 常见测量错误自查清单
如果你扫出来的曲线形状很奇怪,按下面顺序排查:
- 注入源 AC 幅值设成 1 没有?如果设成 0,那没有激励信号,测出来全是噪声。
- 注入源极性接反没有?这会导致环路增益符号算错,相位曲线颠倒。
- 补偿网络的参考地是否跟功率级共地?LTspice 里如果有多个地标号(GND 和 AGND)但没有连接,会导致工作点错误。
- .ac 扫描频率范围和步长是否合理?如果频点太稀疏,双极点附近的相位陡降会被漏掉。
- 是不是用了 .tran 而不是 .ac?我们前面讲的这套方法只适用于 .ac 线性化分析,你要跑瞬态看环路,那是另一套时域方法。
踩过其中三个坑的人应该深有体会,尤其是第四点,频点太少会让你误判穿越频率,进而把补偿网络调错方向,白白浪费一晚上。
5. 从波特图读懂环路:增益裕度、相位裕度与穿越频率
5.1 三个关键指标的判读标准
波特图画出来不是用来看个热闹,而是用来回答三个问题:
穿越频率(Crossover Frequency):环路增益幅度降到 0dB(增益为 1)的那个频点。这个点决定了环路能多快响应负载突变。一般建议穿越频率在开关频率的 1/10 到 1/5 之间。500kHz 开关频率下,就是 50kHz 到 100kHz。但实际受限于右半平面零点(CCM Boost 才有,BUCK 没有)和补偿网络能力,我常把 BUCK 穿越频率定在 20kHz 到 40kHz,兼顾稳定性和响应速度。
相位裕度(Phase Margin):在穿越频率处,相位曲线上移 180° 后的余量。公式是 PM = 180° + ∠T(fc)(注意 T 的定义已经包含负号,所以相位曲线在穿越频率处应该大于 -180°)。一般要求 45° 到 60° 以上,我一般按 60° 设计。小于 30° 基本上就是欠阻尼,时域表现为负载阶跃后输出电压剧烈振铃。
增益裕度(Gain Margin):相位曲线穿越 -180° 时,增益幅度低于 0dB 的量。一般要求 6dB 到 12dB 以上。增益裕度不足的话,在某些工艺角或者负载极端条件下有可能因为参数漂移导致振荡。
我测过很多次,最终发现一个规律:相位裕度够不够,看时域负载阶跃的收敛速度最直观。PM 大于 60° 的环路,阶跃响应可能有点慢,但基本是单调收敛,最多一个半振铃。PM 在 30° 到 45° 之间的环路,振铃明显增多,大概三到四个振荡周期。PM 小于 30°,已经可以在波形上看到接近等幅振荡的趋势了。
5.2 补偿网络调参的方向性指引
当你在波特图上发现问题时,补偿网络的调参方向大概如下,都是经验之谈,但基本符合控制理论:
- 穿越频率太低(比如只有 5kHz),说明环路增益在中频段不够。加大误差放大器跨导或减小积分电容 C_int,可以让增益曲线整体上移,穿越频率升高。
- 相位裕度不足,优先移动两个零点到你测到的 LC 双极点频率附近(略低一点,比如 0.5 倍到 0.8 倍),用零点的相位提升去抵消 LC 极点的相位滞后。
- 穿越频率太高,接近开关频率的一半,说明补偿网络高频增益过大。加一个高频极点,或者减小零点电阻,把高频段压下去。
- 低频增益不够,调整反馈分压电阻比值不会有用(它不影响环路增益),要调的是误差放大器的积分电容和跨导。低频增益越高,直流精度越好,静差越小。
调参时要一次只动一个元件,跑完一次仿真看波特图再改下一个,千万不要同时调三个元件,不然你根本不知道是谁起的作用。
5.3 一个典型 Type III 补偿的参数计算示例
我直接给一组可以抄的起步参数,方便复现前面描述的目标:穿越频率 25kHz 左右,相位裕度 50 到 60 度。
假设误差放大器是理想运放,反馈分压 R1=20k、R2=10k,参考电压 1.1V。Type III 网络接在运放反相输入端和输出端之间:
- R_z1(串联零点电阻) = 20kΩ,C_z1(串联零点电容) = 10nF,零点频率 fz1 = 1/(2π×20k×10n) ≈ 795Hz
- R_z2(第二个零点电阻) = 8.2kΩ,C_z2 = 22nF,零点频率 fz2 ≈ 880Hz(和上面那个间隔不大,实际我会调开一点,比如一个放 600Hz,一个放 1.2kHz,相位提升带宽更宽)
- R_p1(第一个极点电阻,用来限制高频增益) = 2.7kΩ,C_p1 = 330pF,极点频率 fp1 ≈ 178kHz
- C_int(原点极点积分电容) = 1nF
这几个值是在 12V 输入、3.3V 输出、4.7μH、100μF 参数下比较合理的起点。实际仿真后大概率需要微调,但至少不会一开始就差得离谱。
5.4 平均模型与开关级模型的交叉验证
前面说平均模型跑得快,适合调参。但你最终交付的设计,至少要在开关级模型上跑一次时域验证,我个人的经验流程是这样的:
- 把平均模型里的 B1、B2 和占空比控制节点拆掉,替换成实际的 MOS 管模型(可用 LTspice 内置的 NMOS 或 GaN 模型),加上 PWM 比较器(用压控开关或者 A 器件实现),加上电感、电容、负载。
- 设置 .tran 仿真,时长为 2ms 到 5ms,让输出电压稳定下来;在 1ms 处做一个负载阶跃(把 R_load 从 1Ω 跳到 0.5Ω 或者反过来),观察 Vout 的恢复波形。
- 如果补偿参数来自平均模型的波特图优化,那么时域响应应该体现出你设定的相位裕度特征:比如 25kHz 穿越频率对应阶跃恢复时间大约在几十微秒量级,振铃次数在 1 到 2 次以内。
- 如果时域波形出现持续振荡或者大幅度振铃,说明平均模型里没考虑到的延迟(驱动延迟、比较器延迟、采样效应)影响了环路,回到平均模型里加一个等效延迟环节(比如一个极点)再修正参数。
这里有一个容易被忽略的坑:开关级模型中的 PWM 比较器和驱动电路会引入约半个开关周期的延迟,也就是 1μs(500kHz 下)。这个延迟在平均模型里没建模,所以在相位裕度的余量上要留足,我一般要求平均模型测出的相位裕度比目标值高出 10 到 15 度,留出延迟的余量。
6. 实操中的典型问题与排查技巧
6.1 仿真报错“unknown schematic syntax”或“太慢不收敛”
LTspice 对语法要求比较严格,尤其是行为源表达式里的节点名。节点名不要用纯数字开头,不要跟内置节点(比如 VCC、GND)冲突,不要用中文。行为源表达式里函数要用 LTspice 支持的函数名,比如V(ctrl)/V(vramp_ref)*V(in)是正常的,但如果你写了类似IF条件或者TABLE,注意括号和逗号是不是匹配,有没有用英文半角符号。
遇到不收敛,先试试给某些节点加一个极大的并联电阻到地(比如 1GΩ),或者把 .options 里的reltol放宽一些。平均模型通常不会不收敛,如果你遇到不收敛,大概率是行为源表达式写错导致工作点根本没有解。
6.2 测出来的环路增益为 0 或非常小
这个坑我遇到太多次了。通常的原因有两个:
一个是注入源 AC 幅值设为了 0,LTspice 默认电压源 AC 属性是 0,所以你必须手动改成 1。很多人只设置了 DC 值忘了 AC 值。
第二个是信号的传输链路里出现了单位不匹配。比如占空比信号在 B1 表达式里除以了 V(vramp_ref),但 vramp_ref 设置成了 1kV(忘了改成 1V),那相当于占空比只有千分之一,环路增益自然低到几乎没有。检查每个比例系数,确保数量级是对的。
6.3 相位曲线在低频段先上翘然后才下降
如果测出来的相位曲线低频段先往正方向走,比如从 -90° 开始变成 -60°,然后再下降,这通常是注入点两侧的阻抗关系不满足“单向注入”条件导致的测量伪影。Middlebrook 注入法要求注入点两侧往回看的阻抗差异足够大,否则信号会来回反射,相位测量失真。
解决办法是把注入点移动一下。通常误差放大器输入端前面的分压电阻网络是个比较好的注入点,因为运放输入端阻抗很高,反方向阻抗也比较明确。如果你注入在输出端直接接负载的地方,阻抗太低,注入源没法有效注入,曲线就会很怪。
6.4 保存文件时冒出好几个文件是正常的
LTspice 里保存一个原理图,会在同一目录下生成 .asc 原理图文件、.log 运行日志文件、.raw 波形数据文件、.net 网表文件等等。刚接触的人会觉得很乱,其实这些文件各有用处:.raw 是大块二进制波形数据,.log 记录仿真信息和错误,.net 是网表文本。如果你需要重新仿真旧电路,只需要 .asc 文件就行,其他都可以删掉。记得把仿真命令存到原理图里(Edit → Simulation Command → 选中后保存),这样打开 .asc 就能直接跑。
6.5 关于“虚零点”和“RC 串联零点”的常见困惑
仿真做多了,你会遇到一个概念问题:为什么 RC 串联能形成零点并提升相位?因为零点在频域里的本质是“让增益在某段频率范围内增加,同时提供相位超前”。RC 串联网络的阻抗是 R + 1/(sC),它的转折频率在 fz = 1/(2πRC),高于这个频率后电容阻抗变小,电阻主导,其阻抗随频率升高而停止下降,反映到反馈回路上就等效为增益的抬升和相位的推进。
同理,有些资料里讲“虚零点”,是指在某些传递函数表达式里,分子上出现了一个实数零点,但它对应的频率远高于我们关心的频段,所以实际影响不大。仿真时你看到波特图上增益曲线在某个高频点有个小台阶,那就是 ESR 零点或某个补偿零点在起作用,可以用这个来定位零极点。
7. 最后再分享一点个人的实操心得
写了这么多,其实真正想说的是:LTspice 做 BUCK 环路仿真,本质上就是一个“把书上的传递函数公式变成实际能动的电路”的过程。你搭平均模型的时候,就是在亲手实现 Gvd(s)、Type III 补偿器这些数学对象;你在波形窗口写 -V(n_eain)/V(n_fb) 的时候,就是在亲手实现环路增益 T(s) 的定义;你盯着波特图调 RC 参数的时候,就是在手动执行一次控制器的零极点配置。
这个过程最大的好处,不是让你得到一个仿真图片发朋友圈,而是逼着你把“反馈控制”这四个字具体到一个电阻一个电容的取值上。你调坏一组参数,看到相位裕度掉到 20°,然后在时域仿真里看到输出电压振铃七八个周期还不收敛,那种直观冲击比看一百页教材都管用。反过来,如果你把相位裕度调到 65° 再跑负载阶跃,波形利落收尾,你大概就能明白书上为什么反复强调相位裕度要大于 45°了。
后续如果你有空,还可以往这三个方向继续玩:一是把平均模型改成峰值电流模式控制,加上电流采样增益和斜坡补偿,看功率级从二阶变成一阶之后环路好调了多少;二是自己在平均模型里加入输出电容的 ESR 扫描,做一个“ESR 从 1mΩ 到 100mΩ”的参数扫描,直观看到功率级零点移动对环路稳定的影响;三是试试把你的 Type III 补偿器离散化,转到数字域用 z 变换实现数字电源的环路设计,到时候你会发现,手撕传递函数的能力依然是最值钱的基本功。