登录/注册

FPGA PID 代码

更多

以下是一个简单的 FPGA PID 控制器实现代码(Verilog HDL)。该代码实现了离散位置式 PID 控制算法,包含积分抗饱和和输出限幅功能:

module PID_Controller (
    input clk,             // 时钟信号 (50MHz)
    input rst_n,           // 复位信号 (低有效)
    input signed [15:0] setpoint,  // 16位设定值
    input signed [15:0] feedback,  // 16位反馈值
    output reg signed [15:0] output  // 16位控制输出
);

// PID 参数(使用 Q16.15 定点数格式)
parameter KP = 16'h2000;   // Kp = 2.0 (0x2000 = 8192/16384)
parameter KI = 16'h0800;   // Ki = 0.5 (0x0800 = 2048/16384)
parameter KD = 16'h0500;   // Kd = 1.25 (0x0500 = 1280/16384)

// 运算中间量(扩展位宽防止溢出)
reg signed [31:0] integral;  // 积分项
reg signed [15:0] prev_error; // 上次误差
reg signed [31:0] p_term, i_term, d_term; 

// 输出限幅参数
parameter OUT_MAX = 16'h7FFF;  // 最大输出值 (32767)
parameter OUT_MIN = 16'h8000;  // 最小输出值 (-32768)

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin  // 复位初始化
        integral <= 0;
        prev_error <= 0;
        output <= 0;
    end
    else begin
        // 计算误差
        wire signed [15:0] error = setpoint - feedback;

        // P项计算
        p_term = KP * error;  // 比例项

        // I项计算(带抗饱和)
        if (output < OUT_MAX && output > OUT_MIN) begin
            integral <= integral + (KI * error);
        end
        i_term = integral;  // 积分项

        // D项计算
        d_term = KD * (error - prev_error); // 微分项
        prev_error <= error;

        // PID求和(右移15位还原Q16.15)
        wire signed [31:0] pid_sum = p_term + i_term + d_term;
        wire signed [15:0] pid_out = pid_sum[30:15]; // 等效除以16384

        // 输出限幅
        output <= (pid_out > OUT_MAX) ? OUT_MAX : 
                  (pid_out < OUT_MIN) ? OUT_MIN : pid_out;
    end
end

endmodule

关键功能说明:

  1. 定点数运算

    • 使用 Q16.15 格式(16位整数 + 15位小数)
    • 最终输出通过截取[30:15]位实现右移15位(除以32768)
  2. 抗积分饱和

    if (output < OUT_MAX && output > OUT_MIN) begin
       integral <= integral + (KI * error);

    当输出未饱和时,才进行积分累加

  3. 微分环节

    d_term = KD * (error - prev_error); // 微分项
  4. 输出限幅

    output <= (pid_out > OUT_MAX) ? OUT_MAX : 
             (pid_out < OUT_MIN) ? OUT_MIN : pid_out;

使用注意事项:

  1. 参数整定

    • 需根据实际系统调整 KPKIKD 参数
    • 建议先用 MATLAB/Simulink 仿真验证参数
  2. 运算优化

    • 可根据需要添加饱和环节的积分复位(integral reset)
    • 微分项可增加一阶低通滤波减少高频噪声
  3. 时钟要求

    • 采样频率应为被控系统带宽的10倍以上
    • 例中使用50MHz时钟,实际频率需根据需求调整
  4. 接口扩展

    • 可增加参数在线调整接口
    • 可添加手动/自动切换功能

调参建议:

  1. 先设定 Ki=0, Kd=0,逐步增大 Kp 至临界震荡
  2. 取临界震荡时 Kp 的50%~80%作为基础值
  3. 逐渐加入积分项消除稳态误差
  4. 最后加入微分项抑制超调

实际应用中需结合具体控制对象特性调整算法细节。复杂系统建议加入变参数 PID 或模糊 PID 等高级算法增强鲁棒性。

PID算法的代码实现

PID算法的代码实现 舵机控制 在对舵机的控制中,我采用的是位置式PD算法。 将左右电感的偏差值赋给error,再代入公式进行解算,最后传给舵机输出子函数,控制舵机正确打角。 void

2023-11-28 15:57:39

PID控制算法代码 PID控制算法的原理

算法的原理,然后带大家使用FPGA来实现(C语言实现过程特别简单)。 二. PID算法 PID取自比例、积分、微分三个英文字母的首字母。意味着算

2023-07-20 09:23:12

FPGA实现PID控制算法

相信大家对于PID控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及FOC中的闭环控制中也是用的它,它不仅简单,而且易于理解。那么本篇文章将简要介绍一下算法的原理,然后带大家使用FPGA

2023-05-19 16:40:23

PID算法原理、调试经验以及代码资料

PID算法原理、调试经验以及代码资料

资料下载 guangdongdgwyf 2021-11-21 10:25:33

PID算法原理、调试方法及源代码

PID算法原理、调试方法及源代码

资料下载 2833487006 2021-07-06 10:25:04

基于FPGAPID系统源码下载

基于FPGA的PID系统源码下载

资料下载 佚名 2021-06-09 10:44:39

PID算法原理_调试经验以及代码总结

PID算法原理_调试经验以及代码总结分享。

资料下载 姚小熊27 2021-05-25 15:59:46

角度单环与串级PID代码资料下载

电子发烧友网为你提供角度单环与串级PID伪代码资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户

资料下载 佚名 2021-03-30 08:46:22

EasyGo FPGA Solver

1970-01-01 08:00:00 至 1970-01-01 08:00:00

求大佬分享位置式PID代码

求大佬分享位置式PID代码

2022-01-21 07:48:52

增量PID的原理及代码

1、增量PID的原理、增量PID的最后公式2、增量PID的代码;3、st

2021-09-03 08:29:55

pid代码块执行的时间

直接来干货吧对于单片机来说 pid 是一个 每隔多长时间执行一次 的代码块 而这个时间通常就是积分时间我们令这个代码快这个

2021-09-03 07:51:10

PID算法的代码实现

目录一. 绪论二. 角度环串级PID原理1. PID基本算法2. 姿态角串级PID原理三. 如何用STM32实现角度-角速度的串级

2021-08-17 06:44:18

如何使用FPGA实现PID

FPGA PID控制精度。以下时代码和仿真结果。//PID.Vmodul

2020-12-14 15:08:28

请问我们可以使用生成的代码在Zynq 7020 FPGA上实现设计吗?

我使用SIMULINK中的系统生成器设计了我的PID控制器浮点。我们可以使用生成的代码在Zynq 7020 FPGA上实现设计吗?或者我们需要在

2019-09-03 10:14:00
7天热门专题 换一换
相关标签