常用算法———P I D控制算法(P I D三个参数的作用和两种P I D算法的代码实现)

news2024/12/22 9:34:37

如果有错误请及时指出,大家一起学习交流。

目录

一、PID的概述

二、PID三个参数的控制原理

1、P控制器

2、I控制器

3、D控制器

4、PID控制器

5、PID的数学公式

三、位置式PID和增量式PID的差别和代码实现

1、位置式PID和增量式PID的差别

2、位置式PID        

3、增量式PID


一、PID的概述

        将采集的实际值与给定的目标值进行比较,对产生的偏差用比例、积分和微分进行控制的控制系统,简称PID(Proportional Integral Derivative)控制系统,也是大学里面用得较多的算法之一,比如做一些匀速行驶的小车或者是一些恒温系统都能见到PID的身影。

        比例(P)控制能迅速反应误差,从而减小稳态误差。但是并不能消除稳态误差。比例放大系数的加大.会引起系统的不稳定

        积分(I)控制器的作用是只要系统有偏差存在,积分控制器就会不断地积累偏差,输出控制量,以消除偏差。也就是说,只要有足够的时间,积分控制器就能完全消除误差,使系统误差为零,从而消除稳态误差。但是积分项太强会使系统出现超调加大,或者使系统出现振荡

        微分(D)控制器可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度.减小调整时间,从而改善系统的动态性能。

根据不同的被控对象的控制特性,又可以分为P、PI、PD、PID等不同的控制模型。

二、PID三个参数的控制原理

首先说明一下用到的参数含义以及一些原理

target:目标值,也就是小车需要达到的目标速度值。

practical:实际值,也就是小车当前行驶的实际速度。

error:偏差值,也就是目标值 - 实际值(error = target - practical)。

        设当前有一个测试温度的系统,到达规定时间 t 就返回一个当前的实际温度值T(x),即可得到集合{T(x1),T(x2),T(x3)......T(n-1),T(xn)},来分别表示返回来的温度值。

1、P控制器

        由error = target - T(x) 可以得到温度的偏差值,即目标温度值 - 实际温度值,

得,当 error > 0时:表示目标值大于实际值,即当前控制未达到预期要求。  

       当error  = 0时:表示目标值等于实际值,即当前控制刚好达到预期要求

       当error  < 0时:表示目标值小于实际值,即当前控制超过预期要求

P控制器是通过error来输出信号的 ,即输出公式为

        Pout = Kp * error

        也就是输出信号和和当前的偏差值成正比关系。Kp为比例系数,当Kp > 0时,输出为正,此时为一个放大器,当Kp < 0时,输出为负,此时为一个衰减器,Kp = 0时,输出为0,此时的系统已经脱离了控制,也就是说P控制器是一个始终有偏差的控制器,有偏差才控制,没有偏差就不关我的事,输出为0就好。

2、I控制器

        由上面P控制器得到实际温度 T(x) 的集合{T(x1),T(x2),T(x3)......T(x-1),T(xn)},以及设置的目标温度值 target 可得当前所有偏差的集合{Error(x1),Error(x2),Error(x3)......Error(n-1),Error(xn)},(Error = target - T(x) )

设偏差和用SumError表示

SumError = Error(x1) + Error(x2) + Error(x3) + ...... + Error(n-1) + Error(xn)

        当SumError > 0 时,整体的偏差大于0,说明在过去的一段时间里大部分参数是没有达标的。

        当SumError = 0 时,整体的偏差等于0,说明在过去的一段时间里控制效果是达到了标准的。

        当SumError < 0 时,整体的偏差小于0,说明在过去的一段时间里大部分参数是超过目标值的。

I控制器公式:

        Iout = Kp * SumError

        也就是说积分控制器的输出和总的偏差值是成正比关系的。Iout 为积分控制器的输出,Ki为比例系数,SumError为偏差和。

        如果大部分参数没达标,那积分控制器就会输出一个正值,来增强输出,即SumError 是大于0 的,如果大部分参数都超过目标值,那么积分控制器会输出负值,来削弱输出,即SumError是小于0的。

        积分控制器就是需要看以前一段时间的总偏差值,当前是否合适都没关系,它是看以前怎么样。

3、D控制器

        和 I 控制器一样,实际温度 T(x) 的集合{T(x1),T(x2),T(x3)......T(x-1),T(xn)},由设置的目标温度值 target 可得当前所有偏差的集合{Error(x1),Error(x2),Error(x3)......Error(n-1),Error(xn)}。

        设当前偏差为Error(n),前一时刻偏差为 Error(n -1),设偏差的差值用 ErrorSubtract 表示

        则 ErrorSubtract = Error(n) - Error(n-1),ErrorSubtract的值是表示两个时刻偏差的变化趋势。

        当 ErrorSubtract > 0 时,也是当前偏差比上一次的偏差还要大,系统会越来越偏离目标值

        当 ErrorSubtract = 0 时,也就是当前偏差和上一次偏差相等,系统没有变化。

        当 ErrorSubtract < 0 时,也就是当前偏差比上一次偏差要小,偏差有变小的趋势,系统会越来越接近目标值。

