建模背景:为什么要研究 LDO + RC + ESR 补偿?

LDO 输出往往接一个大电容(Cout)来稳定电压,负载端还可能串一个滤波电阻(形成 RC)。这带来了新的极点,影响控制系统的稳定性:可能导致相位迟滞过多,甚至不稳定、振荡;我们可以利用电容的 ESR 创建一个“补偿零点”,弥补这一缺陷。

LDO 用过的一颗

极点:环路零点输出极点

极点1:模拟主环路放大器带宽限制

极点2:由负载电阻和输出电容构成

零点:输出电容的 ESR 引入的提前相位

这个模型就是意思一下,大概就是说,系统的闭环是有好几个东西在里面的,属于组合建模。

接下来我们组合成完整开环传递函数:

公式可以说明系统在不同频率下放大了多少,并且滞后了多少。

数学含义
电路中代表什么
直白解释
系统直流增益(很大)
放大器 / LDO 控制环路的增益
控制得有多“灵敏”
补偿极点时间常数
电容 C1 + 电阻 R1
加一个低频极点,把系统“拉慢”,防止太激进
输出极点时间常数
电容 C_out + 负载电阻 R_load
电容反应不过来,产生高频衰减
ESR 零点时间常数
电容 ESR × C_out
用“提前一拳”帮系统抵消后面的慢反应

系统本来有两个极点,会造成快速相位下降,可能导致不稳定。

所以我们:用 :放慢控制环路,避免太激进;用 :反映电容/负载的影响;加入 :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 触发提前响应

开搞:

没想到吧?
image-20250531120419879

幅频响应(上图)

红色虚线 = 增益交叉频率 :系统增益刚好为 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

image-20250531124144840

红色虚线:

表示 增益交叉频率(Gain Crossover Frequency):系统增益刚好为 0 dB 的频率点;

是 相位裕度 PM 的测量基准点

蓝色箭头标注:

在交叉频率处读取系统的相位(例如 ≈ -130.4°);

相位裕度 PM = 180° + 相位值 ≈ 49.6°,这是真正衡量系统稳定性的指标。

绿色虚线:

表示系统在高频时的相位极限(≈ 84.8°),是由 零点贡献的提前角度;它不是 PM,只是说明系统最多能“补回来”这么多相位。

PM 是稳定性关键指标,必须在增益为 0 dB 的频率处测量

不要被高频相位极限值混淆,它只是极限,不是测量点。

ADI 的 ADP7142(超低噪声、高 PSRR 的 LDO)

基本判断:这颗 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 补偿非必须,但加外部滤波网络时仍需重新建模

如果我想自己计算呢?咋办,可以按照这些步骤来:

步骤
方法
① 估算开环带宽
从 PSRR 图中读出带宽下降点
② 输出极点位置
③ 有无 ESR 零点
查电容数据表中的 ESR,计算 
④ 若接 RC 滤波器
模拟级联极点:
⑤ 建立完整系统传函
带多个极点/零点模型,如前所建
⑥ 计算 PM、单位阶跃响应
用 Python 分析

想在 LDO 输出后串接一个 RC 滤波器,用于抑制工频噪声(如 50/60 Hz),这是常见于模拟前端(如 ADC 参考、模拟传感器供电)中用于进一步降噪的结构。

LDO 输出 →————┬———> ADC / 模拟电路
               |
              [R_filter]
               |
              [C_filter]
               |
              GND

希望:抑制工频(50 Hz / 60 Hz)以下的交流干扰;不破坏系统稳定性(不能引入太低频的新极点导致 PM 下降);让 LDO 输出平稳供电

按照我的步骤来看看:

步骤
说明
建议值
选择截止频率

(常设 3~10 Hz)
5 Hz
计算 RC 值
例如:
注意极点位置

,引入新极点
要确保该极点远低于 LDO 的增益交叉频率
合并建模
原系统极点+ESR+新 RC 极点
变为三级系统:两个极点 + 一个 RC 极点 + ESR 零点(可选)
仿真或计算 PM
用 Python分析响应
看 PM 是否仍 > 45°

如果 RC 滤波器的极点靠得太近 LDO 本身的环路带宽(例如 LDO 交叉频率 10 kHz,RC 极点在 300 Hz),就会把系统“拖慢”,让环路在增益交叉处滞后严重 → 相位裕度下降 → 可能振荡!

如何建模它的影响(Python 构建)

你可以在之前系统传递函数的基础上,再加一项:

其中:

image-20250531130450636

蓝色:原始系统(无 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使唤。

哟哟哟,共模半导体来了!(以经典的GM1200为例)

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

给超低噪音的LDO再加一个RC滤波器合适吗?
# 计算 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