4. 平均电流模式控制Boost变换器

任务定义

设计并实现一个数字控制平均电流模式Boost变换器的仿真模型。控制器采用平均电流模式控制策略:外环为电压环(PI),内环为平均电流环(PI),电流内环输出直接作为占空比指令。通过仿真验证稳态输出电压精度、负载阶跃响应以及输入电压扰动下的调节能力。

控制结构

平均电流模式控制Boost变换器结构如下:输出电压采样经分压后与参考电压比较,误差经电压环PI调节器产生平均电流参考值;电感电流采样与电流参考值比较,误差经电流环PI调节器输出占空比控制信号。电流环带宽通常设计为电压环的5~10倍,以保证内环快速跟踪外环指令。

Boost功率级 V_in → V_out L=100μH, C=470μF f_sw=100kHz 电压采样 H_v=0.01 电流采样 R_s=0.1Ω 电压环PI Kp_v=0.8 Ki_v=200 电流环PI Kp_c=0.5 Ki_c=1000 PWM调制 d∈[0, 0.9] 锯齿波比较 V_ref=5V V_out i_L i_ref d PWM驱动 平均电流模式控制Boost变换器 电压外环 → 电流内环 → PWM占空比

仿真模型实现

以下Python代码实现Boost变换器的平均电流模式控制仿真。模型采用状态空间平均法描述功率级动态,控制器采用双环PI结构,以离散时间步进方式运行仿真。

import numpy as np
import matplotlib.pyplot as plt

# ========== Boost变换器参数 ==========
V_in = 12.0          # 输入电压 (V)
V_out_ref = 24.0     # 输出电压参考 (V)
L = 100e-6           # 电感 (H)
C = 470e-6           # 电容 (F)
R_load = 10.0        # 负载电阻 (Ω)
f_sw = 100e3         # 开关频率 (Hz)
T_s = 1 / f_sw       # 开关周期 (s)

# 采样与仿真参数
fs_sim = 10e6        # 仿真步长 (Hz) - 远高于开关频率
dt = 1 / fs_sim
sim_time = 0.05      # 仿真时长 (s)
n_steps = int(sim_time / dt)

# ========== 控制器参数 ==========
# 电压环PI (外环)
Kp_v = 0.8
Ki_v = 200.0
# 电流环PI (内环)
Kp_c = 0.5
Ki_c = 1000.0

# 采样增益
H_v = 0.01           # 电压采样分压比 (5V→0.05V? 实际V_out_ref*H_v=0.24)
H_i = 0.1            # 电流采样电阻 (Ω)

# 限幅
d_max = 0.9
d_min = 0.0
i_ref_max = 20.0     # 电流参考限幅 (A)

# ========== 状态初始化 ==========
v_out = V_in         # 输出电压初始值
i_L = 0.0            # 电感电流初始值
d = 0.5              # 初始占空比

# PI控制器状态
int_v = 0.0          # 电压环积分器
int_c = 0.0          # 电流环积分器

# 数据记录
time_axis = np.arange(0, sim_time, dt)
v_out_log = np.zeros(n_steps)
i_L_log = np.zeros(n_steps)
d_log = np.zeros(n_steps)
v_ref_log = np.zeros(n_steps)

