FPGA通过IO 接受风扇FG信号,并输出25MHz PWM信号控制风扇定转速。
参考:
详解FPGA的串口通讯(UART) | FPGA 开发圈 (eetrend.com)
PID控制器模块
输入为目标值、实际测量值(FG信号),输入为控制信号。
module pid_controller (
input wire clk,
input wire rst,
input wire [31:0] setpoint, // 目标转速
input wire [31:0] measured, // 实际转速
output reg [31:0] control_signal // 控制信号输出 (占空比)
);
// PID 参数 (定点数表示)
parameter signed [31:0] Kp = 32'd327680; // 5.0 (定点数表示:327680 = 5.0 << 16)
parameter signed [31:0] Ki = 32'd1310; // 0.02 (定点数表示:1310 = 0.02 << 16)
parameter signed [31:0] Kd = 32'd6554; // 0.1 (定点数表示:6554 = 0.1 << 16)
reg signed [31:0] error;
reg signed [31:0] integral;
reg signed [31:0] derivative;
reg signed [31:0] previous_error;
always @(posedge clk or posedge rst) begin
if (rst) begin
integral <= 32'd0;
previous_error <= 32'd0;
control_signal <= 32'd0;
end else begin
// 计算误差
error <= setpoint - measured;
// 积分项
integral <= integral + error;
// 微分项
derivative <= error - previous_error;
// PID 输出控制信号
control_signal <= (Kp * error + Ki * integral + Kd * derivative) >>> 16;
// 保存当前误差用于下次计算微分项
previous_error <= error;
end
end
endmodule
PMW生成模块
输入为占空比,输出PWM