建模背景:为什么要研究 LDO + RC + ESR 补偿?
LDO 输出往往接一个大电容(Cout)来稳定电压,负载端还可能串一个滤波电阻(形成 RC)。这带来了新的极点,影响控制系统的稳定性:可能导致相位迟滞过多,甚至不稳定、振荡;我们可以利用电容的 ESR 创建一个“补偿零点”,弥补这一缺陷。
极点:环路零点输出极点
极点1:模拟主环路放大器带宽限制
极点2:由负载电阻和输出电容构成
零点:输出电容的 ESR 引入的提前相位
这个模型就是意思一下,大概就是说,系统的闭环是有好几个东西在里面的,属于组合建模。
接下来我们组合成完整开环传递函数:
公式可以说明系统在不同频率下放大了多少,并且滞后了多少。
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
系统本来有两个极点,会造成快速相位下降,可能导致不稳定。
所以我们:用 :放慢控制环路,避免太激进;用 :反映电容/负载的影响;加入 :ESR 零点起补偿作用——抵消一点相位损失,拉系统一把!
再回忆一下:极点会让“幅值”下降、让“相位”变慢(掉下去);零点会让“相位”提前(相当于拉住那个要掉下去的人),合理搭配就可以美滋滋。
幅频响应(上图)
蓝线(极点):1/(1 + sτ)
一开始不变,之后从 1 kHz 开始“滚降”;每上升一个十倍频率(decade),下降约 20 dB(也就是 -20 dB/dec);直觉上就像系统“越来越听不清高频”。
橙线(零点):1 + sτ
一开始也不变,但从 1 kHz 开始“抬升”;每 decade 增益升高 20 dB;直觉上像系统“越来越放大高频”。
相位响应(下图)
蓝线(极点):
相位从 0° 开始,逐渐下降;在截止频率(1 kHz)处掉到 -45°,再继续下降至 -90°;也就是让信号“越来越落后”。
橙线(零点):
相位从 0° 开始,逐渐上升;在 1 kHz 处升到 +45°,再继续升至 +90°;相当于让信号“提前响应”。
极点会让系统“慢下来”,增加延迟(→ 更容易不稳定)
零点则让系统“提前动作”,补回来一部分延迟(→ 更稳定)
比如我设计了一个电源调节系统,反应很快(增益很高),但太快会冲过头,于是加点阻尼(两个极点),让它别太急躁;但阻尼太多就没力气了,于是你加一个“助推器”(ESR 零点),在它快撑不住时,轻轻推一把,让它顺利收尾。
若系统只有两个极点,且没有零点补偿:相位下降太快,可能在增益交叉频率处 < -135°;PM 太小(< 30°),系统容易振荡、不稳定。
加入 ESR 零点后:在交叉频率处“拉一把”相位,PM 提升到安全范围(> 45°);即使有较大负载变化,也保持稳定。
用现实电源系统拟定
100 dB 放大器 模拟 LDO 的开环增益
补偿极点在 100 Hz 系统带宽入口(如频率补偿网络)
输出极点 负载 + 电容慢下来
ESR 零点 电容 ESR 触发提前响应
开搞:
幅频响应(上图)
红色虚线 = 增益交叉频率 :系统增益刚好为 0 dB 处
从低频约 100 dB 开始,以两次 -20 dB/dec 滚降(后续变为 -40 dB/dec)
零点位于高频区,会在更高频率处将滚降变缓
相位响应(下图)
在增益交叉频率处的相位距离 -180° 还剩 相位裕度 PM
图中标注箭头指示位置,表示系统离不稳定还有多远
当前系统 PM 约为 49.6°(自动计算) 这里就回有人问了,怼怼是不是算错了,上面是写的80多啊!
满足 PM > 45° 的稳定性要求 → 响应无振铃
若无 ESR 零点,PM 会下降,甚至低于 20° → 引发振荡
图中问题 是不是算错了?
只能说,好学生,好学生。
其实问题本质:我们到底是在哪个频率处测的相位裕度?
相位裕度(PM, Phase Margin)必须在“增益为 0 dB 的频率处”测量。
正确计算方式(标准定义):
:增益交叉频率(gain crossover frequency)
:该频率下的系统相位(通常是负数)
你看到的图为什么写的是 84.8°?
那其实是图中曲线最大相位值或高频极限值(零点贡献),不是在增益交叉点的相位。
换句话说:
当前交叉频率处的相位 ≈ -130.4° , 是 PM 计算依据
相位裕度 PM = 180° + (-130.4°) ≈ 49.6° 正确的 PM
图中 84.8° 零点贡献的高频相位上限 不能作为 PM
红色虚线:
表示 增益交叉频率(Gain Crossover Frequency):系统增益刚好为 0 dB 的频率点;
是 相位裕度 PM 的测量基准点;
蓝色箭头标注:
在交叉频率处读取系统的相位(例如 ≈ -130.4°);
相位裕度 PM = 180° + 相位值 ≈ 49.6°,这是真正衡量系统稳定性的指标。
绿色虚线:
表示系统在高频时的相位极限(≈ 84.8°),是由 零点贡献的提前角度;它不是 PM,只是说明系统最多能“补回来”这么多相位。
PM 是稳定性关键指标,必须在增益为 0 dB 的频率处测量;
不要被高频相位极限值混淆,它只是极限,不是测量点。
基本判断:这颗 LDO 是否需要考虑极点/零点补偿?
是的,但设计者一般只需选合适的输出电容 + ESR 范围,内部补偿已经设计得很好;但你若挂载外部 RC 滤波器,或追求高阶稳定性分析,就需要结合它的数据手册推模型。
文档提到:
输出电容:推荐使用 1 μF 至 10 μF 低 ESR 陶瓷电容来稳定输出。
并在表格中列出典型使用为 2.2 μF、4.7 μF,说明它是基于内部补偿设计的 LDO,内部极点已设计好。
外部 COUT 用于形成第二极点;低 ESR 陶瓷电容不会提供 ESR 零点,所以稳定性由内部 compensation 提供;若使用高 ESR(如钽电容)则可能引入“非设计的零点”,要重新考虑 PM。
PSRR 曲线显示:带宽约为 100 kHz ~ 200 kHz 范围开始下降
内部环路补偿极点 在 10 kHz 左右;电源抑制能力下降的频段与补偿网络/环路带宽直接相关;这间接说明“增益交叉频率”也在这个范围,PM 稍低也容易振铃。
页码“应用笔记部分”中有测试波形,如:
稳态输出波动(无振铃);这些说明 ADP7142 在 2.2~10 μF 陶瓷电容下,已经具备足够的相位裕度(如 > 45°),ESR 补偿非必须,但加外部滤波网络时仍需重新建模。
如果我想自己计算呢?咋办,可以按照这些步骤来:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
想在 LDO 输出后串接一个 RC 滤波器,用于抑制工频噪声(如 50/60 Hz),这是常见于模拟前端(如 ADC 参考、模拟传感器供电)中用于进一步降噪的结构。
LDO 输出 →————┬———> ADC / 模拟电路
|
[R_filter]
|
[C_filter]
|
GND
希望:抑制工频(50 Hz / 60 Hz)以下的交流干扰;不破坏系统稳定性(不能引入太低频的新极点导致 PM 下降);让 LDO 输出平稳供电
按照我的步骤来看看:
|
|
|
|
|---|---|---|
| 选择截止频率 |
|
|
| 计算 RC 值 |
|
|
| 注意极点位置 |
|
|
| 合并建模 |
|
|
| 仿真或计算 PM |
|
|
如果 RC 滤波器的极点靠得太近 LDO 本身的环路带宽(例如 LDO 交叉频率 10 kHz,RC 极点在 300 Hz),就会把系统“拖慢”,让环路在增益交叉处滞后严重 → 相位裕度下降 → 可能振荡!
如何建模它的影响(Python 构建)
你可以在之前系统传递函数的基础上,再加一项:
其中:
蓝色:原始系统(无 RC 滤波器)
相位裕度 PM ≈ 84.8°
系统稳定,响应快速
相位最低值仍远离 -180°,有充足的相位缓冲
橙色:加了 RC 滤波器(5 Hz 截止频率)
相位裕度 PM ≈ -28.3°
增益尚未降到 0 dB,系统相位已穿过 -180°,说明系统不稳定
会引发严重振荡或不收敛响应
为什么 RC 滤波器反而害了系统?
虽然 RC 滤波器成功屏蔽了 50/60 Hz 噪声,但它引入了一个超低频极点(5 Hz)
这个极点拖慢了整个系统,使原本相位衰减发生得更早;所以系统在交叉频率点时相位已经掉到了危险位置以下。
所以看到了吧,啧,本身超低噪音的LDO就搞滤波器了,后面都炸了。
可以将 RC 滤波器移到 LDO 输出之后且脱离环路反馈(典型设计) 这样不影响 PM。
把 RC 滤波器移到ADC 前端 VREF/VIN 输入端 ,也起滤波作用但不干扰控制环,这样是常见的。
若必须串联 RC,应将其极点设计远低于交叉频率(<1 Hz) 降低影响但电容值巨大。
说到底,不如买个好LDO使唤。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 定义系统参数
A0 = 1e5 # 开环增益
tau_1 = 1 / (2 * np.pi * 100) # 极点1 @100 Hz
tau_2 = 1 / (2 * np.pi * 10e3) # 极点2 @10 kHz
tau_z = 1 / (2 * np.pi * 100e3) # 零点 @100 kHz
# 构造传递函数
num = [A0 * tau_z, A0]
den = np.polymul([tau_1, 1], [tau_2, 1])
system = signal.TransferFunction(num, den)
# 频率范围
frequencies = np.logspace(1, 7, 1000)
w = 2 * np.pi * frequencies