D控制器公式:

        Dout = Kp * ErrorSubtract , 即D控制器的输出是和偏差的差成正比关系。

4、PID控制器

        PID控制器就是将三个控制器加起来就得到PID控制器,即PIDout = Pout + Iout + Dout

即可得到 PID 的数学公式

        PID out = Kp * (error + SumError + ErrorSubtract) + out

其中 out 是为了不让系统失控,也就是为了不让系统输出为 0 。

SumError 和 ErrorSubtract 的整理

(1)SumError

        SumError = \frac{1}{Ti} * T * \sum Error(xn)

Ti表示积分时间常数,也指积分项的运行时间T表示计算周期,也就是更新PID的时间,Ti越大输出越小。

(2)ErrorSubtract

        ErrorSubtract = Td * \frac{Error(n) - Error(n-1)}{T}

Td表示微分时间常数,也指微分的运行时间T表示计算周期,也就是多久更新计算一下PID。

5、PID的数学公式

有上面可的PID的数学公式为

        PIDout = Kp [error + (\frac{1}{Ti }*T*\sum error(xn)) + (Td * \frac{error(n)-error(n-1)}{T})]

其中:PIDout 为控制系统的输出值,error(t)为偏差信号,Kp 为比例项系数,Ki = Kp * (1 / Ti) * T  为积分项系数,Kd = Kp * Td * 1/T  为微分项系数。

根据上述公式可写出如下代码

float  Error,lastError,                           //本次偏差,上次偏差
float  IntegralError,DifferentialError,           //偏差的积分,偏差的微分
float  ProportionOut,IntegralOut,DifferentialOut, //比例项输出,积分项输出,微分项输出
float  T,Ti,Td,                                   //控制周期,积分时间常数,微分时间常数
float  PidOut;                                    //PID最终输出
float  Kp,Ki,Kd;                                  //比例项系数,积分项系数,微分项系数

int PID_Controller(float Target,float practical)
{
	Ki = Kp * T * (1/Ti);                         //积分项系数
	Kd = Kp * Td * (1/T);                         //微分项系数
	
	Error 			    = Target - practical;	  //偏差
	IntegralError 		= IntegralError + Error;  //偏差的积分
	DifferentialError 	= Error - lastError;	  //偏差的微分
	
	ProportionOut 		= Kp * Error;			  //比例项输出 = Kp * 偏差
	IntegralOut 		= Ki * IntegralError;	  //积分项输出 = Ki * 偏差的积分
	DifferentialOut 	= Kd * DifferentialError; //微分项输出 = Kd * 偏差的微分
	
	PidOut = ProportionOut + IntegralOut + DifferentialOut; //三个项相加
	
	return PidOut;                                //返回PID计算值
}

三、位置式PID和增量式PID的差别和代码实现

1、位置式PID和增量式PID的差别

        这两种PID算法最大的差别就是位置式PID的输出与整个过去的状态都是有关的,用到了误差的累加值,也就是用到了积分运算,而增量式PID的输出只与当前误差以及前两次的误差有关,和以前的误差无关,没有积分的作用。

2、位置式PID        

公式如下:

 PID_{out}(k) = K_{_{}_{p}}e(k) + K_{i}\sum_{i = 0}^{k}e(i) + K_{d}[e(k) - e(k-1)]

 比例项e(k):偏差,即目标值 - 实际值。 

 积分项∑e(i):偏差的累加。

微分项e(k) - e(k-1):偏差的差,即这次偏差 - 上一次偏差。

即当前系统的实际位置,与你想要达到的目标位置的偏差,来进行PID计算控制。

        有积分 ∑e(i)的加入,偏差会一直累加,也就是当前的输出与过去的所有状态都有关系,用到了偏差的累加值,位置式PID在积分项达到饱和时误差依然会继续累积,一旦误差开始反向变化,系统则需要一定的时间从饱和区中退出,所以在输出达到最大值或最小值时,要停止积分的作用,并且要有积分限幅输出限幅的加入在使用位置式PID时,一般直接使用PD控制,而避免了积分项的影响,位置式 PID 适用于执行机构不带积分部件的对象,如舵机和平衡小车的直立和温控系统的控制。

参考代码如下:

