FPGA 板上 Simulink 与 ModelSim 联合仿真 Buck 闭环设计及调试
概述
主电路使用 Simulink 搭建,控制电路完全由 Verilog 语言实现(包括 DPWM, PI 补偿器)。适用于验证基于 FPGA 的电力电子变换器控制。由于控制回路完全由 Verilog 语言编写,仿真验证通过后可直接下载进 FPGA 板子,极大缩短了开发数字电源的研发周期。
Buck 变换器指标
- 额定输入电压 (Vin): 20V
- 最大输入电压 (Vin_max): 25V
- 最小输入电压 (Vin_min): 15V
- 输出电压 (Vo): >10V
- 开关频率 (fs): 50kHz
- 输出功率 (Po): 100W
- 最小占空比 (Dmin): 0.1
- 额定占空比 (D): 0.5
- 最大占空比 (Dmax): 0.6
- 额定输出电流 (Io): 10A
主电路搭建
在 Simulink 中搭建 Buck 三件套:输入电容、MOS 管开关桥臂、LC 滤波网络。注意开关管的驱动信号需接上死区发生器,模拟实际硬件中的非理想开关。使用 Transport Delay 模块模拟驱动信号的传播延时,参数按 FPGA 实际时钟周期计算:
% 死区时间计算(假设 FPGA 时钟 50MHz)
deadtime = 3*(1/50e6); % 3 个时钟周期
set_param('buck_model/MOS_driver','DelayTime',num2str(deadtime));
控制回路设计
DPWM 模块
DPWM 模块是数字控制的核心,采用寄存器渐近式生成法,比直接计数器方案精度高。关键代码如下:
module DPWM (
input clk,
input [15:0] duty,
output reg pwm
);
reg [15:0] acc_reg;
always @(posedge clk) begin
acc_reg <= acc_reg[15:0] + duty;
pwm <= (acc_reg < duty); // 妙用溢出特性
end
endmodule
该代码实现了Σ-Δ调制的 16 位精度 PWM。原理是通过累加器溢出自动生成等效占空比,每次累加 duty 值,当累加器超过最大值时自动归零,同时输出高电平。实测谐波特性比传统计数器方案低 12dB。
PI 补偿器
采用抗饱和积分法。注意 q 格式定点数处理,直接上代码:
reg signed [17:0] integral; // Q3.15 格式
always @(posedge clk) begin
if(!sat_flag) begin
integral <= integral + (error * Ki) >>> 8;
end
output <= (error * Kp) + integral[17:2];
end
用右移替代除法,既省资源又防溢出。积分项单独用 18 位寄存器,最后取高 16 位输出,相当于自动做了精度保持。遇到输出限幅时通过 sat_flag 锁定积分器,完美解决积分饱和问题。
联合仿真配置
在 Simulink 里配置 HDL Cosimulation 模块,设置好 ModelSim 的执行路径。重点是将仿真步长设为开关周期的 1/10 以下,一般设为 200ns。仿真启动时会自动唤醒 ModelSim,实现两个软件互相传数据。
调试建议
调试时建议先断开电压环,单独测试 DPWM 波形。曾遇到占空比到 0.6 就上不去的问题,检查发现是 Verilog 里 duty 寄存器位宽不够,超过最大值自动回零。务必在 testbench 里加边界值测试:
initial begin
duty = 16'h6666; // 0.6 对应 Q16 值
#100ms;
duty = 16'h0000;
#100ms;
$stop;
end
实测结果
按此流程跑下来,从仿真到 FPGA 实测的电压调整率误差能控制在 0.8% 以内。关键是数字控制部分完全复用仿真代码,不用重新验证。实测波形显示,输入电压在 15-25V 跳变时,输出电压纹波始终小于 50mV,动态响应时间仅 3 个开关周期。



