PID控制器开发笔记之四:梯形积分PID控制器的实现
从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算。但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度。
1、梯形积分基本思路
在PID控制其中,积分项的作用是消除余差,为了尽量减小余差,应提高积分项的运算精度。在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度。其计算公式为:
于是如果在位置型PID算法中引入梯形积分则可以修改计算公式如下:
同样要在增量型PID算法中引入梯形积分则可以修改计算公式如下:
2、算法实现
从微积分的角度来说,当微分分到无限小时,矩形积分与梯形积分是没有区别的。但事实上我们的采样时间不可能无限小,而且也不可能是连续的,那么采样周期越大,那么矩形近似于实际曲线间的偏差就越大,而梯形积分则可以更加接近实际曲线,所以采用梯形积分代替矩形积分就可以得到更高的精度。
(1)位置型PID算法实现
位置型PID的实现在前面就已经完成,所不同的是前面使用的是矩形积分,在这一节我们将举行积分部分改为梯形积分,同样首先定义PID对象的结构体:
/*定义结构体和公用体*/ typedef struct { float setpoint; //设定值 float proportiongain; //比例系数 float integralgain; //积分系数 float derivativegain; //微分系数 float lasterror; //前一拍偏差 float result; //输出值 float integral;//积分值 }PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue) { float thisError; thisError=vPID->setpoint-processValue; vPID->integral+=(thisError+ vPID-> lasterror)/; vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror); vPID->lasterror=thisError; }
从上述实现我们不难看出,变化仅仅只是在做积分累计vPID->integral时,将累计量按梯形方式累计。
(2)增量型PID算法实现
同样的增量型PID的梯形积分实现也就是即将积分部分有矩形积分部分换成梯形积分即可。首先定义PID对象的结构体:
/*定义结构体和公用体*/ typedef struct { float setpoint; //设定值 float proportiongain; //比例系数 float integralgain; //积分系数 float derivativegain; //微分系数 float lasterror; //前一拍偏差 float preerror; //前两拍偏差 float deadband; //死区 float result; //输出值 }PID;
接下来实现PID控制器:
void PIDRegulation(PID *vPID, float processValue) { float thisError; float increment; float pError,dError,iError; thisError=vPID->setpoint-processValue; //得到偏差值 pError=thisError-vPID->lasterror; iError=(thisError+ vPID-> lasterror)/; dError=thisError-*(vPID->lasterror)+vPID->preerror; increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError; //增量计算 vPID->preerror=vPID->lasterror; //存放偏差用于下次运算 vPID->lasterror=thisError; vPID->result+=increment; }
3、总结
积分项的引入目的就是为了消除系统的余差,那么积分项的计算精度越高,对消除系统的余差就越有利。梯形积分相较于矩形积分其精度有比较大的提高,所以对消除余差也就越有效。
欢迎关注:
PID控制器开发笔记之四:梯形积分PID控制器的实现的更多相关文章
- PID控制器开发笔记(转)
源: PID控制器开发笔记
- PID控制器开发笔记之五:变积分PID控制器的实现
在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的.然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强.积分系数取大 ...
- PID控制器开发笔记之三:抗积分饱和PID控制器的实现
积分作用的引入是为了消除系统的静差,提高控制精度.但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能.抗积分饱和就是用以解决这一问题的方法之一.这一节我们就来实现抗积 ...
- PID控制器开发笔记之十二:模糊PID控制器的实现
在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题.模糊PID控制器是将模糊算法与PID控 ...
- PID控制器开发笔记之八:带死区的PID控制器的实现
在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...
- PID控制器开发笔记之十三:单神经元PID控制器的实现
神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...
- PID控制器开发笔记之十一:专家PID控制器的实现
前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部.再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是 ...
- PID控制器开发笔记之一:PID算法原理及基本实现
在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景. ...
- PID控制器开发笔记之十:步进式PID控制器的实现
对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定.为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法. 1.步进式PID的基本思想 所谓步进式PID ...
随机推荐
- C#--IEnumerable 与 IEnumerator 的区别
一. IEnumerator 解释:它是一个的集合访问器,使用foreach语句遍历集合或数组时,就是调用 Current.MoveNext()的结果. // 定义如下public interface ...
- luogu 1268 树的重量
打眼一看就是最小生成树嘛,但经过板子wa掉的经历后得知,,emmmm,原来是, 构造! (虽然不知是什么但觉得听起来很厉害的样子...手动微笑) n=2的情况 自然就是g(1,2) n=3的情况,由于 ...
- 深度学习 ——style reconstruction
多层神经网络的实质就是为了找出更复杂,更内在的features...图像的style, how to describe, impossible! 但是人眼却可以分辨. (参考论文 A Neural a ...
- ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
ubuntu16.04安装cuda8.0,tensorflow-gpu版本后,运行时报错: ImportError: libcudnn.so.5: cannot open shared object ...
- C# test
//测试对象集合序列化 public void jsonTest() { List<moduleEntity> list = new List<moduleEntity>(); ...
- Burp Suite Intruder中爆破模式介绍
Burp Suite Intruder中爆破模式介绍 - Introduction to Burst Mode in Burp Suite Intruder 1.sniper模式 使用单一的Payl ...
- win7, ubuntu双系统,重装win7后,修复引导
参考: http://blog.csdn.net/abcsunl/article/details/72875983 http://blog.csdn.net/davied9/article/detai ...
- git撤销中间的某次提交
这几天在开发一个新功能,应为着急上线,所以就把代码提交上去了,当现在有时间又要再改改,又要把我那次提交全部删掉,想重新再写,但是代码已经合了,而且还有其他同事的代码,我的提交在中间的某个部分,所以我想 ...
- python字典不区分大小写
from multidict import CIMultiDict dic=CIMultiDict() dic["key"]="1234" print(dic[ ...
- HTML5实现全屏
现在主流的浏览器都支持全屏,但是各家实现不一.下面是主流浏览器实现方法: // W3C 提议 element.requestFullscreen(); element.exitFullscreen() ...