PID算法原理及基本实现

在自动控制中,PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。

1PID算法基本原理

PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现PID算法是完成自动控制系统的基本要求。这一算法虽然简单,但真正要实现好,却也需要下一定功夫。首先我们从PID算法最基本的原理开始分析和设计这一经典命题。

PID算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下:

根据上图我们考虑在某个特定的时刻t,此时输入量为rin(t),输出量为rout(t),于是偏差就可计算为err(t)=rin(t)-rout(t)。于是PID的基本控制规律就可以表示为如下公式:

其中Kp为比例带,TI为积分时间,TD为微分时间。PID控制的基本原理就是如此。

2PID算法的离散化

上一节简单介绍了PID算法的基本原理,但要在计算机上实现就必须将其离散化,接下来我们就说一说PID算法的离散化问题。在实现离散化之前,我们需要对比例、积分、微分的特性做一个简单的说明。

比例就是用来对系统的偏差进行反应,所以只要存在偏差,比例就会起作用。积分主要是用来消除静差,所谓静差就是指系统稳定后输入输出之间依然存在的差值,而积分就是通过偏差的累计来抵消系统的静差。而微分则是对偏差的变化趋势做出反应,根据偏差的变化趋势实现超前调节,提高反应速度。

在实现离散前,我们假设系统采样周期为T。假设我们检查第K个采样周期,很显然系统进行第K次采样。此时的偏差可以表示为err(K)=rin(K)-rout(K),那么积分就可以表示为:err(K)+ err(K+1)+┈┈,而微分就可以表示为:(err(K)- err(K-1))/T。于是我们可以将第K次采样时,PID算法的离线形式表示为:

也可以记为:

这就是所谓的位置型PID算法的离散描述公式。我们知道还有一个增量型PID算法,那么接下来我们推到一下增量型PID算法的公式。上面的公式描述了第k个采样周期的结果,那么前一时刻也就是k-1个采样周期就不难表示为:

那么我们再来说第K个采样周期的增量,很显然就是U(k)-U(k-1)。于是我们用第k个采样周期公式减去第k-1个采样周期的公式,就得到了增量型PID算法的表示公式:

当然,增量型PID必须记得一点,就是在记住U(k)=U(k-1)+∆U(k)。

3PID控制器的基本实现

完成了离散化后,我们就可以来实现它了。已经用离散化的数据公式表示出来后,再进型计算机编程已经不是问题了。接下来我们就使用C语言分别针对位置型公式和增量型公式来具体实现。

1)位置型PID的简单实现

位置型PID的实现就是以前面的位置型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散位置型PID公式的计算机语言化。

首先定义PID对象的结构体:

 1 /*定义结构体和公用体*/2 3 typedef struct4 5 {6 7   float setpoint;       //设定值8 9   float proportiongain;     //比例系数
10
11   float integralgain;      //积分系数
12
13   float derivativegain;    //微分系数
14
15   float lasterror;     //前一拍偏差
16
17   float result; //输出值
18
19   float integral;//积分值
20
21 }PID;

接下来实现PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)2 3 {4 5   float thisError;6 7   thisError=vPID->setpoint-processValue;8 9   vPID->integral+=thisError;
10
11   vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
12
13   vPID->lasterror=thisError;
14
15 }

这就实现了一个最简单的位置型PID控制器,当然没有考虑任何干扰条件,仅仅只是对数学公式的计算机语言化。

2)增量型PID的简单实现

增量型PID的实现就是以前面的增量型公式为基础。这一节我们只是完成最简单的实现,也就是将前面的离散增量型PID公式的计算机语言化。

首先定义PID对象的结构体:

 1 /*定义结构体和公用体*/2 3 typedef struct4 5 {6 7   float setpoint;       //设定值8 9   float proportiongain;     //比例系数
10
11   float integralgain;      //积分系数
12
13   float derivativegain;    //微分系数
14
15   float lasterror;     //前一拍偏差
16
17   float preerror;     //前两拍偏差
18
19   float deadband;     //死区
20
21   float result; //输出值
22
23 }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;

dError=thisError-2*(vPID->lasterror)+vPID->preerror;

increment=vPID->proportiongainpError+vPID->integralgainiError+vPID->derivativegain*dError; //增量计算

vPID->preerror=vPID->lasterror; //存放偏差用于下次运算

vPID->lasterror=thisError;

vPID->result+=increment;

}

这就实现了一个最简单的增量型PID控制器,也没有考虑任何的干扰条件,仅仅只是对数学公式的计算机语言化。

4、基本特点

