FPGA之旅

以FPGA为主导,分享一些FPGA知识,同时还会介绍51,32,arm linux编程语言,Qt等其他知识。

FPGA实现PID控制算法

0
阅读(1214)

一. 简介

  相信大家对于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 微分 运算周期数相同,这里打了一拍操作。

image.png

  代码片段:可切换语言,无法单独设置文字格式

  2. I 积分实现

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

image.png

3. D微分 实现

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

image.png

image.png

  代码片段:可切换语言,无法单独设置文字格式

  四. 仿真验证

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

image.png

  代码片段:可切换语言,无法单独设置文字格式

  仿真波形如下

image.png



原文链接:https://mp.weixin.qq.com/s/4v0v0PhoHnNBxi-qC3igqA

微信截图_20220708161426.png

电子技术应用专栏作家 FPGA之旅


Baidu
map