2. CCM 平均电流控制 PFC 的电流环设计

任务目标

在 CCM 平均电流控制 PFC 中,电流环需要让电感电流跟踪整流后的正弦参考。本案例用最小可复现的 Python 脚本完成三件事:建立电流环小信号模型、设计 PI 补偿网络、用 Bode 图验证相位裕度与跟踪误差。

模型与设计思路

CCM 下电流环被控对象近似为 Gid(s) = Vin / (s·L),其中 Vin 为整流后瞬时电压,L 为升压电感。控制器采用 PI:C(s) = Kp + Ki/s。设计时把穿越频率 fc 设在开关频率的 1/10 附近,再用相位裕度 PM ≥ 45° 约束 Kp 与 Ki 的比例。

关键关系:在 fc 处 |C·Gid| = 1,且 PI 零点放在 fc/5 附近以抬升相位。下面脚本直接求解 Kp、Ki,并绘制 Bode 图与正弦跟踪误差。

正弦参考 Iref PI 补偿器 C(s)=Kp+Ki/s 被控对象 Gid=Vin/(sL) 电感电流 IL 反馈回路:采样 IL 与 Iref 比较

完整代码

import numpy as np
import matplotlib.pyplot as plt

# 电路参数
Vin_rms = 220.0
L = 1e-3
fsw = 65e3
fc = fsw / 10          # 目标穿越频率 6.5 kHz
PM_target = 45.0       # 相位裕度下限

# 被控对象 Gid(s) = Vin/(sL),用 Vin 峰值近似最坏情况
Vin_pk = Vin_rms * np.sqrt(2)
def Gid(s):
    return Vin_pk / (s * L)

# PI 设计:零点放在 fc/5,使 fc 处相位抬升
fz = fc / 5.0
wz = 2 * np.pi * fz
wc = 2 * np.pi * fc

# 在 fc 处 |C(jwc)*Gid(jwc)| = 1 求解 Kp
# C(jw) = Kp*(1 + wz/(jw)) = Kp*(jw+wz)/(jw)
s = 1j * wc
C_unit = (s + wz) / s          # 单位 Kp 的补偿器
Kp = 1.0 / abs(C_unit * Gid(s))
Ki = Kp * wz

print(f"Kp = {Kp:.4f}, Ki = {Ki:.2f}")

def C(s):
    return Kp + Ki / s

def loop(s):
    return C(s) * Gid(s)

# Bode 扫描
f = np.logspace(1, 5, 2000)
w = 2 * np.pi * f
H = loop(1j * w)
mag_db = 20 * np.log10(np.abs(H))
phase_deg = np.degrees(np.unwrap(np.angle(H)))

# 找穿越频率与相位裕度
idx = np.argmin(np.abs(mag_db))
fc_meas = f[idx]
PM_meas = 180 + phase_deg[idx]
print(f"穿越频率 = {fc_meas:.1f} Hz, 相位裕度 = {PM_meas:.1f} deg")

# 正弦跟踪验证:50 Hz 参考,检查稳态误差
t = np.linspace(0, 0.1, 5000)
w0 = 2 * np.pi * 50
Iref = np.sin(w0 * t)
# 闭环传递 T = C*Gid/(1+C*Gid),用频域响应近似稳态跟踪
T = loop(1j * w0) / (1 + loop(1j * w0))
IL = np.abs(T) * np.sin(w0 * t + np.angle(T))
err = Iref - IL
print(f"50Hz 跟踪幅值误差 = {abs(1-np.abs(T)):.4f}, 相位误差 = {np.degrees(np.angle(T)):.2f} deg")

fig, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
ax[0].semilogx(f, mag_db)
ax[0].axvline(fc_meas, color='r', ls='--')
ax[0].set_ylabel('Magnitude (dB)')
ax[0].grid(True, which='both')
ax[1].semilogx(f, phase_deg)
ax[1].axvline(fc_meas, color='r', ls='--')
ax[1].axhline(-180 + PM_target, color='g', ls=':')
ax[1].set_ylabel('Phase (deg)')
ax[1].set_xlabel('Frequency (Hz)')
ax[1].grid(True, which='both')
plt.tight_layout()
plt.savefig('current_loop_bode.png', dpi=120)
print("Bode 图已保存为 current_loop_bode.png")

运行方式

pip install numpy matplotlib
python current_loop_design.py

验证方法与通过条件

  • 脚本打印的 PM_meas 应 ≥ 45°,说明相位裕度满足要求。
  • fc_meas 应接近设定的 6.5 kHz,偏差在 ±20% 内可接受。
  • 50 Hz 跟踪幅值误差应小于 0.05,相位误差绝对值应小于 5°,表明输入电流能跟踪正弦参考。
  • 生成的 current_loop_bode.png 中,幅频曲线在穿越频率处斜率为 -20 dB/dec,相频曲线在穿越频率处高于 -135°。

若相位裕度不足,可减小 fz(把零点往低频移)或降低 fc;若跟踪误差偏大,可适当提高 Kp 并同步调整 Ki 保持零点位置。