4. 平均电流模式控制Buck变换器
任务定义
本案例针对连续导通模式(CCM)下的Buck变换器,设计平均电流模式控制器。控制器包含电压外环与平均电流内环:电压环输出作为电流环参考,电流环通过补偿网络调节占空比,使电感电流平均值跟踪该参考。最终通过仿真验证负载突变时输出电压的动态响应与稳态精度。
被控对象与设计规格
Buck变换器参数:输入电压 Vin=24V,输出电压 Vo=12V,电感 L=150μH,输出电容 C=470μF(含ESR 50mΩ),开关频率 fsw=100kHz,额定负载 R=2.4Ω(5A)。设计目标:负载在5A与2.5A之间阶跃突变时,输出电压超调量<5%,恢复时间<1ms。
控制器结构
采用双环控制结构,如图1所示。电压外环采用PI补偿器,其输出作为平均电流参考 iref。电流内环采用PI补偿器,对电感电流平均值 iL 与 iref 的误差进行调节,输出占空比 d。电流环带宽设计为开关频率的1/10(10kHz),电压环带宽设计为电流环的1/5(2kHz),保证环路稳定性。
图1 平均电流模式控制Buck变换器双环控制结构
补偿器设计
电流内环被控对象为电感电流对占空比的传递函数 Gid(s)=Vin/(sL),在CCM下近似为一阶积分环节。设计电流PI补偿器:
Gi(s) = Kpi + Kii/s,Kpi=0.5,Kii=2π×10k×0.5≈31416
电压外环被控对象为输出电容与负载并联阻抗乘以电流环闭环增益。设计电压PI补偿器:
Gv(s) = Kpv + Kiv/s,Kpv=0.2,Kiv=2π×2k×0.2≈2513
仿真实现(Python + PLECS/Simulink替代方案)
以下提供基于Python的离散化仿真代码,采用双线性变换将连续PI离散化,步长1μs,模拟PWM调制与开关平均模型。该代码完整实现双环控制算法,可直接运行并输出负载突变响应波形。
import numpy as np
import matplotlib.pyplot as plt
# Buck参数
Vin = 24.0; L = 150e-6; C = 470e-6; ESR = 0.05
fs = 100e3; Ts = 1/fs; dt = 1e-6 # 仿真步长1us
sim_time = 5e-3; n_steps = int(sim_time/dt)
# 控制器参数(连续域PI,双线性变换离散化)
# 电流环: Kpi=0.5, Kii=31416
Kpi = 0.5; Kii = 31416.0
# 电压环: Kpv=0.2, Kiv=2513.0
Kpv = 0.2; Kiv = 2513.0
# 双线性变换系数 (T=Ts)
def bilinear_pi(Kp, Ki, T):
a0 = Kp + Ki*T/2
a1 = -Kp + Ki*T/2
b1 = -1.0
return a0, a1, b1
a0_i, a1_i, b1_i = bilinear_pi(Kpi, Kii, Ts)
a0_v, a1_v, b1_v = bilinear_pi(Kpv, Kiv, Ts)
# 状态变量
Vo = 12.0; iL = 5.0; d = 0.5
err_i_prev = 0.0; out_i_prev = 0.0
err_v_prev = 0.0; out_v_prev = 0.0
Vref = 12.0
# 负载突变: 0-2ms 5A, 2-3.5ms 2.5A, 3.5-5ms 5A
def load_resistance(t):
if 2e-3 <= t < 3.5e-3:
return 4.8 # 2.5A
else:
return 2.4 # 5A
# 数据记录
time_arr = np.arange(0, sim_time, dt)
Vo_arr = np.zeros_like(time_arr)
iL_arr = np.zeros_like(time_arr)
d_arr = np.zeros_like(time_arr)
# 仿真主循环(开关平均模型)
for idx, t in enumerate(time_arr):
R_load = load_resistance(t)
Io = Vo / R_load
# 电压环PI(离散化)
err_v = Vref - Vo
out_v = out_v_prev + a0_v*err_v + a1_v*err_v_prev
iref = np.clip(out_v, 0.1, 10.0) # 限幅
# 电流环PI(离散化)
err_i = iref - iL
out_i = out_i_prev + a0_i*err_i + a1_i*err_i_prev
d = np.clip(out_i, 0.0, 0.95) # 占空比限幅
# 更新状态(电感电流、电容电压——平均模型)
VL = d*Vin - Vo
diL_dt = VL / L
iL_new = iL + diL_dt * dt
# 电容电流 = 电感电流 - 负载电流
ic = iL - Io
# 考虑ESR: Vo = Vc + ESR*ic, dVc/dt = ic/C
# 简化: 使用前向欧拉
dVc_dt = ic / C
Vc_new = Vo + dVc_dt * dt # 近似(忽略ESR动态)
Vo_new = Vc_new + ESR * (iL_new - Io)
# 更新状态
iL = iL_new; Vo = Vo_new
# 保存历史误差与输出
err_v_prev = err_v; out_v_prev = out_v
err_i_prev = err_i; out_i_prev = out_i
# 记录
Vo_arr[idx] = Vo
iL_arr[idx] = iL
d_arr[idx] = d
# 绘图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6), sharex=True)
ax1.plot(time_arr*1e3, Vo_arr, linewidth=1.2, color='#1971c2')
ax1.set_ylabel('输出电压 (V)'); ax1.grid(True, alpha=0.3)
ax1.axhline(12.0, color='gray', linestyle='--', linewidth=0.8)
ax1.set_ylim(11.0, 13.0)
ax2.plot(time_arr*1e3, iL_arr, linewidth=1.2, color='#e8590c')
ax2.set_ylabel('电感电流 (A)'); ax2.set_xlabel('时间 (ms)')
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('avg_current_mode_buck.png', dpi=150)
print("仿真完成,波形已保存为 avg_current_mode_buck.png")
运行与验证
运行方式:将上述代码保存为 avg_current_mode_buck.py,在已安装NumPy和Matplotlib的Python环境中执行 python avg_current_mode_buck.py。
验证方法:观察生成的波形图,检查以下判定标准:
- 稳态时输出电压稳定在12V±0.1V范围内;
- 在t=2ms负载由5A降至2.5A时,输出电压超调量小于5%(即不超过12.6V或低于11.4V);
- 在t=3.5ms负载由2.5A恢复至5A时,输出电压跌落不超过5%;
- 每次负载突变后,输出电压在1ms内恢复到12V±0.1V的稳态窗口。
预期输出:根据控制器参数设计,电压环带宽2kHz、电流环带宽10kHz,负载突变时输出电压动态偏移应小于0.5V,恢复时间约0.3~0.5ms。具体波形形状取决于离散化精度与限幅效果,以实际运行生成的图像为准。