# 计算 Bode 响应
w, mag, phase = signal.bode(system, w)
mag_array = np.array(mag)
# 查找增益交叉频率和相位裕度
cross_idx = np.where(np.diff(np.sign(mag_array)))[0]
if len(cross_idx) > 0:
idx = cross_idx[0]
f_gc = frequencies[idx]
pm = 180 + phase[idx]
else:
f_gc = None
pm = None
# 获取高频相位极限值
high_freq_phase = phase[-1]
# 绘图
plt.figure(figsize=(10, 8))
# 幅频图
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, mag, label='增益')
if f_gc:
plt.axvline(f_gc, color='red', linestyle='--', label=f'增益交叉频率 ≈ {f_gc:.1f} Hz')
plt.axhline(0, color='gray', linestyle=':')
plt.title('系统频率响应与相位裕度标注(PM ≠ 高频相位)')
plt.ylabel('增益 (dB)')
plt.grid(True, which='both', linestyle=':')
plt.legend()
# 相位图
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase, label='相位')
if f_gc:
plt.axvline(f_gc, color='red', linestyle='--')
plt.axhline(-180, color='gray', linestyle=':')
plt.annotate(f'PM ≈ {pm:.1f}°n(在 {f_gc:.1f} Hz)', xy=(f_gc, phase[idx]),
textcoords='offset points', xytext=(-80, -10),
arrowprops=dict(arrowstyle='->', color='blue'),
fontsize=10, color='blue')
# 标注高频相位极限值(零点带来的相位提前)
plt.axhline(high_freq_phase, color='green', linestyle=':', label=f'高频相位极限 ≈ {high_freq_phase:.1f}°')
plt.annotate(f'高频极限 ≈ {high_freq_phase:.1f}°',
xy=(frequencies[-100], high_freq_phase),
textcoords='offset points', xytext=(0, 10),
color='green', fontsize=9)
plt.xlabel('频率 (Hz)')
plt.ylabel('相位 (degrees)')
plt.grid(True, which='both', linestyle=':')
plt.legend()
plt.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 基础系统参数
A0 = 1e5 # 开环增益
tau_1 = 1 / (2 * np.pi * 100) # 补偿极点 @ 100 Hz
tau_2 = 1 / (2 * np.pi * 10e3) # 输出极点 @ 10 kHz
tau_z = 1 / (2 * np.pi * 100e3) # ESR 零点 @ 100 kHz
# 新加入的 RC 滤波器极点 @ 5 Hz(R = 10kΩ, C = 3.3µF)
tau_3 = 1 / (2 * np.pi * 5) # RC 滤波极点
# 不加 RC 滤波器的传递函数
num_orig = [A0 * tau_z, A0]
den_orig = np.polymul([tau_1, 1], [tau_2, 1])
system_orig = signal.TransferFunction(num_orig, den_orig)
# 加 RC 滤波器的传递函数
den_with_rc = np.polymul(den_orig, [tau_3, 1])
system_with_rc = signal.TransferFunction(num_orig, den_with_rc)
# 频率范围
frequencies = np.logspace(0.5, 7, 1000)
w = 2 * np.pi * frequencies
# 计算 Bode 响应
_, mag_orig, phase_orig = signal.bode(system_orig, w)
_, mag_rc, phase_rc = signal.bode(system_with_rc, w)
# 查找 PM
def find_pm(mag, phase, freq):
idx = np.where(np.diff(np.sign(mag)))[0]
if len(idx) > 0:
i = idx[0]
f_gc = freq[i]
pm = 180 + phase[i]
return f_gc, pm
return None, None
f_gc_orig, pm_orig = find_pm(mag_orig, phase_orig, frequencies)
f_gc_rc, pm_rc = find_pm(mag_rc, phase_rc, frequencies)
# 绘图
plt.figure(figsize=(10, 8))
# 幅频图
plt.subplot(2, 1, 1)
plt.semilogx(frequencies, mag_orig, label='原始系统')
plt.semilogx(frequencies, mag_rc, label='加 RC 滤波器')
plt.axhline(0, color='gray', linestyle=':')
plt.title('加 RC 滤波器前后系统频率响应对比')
plt.ylabel('增益 (dB)')
plt.grid(True, which='both', linestyle=':')
plt.legend()
# 相频图
plt.subplot(2, 1, 2)
plt.semilogx(frequencies, phase_orig, label=f'原始 PM ≈ {pm_orig:.1f}°')
plt.semilogx(frequencies, phase_rc, label=f'加 RC 滤波器后 PM ≈ {pm_rc:.1f}°')
plt.axhline(-180, color='gray', linestyle=':')
plt.xlabel('频率 (Hz)')
plt.ylabel('相位 (degrees)')
plt.grid(True, which='both', linestyle=':')
plt.legend()
plt.tight_layout()
plt.show()
https://www./media/cn/technical-documentation/data-sheets/adp7142_cn.pdf