FPGA实现PID控制算法(含仿真)

这篇具有很好参考价值的文章主要介绍了FPGA实现PID控制算法(含仿真)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 简介

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

二. PID算法

PID取自比例、积分、微分三个英文字母的首字母。意味着算法由这三部分组成。

1. P 比例

运算过程为 期望值 减去 当前值 ,然后再乘上一个p系数,就得到了一个反馈值。比例的作用主要是为了让 期望值 与 当前值相等

2. I 积分

将误差值不断累加,然后再乘上一个I系数,就得到了一个反馈值。 积分的作用主要是为了消去静态误差,但当前值接近 期望值的时候,这个时候,比例的作用就非常小了,可能会接近于0,而且相邻两次的误差值也近似为0,D微分也起不了多大作用,假如这时候系统外部的阻力和PD反馈值抵消了,这个时候就需要不断的累加这个误差值来使当前值等于期望值

3. D 微分

当前的误差值 减去 上一次运算的误差值,然后再乘上一个d系数,就得到了一个反馈值。微分的作用主要为了减少系统的震荡,在系统变化的方向上,施加一个反方向的反馈,使系统朝这个方向的变化得到抑制

可以到,PID算法主要涉及到三种运算: 加法,减法和乘法。这三种运行在FPGA上也是很容易实现的。

三. FPGA实现

首先需要注意的是,PID的三个系数均为浮点数,为了便于实现,这里将浮点数扩大100倍,然后取整就可以了。然后将反馈的结果缩小100倍就可以了。

1. P 比例实现

实现代码如下,只需要两个时钟周期即可完成。这里通过左移来实现缩小100操作,实际上是缩小了102.倍,不太会影响结果。为了和 I 积分 和 D 微分 运算周期数相同,这里打了一拍操作。