float  Error,lastError,                           //本次偏差,上次偏差
float  IntegralError,DifferentialError,           //偏差的积分,偏差的微分
float  ProportionOut,IntegralOut,DifferentialOut, //比例项输出,积分项输出,微分项输出
float  PidOut;                                    //PID最终输出
float  Kp,Ki,Kd;                                  //比例项系数,积分项系数,微分项系数

int PID_Controller(float Target,float practical)
{
	
	Error 			    = Target - practical;	  //偏差
	IntegralError 		= IntegralError + Error;  //偏差的积分
	DifferentialError 	= Error - lastError;	  //偏差的微分
	
	ProportionOut 		= Kp * Error;			 
	IntegralOut 		= Ki * IntegralError;	  
	DifferentialOut 	= Kd * DifferentialError; 
	
	PidOut = ProportionOut + IntegralOut + DifferentialOut; //三个项相加
	
	return PidOut;                                //返回PID计算值
}

3、增量式PID

公式如下:

\Delta u(k) = u(k) - u(k -1) =K_{p}[e(k) - e(k-1)] + K_{i}e(k) + K_{d}[e(k) - 2e(k-1)+ e(k-2)]

比例项e(k)-e(k-1):偏差的差,即当前偏差 - 上次偏差

积分项e(i):偏差 

微分项e(k) - 2e(k-1)+e(k-2):当前这次的偏差  -  2倍上次偏差 + 上上次的偏差

        由增量式PID的公式可以看出,如果确定了 Kp、Ki  、Kd的值,再使用计算的三次的偏差, 即可求出输出量。

        增量式PID得出的输出量是对应的近几次的偏差增量,而不是对应与实际位置的偏差,并没有误差的累加,也就是说增量式PID是取的增量,并不需要累积误差,输出只与近3次的采样值有关,减少控制量。

参考代码如下:

float    LastError = 0;                        //Error[-1]
float    PrevError = 0;                        //Error[-2]
double   Proportion;                           //比例常数 Proportional Const
double   Integral;                             //积分常数 Integral Const
double   Derivative;                           //微分常数 Derivative Const