前面讲述并且实现了PID控制器,包括位置型PID控制器和增量型PID控制器。界限来我们对这两种类型的控制器的特点作一个简单的描述。

位置型PID控制器的基本特点:

  • 位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。
  • 位置型PID适用于执行机构不带积分部件的对象。
  • 位置型的输出直接对应对象的输出,对系统的影响比较大。

增量型PID控制器的基本特点:

  • 增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。
  • 增量型PID算法得出的是控制量的增量,对系统的影响相对较小。
  • 采用增量型PID算法易于实现手动到自动的无扰动切换。

PID算法原理及基本实现相关推荐

  1. PID控制器开发笔记之一:PID算法原理及基本实现

           在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于 ...

  2. 【转】PID算法原理 一图看懂PID的三个参数

    这是目前发现写的最好的了,原文作者DF创客社区virtualwiz 以下为原文: LZ以前有个小小的理想,就是让手边的MCU自己"思考"起来,写出真正带算法的程序. 前段时间做一个 ...

  3. PID算法原理,调整规律及代码

    文章转载出处:http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=30511&extra=page%3D1%26filter%3 ...

  4. PID算法原理及模板讲解

    很早都想写一栏关于PID算法的专栏,整个大学期间把谈恋爱的时间都拿来搞PID算法了(这样你们还不信我是真的搞PID的嘛..).为了学习PID算法买过平衡小车之家的平衡车(最后拆成玩具了),买过正点原子 ...

  5. 浅谈动态调节PID算法

    啥是PID? PID,就是"比例(proportional).积分(integral).微分(derivative)",是一种很常见的控制算法. PID已经有107年的历史了 它并 ...

  6. PID 算法参数及调节

    我学习PID参数意义,参考了以下文章: 一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制) PID算法原理 一图看懂PID的三个参数 PID算法实现及参数整定图解(附代码) https:/ ...

  7. 【转】[中级]我对『PID算法』的理解 —— 原理介绍

    http://www.dfrobot.com.cn/community/thread-14783-1-1.html本帖最后由 virtualwiz 于 2016-5-5 23:31 编辑 LZ以前有个 ...

  8. 控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)

    目录 一.控制系统 1.1控制系统的分类 1.2 性能指标 二.PID算法的起源及特点 三.PID应用 四.PID公式原理 五.PID源码 六.PID整定方法 6.1 经验法 6.2 衰减曲线法 6. ...

  9. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

  10. pid算法通俗解释,平衡车,倒立摆,适合不理解PID算法的人来看!

                        先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线 http://liuxinyu520zhuanshu.qzone.qq.c ...

最新文章

  1. 传感器为什么在低量程偏差大_传感器的静态特性
  2. Fashion-MNIST数据集发布一周年,论文引用量超250篇
  3. springMVC参数的传递方式(1.通过@PathVariabl获取路径参数,2.@ModelAttribute获取数据,3.HttpServletRequest取参,4@RequestParam)
  4. 团队行为心理学读书笔记(5)执行力背后的行为心理学
  5. 11个技巧让你编写出更好的Python代码,值得收藏!!
  6. abap-批量修改的对象类型
  7. Java基础-TreeSet与Java自定义类型的排序
  8. 路由器太远手机接收不到信号怎么办
  9. java 数字 下划线_数字文字中的下划线– Java 7功能
  10. linux中断处理体系结构
  11. 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法...
  12. 转载:用图片搜索图片的几个好网站
  13. 安装axios及其基础用法
  14. 将ipone项目转到ipad平台以及开发同时支持这两个平台的项目
  15. 运维工程师转行做什么?
  16. 几个简单规则改进你的SEO效果
  17. 从hr口中了解react的状态管理库(mobx, recoil), 立马过来学习之mobx
  18. lzw压缩 java_Java压缩之LZW算法字典压缩与解压讲解
  19. BlueTooth: 蓝牙Profile的概念和常见种类
  20. centos7连接外网详细教程

热门文章

  1. 华为云计算工程师_华为云计算工程师认证考试
  2. Web应用程序安全原理(Web服务面临的威胁)
  3. App隐私合规辅助检测工具
  4. Qt之QThread基本用法
  5. SIM卡高速PCB设计指南
  6. 斯坦福大学NLP课程CS224N课第一次作业第一部分
  7. 带你去看——WRC 2016 世界机器人博览会
  8. 自然语言处理发展的四大阶段
  9. 重装系统找不到固态_安装win10系统时无法识别固态硬盘怎么解决
  10. 模型预测控制的缺点_一个模型预测控制(MPC)的简单实现