# ========== 仿真主循环 ==========
for k in range(n_steps):
    t = k * dt
    
    # ---- 负载阶跃: 0.03s时从10Ω变为5Ω ----
    if t >= 0.03:
        R_load = 5.0
    
    # ---- 输入电压扰动: 0.04s时从12V变为10V ----
    if t >= 0.04:
        V_in = 10.0
    
    # ---- 电压外环 ----
    v_sense = v_out * H_v
    v_ref_sense = V_out_ref * H_v
    err_v = v_ref_sense - v_sense
    int_v += Ki_v * err_v * dt
    # 抗饱和限幅
    int_v = np.clip(int_v, -5, 5)
    i_ref = Kp_v * err_v + int_v
    i_ref = np.clip(i_ref, 0, i_ref_max)
    
    # ---- 电流内环 ----
    i_sense = i_L * H_i
    i_ref_sense = i_ref * H_i
    err_c = i_ref_sense - i_sense
    int_c += Ki_c * err_c * dt
    int_c = np.clip(int_c, -2, 2)
    d_control = Kp_c * err_c + int_c
    d = np.clip(d_control, d_min, d_max)
    
    # ---- Boost变换器状态方程 (连续时间平均模型) ----
    # di_L/dt = (V_in - (1-d)*v_out) / L
    di_L = (V_in - (1 - d) * v_out) / L
    # dv_out/dt = ((1-d)*i_L - v_out/R_load) / C
    dv_out = ((1 - d) * i_L - v_out / R_load) / C
    
    # 欧拉积分
    i_L += di_L * dt
    v_out += dv_out * dt
    
    # 防止非物理值
    i_L = max(i_L, 0)
    v_out = max(v_out, 0)
    
    # ---- 记录数据 ----
    v_out_log[k] = v_out
    i_L_log[k] = i_L
    d_log[k] = d
    v_ref_log[k] = V_out_ref

# ========== 结果绘图 ==========
fig, axes = plt.subplots(3, 1, figsize=(10, 8), sharex=True)

# 输出电压
axes[0].plot(time_axis, v_out_log, 'b-', linewidth=1.2, label='V_out')
axes[0].axhline(y=V_out_ref, color='r', linestyle='--', linewidth=1, label='V_ref=24V')
axes[0].set_ylabel('输出电压 (V)')
axes[0].legend(loc='upper right')
axes[0].grid(True, alpha=0.3)
axes[0].set_ylim(0, 35)

# 电感电流
axes[1].plot(time_axis, i_L_log, 'g-', linewidth=1.2)
axes[1].set_ylabel('电感电流 (A)')
axes[1].grid(True, alpha=0.3)

# 占空比
axes[2].plot(time_axis, d_log, 'm-', linewidth=1.2)
axes[2].set_ylabel('占空比 d')
axes[2].set_xlabel('时间 (s)')
axes[2].grid(True, alpha=0.3)
axes[2].set_ylim(0, 1)

plt.tight_layout()
plt.savefig('boost_avg_current_mode.png', dpi=150)
plt.show()

# ========== 稳态性能计算 ==========
# 取最后10ms数据计算稳态值
steady_start = int(0.045 / dt)
steady_data = v_out_log[steady_start:]
v_out_steady = np.mean(steady_data)
v_out_ripple = np.max(steady_data) - np.min(steady_data)
steady_error = (v_out_steady - V_out_ref) / V_out_ref * 100

print(f"稳态输出电压: {v_out_steady:.3f} V")
print(f"输出电压纹波: {v_out_ripple:.3f} V")
print(f"稳态误差: {steady_error:.3f} %")
print(f"稳态占空比: {np.mean(d_log[steady_start:]):.3f}")
print(f"理论占空比 (V_out/V_in): {V_out_ref/12:.3f}")

运行与验证

运行方式:将上述代码保存为 boost_avg_current_mode.py,在已安装NumPy和Matplotlib的Python环境中执行 python boost_avg_current_mode.py。

验证方法:

  1. 稳态精度验证:观察输出电压波形,在0.03s负载阶跃前应稳定在24V附近。程序输出的稳态误差应小于1%。
  2. 负载阶跃响应:0.03s时负载从10Ω变为5Ω(输出功率加倍),观察输出电压跌落幅度及恢复时间。恢复时间(输出电压回到±1%误差带)应小于5ms。
  3. 输入扰动抑制:0.04s时输入电压从12V降至10V,观察输出电压波动。电压跌落应小于0.5V,并在2ms内恢复。
  4. 电流内环跟踪:观察电感电流波形,其平均值应随负载变化而调整,且电流纹波应明显小于平均电流。

判定标准:仿真结束后,控制台输出的稳态误差值小于1%,且三个波形图显示输出电压在负载阶跃和输入扰动后均能恢复到24V±0.5V范围内,即判定控制算法实现正确。