int PID_Calc(int NextPoint,int SetPoint) 
{
    float Error,Outpid;                         
	iError = SetPoint - NextPoint;             //偏差计算
	Outpid = (Proportion * Error)              //E[k]
		        -(Integral * LastError)        //E[k-1]
				+(Derivative * PrevError);     //E[k-2]	
	PrevError = LastError;                     //存储误差
	LastError = Error;
	return Outpid;                             //返回输出
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(附源码)计算机毕业设计SSM竞赛报名管理系统

&#xff08;附源码&#xff09;计算机毕业设计SSM竞赛报名管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

mindspore实现自定义CNN图像分类模型

一、数据集定义 使用mindspore.dataset中的ImageFolderDataset接口加载图像分类数据集&#xff0c;ImageFolderDataset接口传入数据集文件上层目录&#xff0c;每个子目录分别放入不同类别的图像。使用python定义一个create_dataset函数用于创建数据集&#xff0c;在函数中使用…

[C++基础]-初识模板

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、泛型编…

【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1&#xff09;实验平台&#xff1a;正点原子MiniPro H750开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id677017430560 3&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-336836-1-1.html 4&#xff…

deepwalknode2vec 代码实战

提示&#xff1a;笔记内容来自于B站up主同济子豪兄 文章目录1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入&#xff1f;2.2. deepwalk的步骤1、生成graph&#xff1b;2、利用random walk生成多个路径&#xff1b;3、训练表示向量的学习&#xff1b;4、为了解决分类个数过…

航拍遥感数据集

一、Roundabout Aerial Images for Vehicle Detection 本数据集是从无人机拍摄的西班牙环形交叉口航空图像数据集&#xff0c;使用PASCAL VOC XML文件进行注释&#xff0c;指出车辆在其中的位置。此外&#xff0c;还附带一个CSV文件&#xff0c;其中包含与捕获的环形交叉口的位…

深度学习 神经网络(2)前向传播

深度学习 神经网络&#xff08;2&#xff09;前向传播一、前言二、神经网络结构三、前向传播四、参考资料一、前言 前面介绍了《感知器》&#xff0c;类似于单个神经元细胞&#xff0c;现在我们用多个感知器组合成更加复杂的神经网络。本文介绍了多层神经网络通过前向传播方法…

超市营业额数据分析

文章目录1&#xff1a;查看单日交易额最小的3天的交易数据&#xff0c;并查看这3天是周几1.1&#xff1a;导入模块1.2&#xff1a;数据处理1.3&#xff1a;输出结果完整代码2&#xff1a;把所有员工的工号前面增加一位数字&#xff0c;增加的数字和原工号最后一位相同&#xff…

FBAR滤波器的工作原理及制备方法

近年来&#xff0c;随着无线通信技术朝着高频率和高速度方向迅猛发展&#xff0c;以及电子元器件朝着微型化和低功耗的方向发展&#xff0c;基于薄膜体声波谐振器&#xff08;Film Bulk Acoustic Resonator&#xff0c;FBAR&#xff09;的滤波器的研究与开发越来越受到人们的关…

酒楼拓客营销流程,酒楼宣传推广方案

随著网络时代的发展&#xff0c;许多行业受到了大大的冲击&#xff0c;其中也涵盖酒楼&#xff0c;在目前的情况下&#xff0c;对于酒楼来说&#xff0c;无论是互联网还是线下&#xff0c;引流都是最重要的。那么酒楼如何做好营销推广工作&#xff0c;从而提升业绩&#xff1f;…

乘风而起!企业级应用软件市场迅猛发展,有哪些机会可以把握?

数字化转型战略的深入&#xff0c;使我国企业级软件市场得到了迅速的发展&#xff0c;据统计&#xff0c;2021年我国企业级应用软件市场规模超过了600亿元&#xff0c;其中商业智能&#xff08;BI&#xff09;市场规模超过了50亿元。 得益于中国企业对于数据系统的本地化部署需…

Hadoop3 - MapReduce DB 操作

一、MapReduce DB 操作 对于本专栏的前面几篇文章的操作&#xff0c;基本都是读取本地或 HDFS 中的文件&#xff0c;如果有的数据是存在 DB 中的我们要怎么处理呢&#xff1f; Hadoop 为我们提供了 DBInputFormat 和 DBOutputFormat 两个类。顾名思义 DBInputFormat 负责从数…

MODBUS通信浮点数存储解析常用算法

MODBUS通信相关的基础知识,各种PLC通信程序的写法。可以参看专栏的其它文章这里不赘述。MODBUS通信时,数据帧都是以字节为单位发送和接收的,接收到的字节,如何存放和解析。就需要我们具备数据处理类的知识了,这里需要大家简单了解下有关数据结构的基础知识,这方面比较薄弱…

AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

文章目录前言一、树状数组1.1、树状数组知识点1.2、树状数组代码模板模板题&#xff1a;AcWing 1264. 动态求连续区间和例题例题1、AcWing 1265. 数星星【中等&#xff0c;信息学奥赛一本通】习题习题1&#xff1a;1215. 小朋友排队【中等&#xff0c;蓝桥杯】二、 线段树知识点…

27.5 Java集合之Set学习(基本概念,存储原理,性能测试)

文章目录1.Set接口1.1 Set的特性是什么&#xff1f;2.具体实现2.1 HashSet2.1.1 存储原理2.1.2 性能测试2.2 TreeSet2.2.1 存储原理2.2.2 性能测试2.3 EnumSet&#xff08;了解即可&#xff09;2.3.1 存储原理2.4 LinkedHashSet2.4.1 存储原理2.4.2 性能测试2.4.3 代码地址1.Se…

【Gitee】上传本地项目到 Gitee 仓库(入门篇)

本文主要介绍上传本地项目到 Gitee 仓库的过程&#xff0c;可以说是一个比较傻瓜的教材吧&#xff0c;从0开始&#xff0c;祝大家都能一次成功~~~ 一、前期准备 1. 配置 Gitte 创建 Gitte 账号&#xff0c;绑定好邮箱&#xff0c;并创建一个空仓库 。创建账号绑定邮箱过程这部…

【信号检测】基于小波变换的信号趋势检测和分离研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

双十一好物推荐:2022年好用的数码好物分享

一年一度的双十一尽在眼前&#xff0c;因为双十一的优惠力度是一年中最大的一次&#xff0c;所以许多人都想着直接一年屯一次&#xff0c;一次屯一年的理念&#xff0c;那么作为资深剁手党的我来说&#xff0c;对比于选购双十一好物来说我还是比较有心得的&#xff0c;下面让我…

机器视觉之工业摄像机知识点(一)

本文主要记录一些基础的工业摄像机的一些简要知识点。我也是根据我觉得比较重要的来记录。作为一位算法工程师&#xff0c;其实是有两条路来走&#xff0c;即技术专家以及技术经理。这两个实际是不同的职业方向。如果你不擅于与外部沟通交流&#xff0c;并且具备非常强的科研和…

基于OpenHarmony的ArkUI框架进阶对于高性能容器类和持久化和原子化的运用

文章目录高性能容器类Badge原子化服务代码简析表达式持久化高性能容器类 顾名思义&#xff0c;容器类是一个存储类&#xff0c;用于存储各种数据类型的元素&#xff0c;并提供一系列处理数据元素的方法。ArkUI开发框架提供了两种类型的容器类&#xff0c;线性和非线性。这些容…