//P -------------------------------------------------
always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kp_fb <= 1'b0;
    else if( pid_en == 1'b1)
        Kp_fb <= ( desired_value - current_value ) * Kp; 
    else
        Kp_fb <= Kp_fb;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kp_fb_reduce <= 'd0;
    else if( cal_delay_0 == 1'b1)
        Kp_fb_reduce <= (Kp_fb >>> 7) + (Kp_fb >>> 9); // /102.4
    else
        Kp_fb_reduce <= Kp_fb_reduce;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kp_fb_reduce_d0 <= 'd0;
    else if( cal_delay_1 == 1'b1)
        Kp_fb_reduce_d0 <= Kp_fb_reduce;
    else
        Kp_fb_reduce_d0 <= Kp_fb_reduce;

end
//----------------------------------------------------------------------------
2. I 积分实现

实现代码如下,比P比例稍微辅助一点。这里考虑到了一个积分限幅的问题,如果积分值一直累加的话得,可能会导致系统稳定不下来,所以这里设置为3000。

//I --------------------------------------------------------
always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Ki_integral <= 'd0;
    else if( pid_en == 1'b1)
        if( Ki_integral > $signed('d3000) && ( desired_value - current_value ) > $signed('d0) )
            Ki_integral <= Ki_integral;
        else if( Ki_integral < $signed(-'d3000) && ( desired_value - current_value ) < $signed('d0) )
            Ki_integral <= Ki_integral;
        else
            Ki_integral <= Ki_integral + ( desired_value - current_value );
    else
        Ki_integral <= Ki_integral;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0 )
        Ki_fb <= 'd0;
    else if( cal_delay_1 == 1'b1 )
        Ki_fb <= Ki_integral * Ki;
    else
        Ki_fb <= Ki_fb;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0 )
        Ki_fb_reduce <= 'd0;
    else if( cal_delay_2 == 1'b1)
        Ki_fb_reduce <= (Ki_fb >>> 7) + (Ki_fb >>> 9); // /102.4
    else
        Ki_fb_reduce <= Ki_fb_reduce;
end

//------------------------------------------------------------------------------
3. D微分 实现

D 微分操作实现如下,按照公式来即可

//D    ---------------------------
always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kd_error <= 'd0;
    else if( pid_en == 1'b1)
        Kd_error <= ( desired_value - current_value );
    else
        Kd_error <= Kd_error;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kd_fb <= 'd0;
    else if( cal_delay_0 == 1'b1)
        Kd_fb <= (Kd_error - Kd_last_error) * Kd;
    else
        Kd_fb <= Kd_fb;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kd_last_error <= 'd0;
    else if( cal_delay_0 == 1'b1)
        Kd_last_error <= Kd_error;
    else
        Kd_last_error <= Kd_last_error;
end

always@(posedge clk or negedge rst_n)
begin
    if( rst_n == 1'b0)
        Kd_fb_reduce <= 'd0;
    else if( cal_delay_1 == 1'b1)
        Kd_fb_reduce <= (Kd_fb >>> 7) + (Kd_fb >>> 9); // /102.4
    else
        Kd_fb_reduce <= Kd_fb_reduce;
end
//--------------------------------

四. 仿真验证

测试代码如下,初始化当前值为500,然后根据期望值和PID输出的反馈值,来调节当前值。

   always@(posedge clk or negedge rst_n) begin
        if( rst_n == 1'b0)
            current_value <= 'd500;
        else if( pid_ack == 1'b1)
            current_value <= current_value + out;
        else
            current_value <= current_value;
    end

PID_Control PID_Control_i(
    .clk            (   clk),
    .rst_n          (   rst_n),

   .pid_en          (   1'b1),
   .pid_ack         (   pid_ack),

    .desired_value  (   desired_value),
    .current_value  (   current_value),

    .Kp             (   'd10),
    .Ki             (   'd1),
    .Kd             (   'd10),
    
    .out            (   out)
);

仿真波形如下
FPGA实现PID控制算法(含仿真),FPGA,fpga开发,PID

这个是设置了D为0的情况,可以看到系统的震荡

FPGA实现PID控制算法(含仿真),FPGA,fpga开发,PID
欢迎━(`∀´)ノ亻!关注 微信公众号 FPGA之旅 相关资源会上传到上面。文章来源地址https://www.toymoban.com/news/detail-606733.html

到了这里,关于FPGA实现PID控制算法(含仿真)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA和Verilog实现的9层电梯控制器仿真设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628810 资源下载地址:https://download.csdn.net/download/sheziqiong/85628810 电梯最少可以往返于0—9层楼。 乘客要去的楼层数A可手动输入并显示,按取消键可清除本次输入。 可自动显示电梯运行的楼层数B 当AB时,电梯上升; 当AB时,

    2024年02月02日
    浏览(59)
  • 基于FPGA的PID控制器设计

    PID控制应该算是应用非常广泛的控制算法了。常见的比如控制环境温度,控制无人机飞行高度速度等。PID我们将其分成三个参数,如下: P-比例控制,基本作用就是控制对象以线性的方式增加,在一个常量比例下,动态输出,缺点是会产生一个稳态误差。 I-积分控制,基本作

    2024年02月03日
    浏览(48)
  • 【毕业设计】42基于FPGA的LCD1602控制器设计仿真与实现(原理图+仿真+源代码+论文)

    包含此题目毕业设计全套资料: 原理图工程文件 仿真工程文件 源代码 仿真截图 低重复率论文,字数:19964 基于altera 公司cyclone4代芯片的fpga以及quartusII软件设计一款屏幕显示系统,显示装置可以选择点阵或字符型液晶,最终实现滚动显示、可控制滚动方向、暂停、清屏等功能

    2024年02月04日
    浏览(79)
  • 基于FPGA的PID算法理论详解(1)

    比例-积分-微分(PID)控制是业内最常见的控制算法,在工业控制领域有很高的接受度。PID控制器的广泛应用得益于其在多种操作条件下稳定的性能,以及易操作的特性。工程师可以用简单直观的方式实现PID控制。PID控制有三个基本要件:比例(proportional)、积分(integral)、微分

    2024年02月13日
    浏览(31)
  • 毕业设计-基于 PID 控制算法仿真算法研究- Matlab

    目录 前言 课题背景和意义 实现技术思路 一、 基本原理  二、无超调 PID 控制器的设计 三、无超调 PID 设计的验证 代码 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。

    2024年02月06日
    浏览(32)
  • 基于FPGA的运动目标检测跟踪系统项目:从顶层架构设计到RTL编写与仿真,完整实现FPGA图像处理算法实现的项目流程。

    基于FPGA的运动目标检测跟踪系统项目 ,FPGA项目,FPGA图像处理 FPGA项目 采用帧间差分法作为核心算法,该项目涉及图像采集,颜色空间转换,帧间差分核心算法,腐蚀等形态学处理,目标定位,目标标识,图像显示等模块。 通过该项目可以学习到以下两方面内容 1.FPGA顶层架

    2024年04月16日
    浏览(50)
  • 浅谈BP神经网络PID控制算法及matlab仿真

    本文是对BP神经网络PID控制算法的数学描述及仿真实验,若有错误之处,欢迎指正! 老规矩不废话,直接上链接 BP神经网络维基百科 BP神经网络是人工神经网络中的一种常用结构,其由输入层(input)-隐含层(hidding)-输出层三层构成(output)。 上图中, B 1 B1 B 1 是输入层, B 2 B2 B

    2024年02月05日
    浏览(32)
  • PID横向控制和仿真实现

    PID是一种常见的控制算法,全称为Proportional-Integral-Derivative,即比例-积分-微分控制器。PID控制器是一种线性控制器,它将设定值与实际值进行比较,根据误差的大小,控制器会相应地调整系统的比例、积分和微分系数,以减小误差。 PID控制器的基本公式为: u ( t ) = K p ∗

    2024年02月01日
    浏览(26)
  • m基于PID控制算法的四旋翼无人机飞行控制simulink仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB   无人机采用常见的四旋翼无人飞行器,如图1所示。       PID 控制器,即控制器的控制方式为 P 比例调整, I 积分调整以及 D 微分调整三个部分构成, PID 控制器是目前为止应用最为广泛的控制方式。 PID 控制器具

    2023年04月22日
    浏览(55)
  • Matlab实现PID控制仿真(附上30个完整仿真源码+数据)

    本文介绍了如何使用Matlab实现PID控制器的仿真。首先,我们将简要介绍PID控制器的原理和控制算法。然后,我们将使用Matlab编写一个简单的PID控制器,并使用仿真环境来验证其性能。最后,我们将通过调整PID控制器的参数来优化控制系统的响应。 PID控制器是一种经典的控制算

    2024年02月07日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包