1. Buck变换器开环仿真

Buck变换器开环仿真 学习卡片

任务说明

搭建一个Buck变换器开环仿真模型,输入电压Vin=24V,开关频率fsw=100kHz,电感L=330μH,电容C=470μF,负载电阻R=10Ω。通过改变PWM占空比D(分别取0.25、0.50、0.75),观察稳态输出电压波形,验证Buck电路基本关系Vout=D·Vin。

仿真模型实现

采用Python搭建Buck变换器的时域仿真模型。模型基于状态空间平均法,在每个开关周期内分别求解开关管导通(0≤t<DTsw)和关断(DTsw≤t<Tsw)两个子区间的电路微分方程,使用四阶Runge-Kutta法进行数值积分。仿真持续20ms(2000个开关周期),确保电路达到稳态后提取输出电压波形。

Buck变换器开环仿真模型 V_in 24V Q MOSFET D L 330μH C 470μF R 10Ω V_out PWM驱动 仿真参数 f_sw = 100kHz, T_sw = 10μs 仿真时长 = 20ms (2000周期) 扫描占空比 D = 0.25 / 0.50 / 0.75 V_out = D × V_in 预期稳态输出 D=0.25 → V_out ≈ 6.0V D=0.50 → V_out ≈ 12.0V D=0.75 → V_out ≈ 18.0V

Python仿真代码

import numpy as np
import matplotlib.pyplot as plt

# Buck变换器参数
V_in = 24.0        # 输入电压 (V)
L = 330e-6         # 电感 (H)
C = 470e-6         # 电容 (F)
R = 10.0           # 负载电阻 (Ω)
f_sw = 100e3       # 开关频率 (Hz)
T_sw = 1.0 / f_sw  # 开关周期 (s)

def buck_simulation(D, sim_time=20e-3, dt=1e-8):
    """Buck变换器开环时域仿真(状态空间平均法 + RK4)"""
    n_steps = int(sim_time / dt)
    t = np.zeros(n_steps)
    iL = np.zeros(n_steps)   # 电感电流
    vC = np.zeros(n_steps)   # 电容电压(输出电压)
    
    # 初始状态
    iL[0] = 0.0
    vC[0] = 0.0
    
    for k in range(n_steps - 1):
        t[k+1] = t[k] + dt
        phase = (t[k] % T_sw) / T_sw  # 当前周期内的相位 (0~1)
        sw_on = phase < D             # 开关管导通状态
        
        # 状态方程: dx/dt = A*x + B*V_in
        # 状态变量 x = [iL, vC]
        def f(x, sw):
            i, v = x
            if sw:  # 开关导通: V_in - L*di/dt - v = 0
                di_dt = (V_in - v) / L
            else:   # 开关关断: 二极管续流
                di_dt = -v / L
            dv_dt = (i - v / R) / C
            return np.array([di_dt, dv_dt])
        
        # RK4积分
        x = np.array([iL[k], vC[k]])
        k1 = f(x, sw_on)
        k2 = f(x + 0.5*dt*k1, sw_on)
        k3 = f(x + 0.5*dt*k2, sw_on)
        k4 = f(x + dt*k3, sw_on)
        x_next = x + (dt/6.0) * (k1 + 2*k2 + 2*k3 + k4)
        
        iL[k+1] = x_next[0]
        vC[k+1] = x_next[1]
    
    return t, vC, iL

# 扫描不同占空比
duty_cycles = [0.25, 0.50, 0.75]
results = {}

for D in duty_cycles:
    t, vC, iL = buck_simulation(D)
    results[D] = (t, vC, iL)
    # 计算稳态平均值(取最后5ms)
    steady_mask = t > 15e-3
    v_avg = np.mean(vC[steady_mask])
    print(f"D={D:.2f}: V_out(avg) = {v_avg:.3f} V, 理论值 = {D*V_in:.3f} V")

# 绘制输出电压波形
fig, axes = plt.subplots(3, 1, figsize=(10, 9), sharex=True)
for idx, D in enumerate(duty_cycles):
    t, vC, _ = results[D]
    ax = axes[idx]
    # 只显示最后2ms的稳态波形
    mask = t > 18e-3
    ax.plot(t[mask]*1e3, vC[mask], linewidth=1.2, color=f'C{idx}')
    ax.axhline(y=D*V_in, color='gray', linestyle='--', linewidth=0.8)
    ax.set_ylabel(f'D={D:.2f}\nV_out (V)')
    ax.set_ylim(0, 25)
    ax.grid(True, alpha=0.3)
    ax.text(19.8, D*V_in+0.8, f'{D*V_in:.1f}V', fontsize=9, ha='right')

axes[-1].set_xlabel('时间 (ms)')
axes[0].set_title('Buck变换器开环仿真 - 不同占空比下的输出电压波形')
plt.tight_layout()
plt.savefig('buck_openloop.png', dpi=150)
plt.show()

运行与验证

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

验证方法:程序会输出三个占空比对应的稳态平均电压,并生成输出电压波形图。判定标准:

  • D=0.25时,稳态输出电压约为6.0V(理论值6.0V);
  • D=0.50时,稳态输出电压约为12.0V(理论值12.0V);
  • D=0.75时,稳态输出电压约为18.0V(理论值18.0V);
  • 波形图中可见输出电压在稳态值附近有微小纹波(纹波幅值约数十毫伏量级),且随占空比增大,输出电压线性升高。

若三个占空比下的稳态电压与理论值偏差均在±0.1V以内,且波形无发散或明显振荡,则仿真模型正确,Buck变换器基本工作原理得到验证。