PID控制器笔记(附上简单的demo)

PID控制器简介

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。

PID是比例、积分、微分的缩写,将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。
PID算法控制原理

PID调节器的优点

  1. 技术成熟
  2. 易被人们熟悉和掌握
  3. 不需要建立数学模型
  4. 控制效果好

PID调节器的类型

  1. 比例调节器
  2. 比例积分调节器
  3. 比例微分调节器
  4. 比例积分微分调节器

比例调节器

比例调节器的原理

比例调节器的微分方程为:

y=KPe(t)
式中:y为调节器输出;Kp为比例系数; e(t)为调节器输入偏差。

由上式可以看出,调节器的输出与输入偏差成正比。因此,只要偏差出现,就能及时地产生与之成比例的调节作用,具有调节及时的特点。

比例调节器的特性曲线

阶跃响应特性曲线

比例积分调节器

比例积分调节器的原理

所谓积分作用是指调节器的输出与输入偏差的积分成比例的作用。
积分方程为:

在这里插入图片描述
式中:TI是积分时间常数,它表示积分速度的大小,TI越大,积分速度越慢,积分作用越弱。

积分作用的响应特性曲线

积分作用响应曲线

PI调节器

若将比例和积分两种作用结合起来,就构成PI调节器,调节规律为:在这里插入图片描述

PI调节器的输出特性曲线

PI调节器的输出特性曲线

比例微分调节器

比例微分调节器的原理

微分调节器的微分方程为:

在这里插入图片描述

微分作用响应曲线

微分作用响应曲线

PD调节器的阶跃响应曲线

PD调节器的阶跃响应曲线

比例积分微分调节器

为了进一步改善调节品质,往往把比例、积分、微分三种作用组合起来,形成PID调节器。理想的PID微分方程为:
在这里插入图片描述

PID调节器对阶跃响应特性曲线

PID调节器对阶跃响应特性曲线

模拟PID控制原理

原理图

在这里插入图片描述
该系统由模拟PID 控制器和被控对象组成。
图中,r(t)是给定值,y(t)是系统的实际输出值,给定值与实际输出值构成控制偏差e(t),有 e(t) = r(t)-y(t)
e(t)作为PID 控制器的输入,u(t)作为PID 控制器的输出和被控对象的输入。

所以模拟PID控制器的控制规律为:
在这里插入图片描述

其中:
u(t)——调节器的输出信号;
e(t)——调节器的偏差信号,它等于给定值与测量值之差
KP——比例系数
T I ——积分时间
T D ——微分时间
u 0 ——控制常量
KP /T I ——积分系数
KP / T D ——微分系数

控制过程

比例环节

比例环节的作用是对偏差瞬间做出快速反应。
偏差一旦产生,控制器立即产生控制作用,使控制量向减少偏差的方向变化。控制作用的强弱取决于比例系数KP, KP越大,控制越强,但过大的KP会导致系统震荡,破坏系统的稳定性。

积分环节

积分环节的作用是把偏差的积累作为输出。
只要有偏差存在,积分环节的输出就会不断增大。直到偏差e(t)=0,输出的u(t)才可能维持在某一常量,使系统在给定值r(t)不变的条件下趋于稳态。
积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数TI 越大,积分的积累作用越弱。增大积分常数T I 会减慢静态误差的消除过程,但可以减少超调量,提高系统的稳定性。所以,必须根据实际控制的具体要求来确定TI

微分环节

微分环节的作用是阻止偏差的变化。
它是根据偏差的变化趋势(变化速度)进行控制。偏差变化得越快,微分控制器的输出越大,并能在偏差值变大之前进行修正。微分作用的引入,将有助于减小超调量,克服震荡,使系统趋于稳定。但微分的作用对输入信号的噪声很敏感,对那些噪声大的系统一般不用微分,或在微分起作用之前先对输入信号进行滤波。适当地选择微分常数TD ,可以使微分的作用达到最优。

PID控制算式的数字化

在这里插入图片描述
由于计算机的出现,计算机进入了控制领域。人们将模拟PID 控制规律引入到计算机中来。由于计算机控制是一种采样控制,它只能根据采样许可的偏差计算控制量,而不能象模拟控制那样连续输出控制量,进行连续控制。由于这一特点,公式中的积分和微分项不能直接使用,必须进行离散化处理。离散化处理的方法为:以T 作为采样周期,k 作为采样序号,则离散采样时间kT 对应着连续时间 t,用求和的形式代替积分,用增量的形式代替微分,可作如下近似变换:
在这里插入图片描述
上式中,为了表示方便,将类似于e(kT)简化成 ek 形式就可以得到离散的PID 表达式:
在这里插入图片描述
或写成
在这里插入图片描述

式中:
k ——采样信号,k=0,1,2,…
u k ——第k 次采样时刻的计算机输出值
e k ——第k 次采样时刻输入的偏差值
e ~k −1~ ——第k-1 次采样时刻输入的偏差值
K I ——积分系数(积分时间TI即为累积多少次/个T)
KD ——微分系数
u 0 ——开始进行PID 控制时的原始初值(应为前一次的给定值)
如果采样周期取得足够小,则以上近似计算可获得足够精确的结果,离散控制过程与连续控制过程十分接近。

在编程时,可写成:
u(k) = P *e(k) + I *[e(k)+e(k-1)+…+e(0)]+ D *[e(k)-e(k-1)]

P-----增大P可提高响应速度,减小静态误差,但太大会增大超调量和稳定 时间。
I-----与P的作用基本相似,但要使静态误差为0,必须使用积分。
D-----与P,I的作用相反,主要是为了减小超调,减小稳定时间。
e(k)--------------------------本次误差
e(k)+e(k-1)+…+e(0)------所有误差之和
e(k)-e(k-1)------------------控制器输出与输入误差信号的微分(即误差的变化率),具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。

增量式PID 控制算法

如果只需要计算控制量的增量Δuk ,可以使用增量式PID 控制算法。由式
在这里插入图片描述
可得控制器在第 k-1 个采样时刻的输出值为:
在这里插入图片描述
将两式相减,就可以得到增量式PID 控制算法公式为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
式中 在这里插入图片描述
由上式可以看出,如果计算机控制系统采用恒定的采样周期T,一旦确定了A、B、C,只要用前后3次测量值的偏差,就可以求出控制增量。
在这里插入图片描述
在许多控制系统中,执行机构需要的是控制变量的绝对值而不是其增量,这时仍可采用增量式计算,但输出则采用位置式的输出形式。得出
在这里插入图片描述
在这里插入图片描述

参数内部RAM分配图

在这里插入图片描述

PID位置式算法流程图

在这里插入图片描述
模拟调节器的调节动作是连续的,任何瞬间的输出控制量 u 都对应于执行机构(如调节阀)的位置。由式在这里插入图片描述
可知,数字控制器的输出控制量 也和阀门位置相对应,故称为位置型算式(简称位置式)。相应的算法流程图如图所示。
由图可以看出,因为积分作用是对一段时间内偏差信号的累加,因此,利用计算机实现位置型算法不是很方便,不仅需要占用较多的存储单元,而且编程也不方便,因此可以采用其改进式——增量型算法来实现

PID参数调整经验

三个参数要综合考虑,一般先将I,D设为0,调好P,达到基本的响应速度和误差,再加上I,使误差为0,这时再加入D,三个参数要反复调试,最终达到较好的结果。不同的控制对象,调试的难度相差很大!

在PID参数进行整定时如果能够有理论的方法确定PID参数当然是最理想的方法,但是在实际的应用中,更多的是通过凑试法来确定PID的参数。

增大比例系数P一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。

增大积分时间I有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。

增大微分时间D有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。

微分是即误差的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。

然后将已经调节好的比例系数略为缩小(一般缩小为原值的0.8),然后减小积分时间,使得系统在保持良好动态性能的情况下,静差得到消除。在此过程中,可根据系统的响应曲线的好坏反复改变比例系数和积分时间,以期得到满意的控制过程和整定参数。

如果在上述调整过程中对系统的动态过程反复调整还不能得到满意的结果,则可以加入微分环节。首先把微分时间D设置为0,在上述基础上逐渐增加微分时间,同时相应的改变比例系数和积分时间,逐步凑试,直至得到满意的调节效果。

PID参数选定规则

整定参数寻最佳,从小到大逐步查;
先调比例后积分,微分作用最后加;
曲线震荡很频繁,比例刻度要放大;
曲线漂浮波动大,比例刻度要拉小;
曲线偏离回复慢,积分时间往小降;
曲线波动周期长,积分时间要加长;
曲线震荡动作繁,微分时间要加长.

PID的参数设置

参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低

在凑试时,可参考以上参数对系统控制过程的影响趋势,对参数调整实行先比例、后积分,再微分的整定步骤。

首先整定比例部分。将比例参数由小变大,并观察相应的系统响应,直至得到反应快、超调小的响应曲线。如果系统没有静差或静差已经小到允许范围内,并且对响应曲线已经满意,则只需要比例调节器即可。

如果在比例调节的基础上系统的静差不能满足设计要求,则必须加入积分环节。在整定时先将积分时间设定到一个比较大的值(不是积分系数,积分系数应该减小)。

实例

下面以PID调节器为例,具体说明经验法的整定步骤

  1. 让调节器参数积分系数S0=0,实际微分系数k=0,控制系统投入闭环运行,由小到大改变比例系数S1,让扰动信号作阶跃变化,观察控制过程,直到获得满意的控制过程为止。

  2. 取比例系数S1为当前的值乘以0.83,由小到大增加积分系数S0,同样让扰动信号作阶跃变化,直至求得满意的控制过程。

  3. 积分系数S0保持不变,改变比例系数S1,观察控制过程有无改善,如有改善则继续调整,直到满意为止。否则,将原比例系数S1增大一些,再调整积分系数S0,力求改善控制过程。如此反复试凑,直到找到满意的比例系数S1和积分系数S0为止。

  4. 引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0。和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止。注意:仿真系统所采用的PID调节器与传统的工业 PID调节器有所不同,各个参数之间相互隔离,互不影响,因而用其观察调节规律十分方便。

  5. PID参数是根据控制对象的惯量来确定的。大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右。小惯量如:一个小电机带 一水泵进行压力闭环控制,一般只用PI控制。P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的。

电机控制实验方法

  1. 仅用比例控制环节控制小车,初步实现电机速度的一致性。
  2. 在比例环节的基础上增加积分环节,进一步实现电机控制速度的一致性。
  3. 在比例与积分环节上增加微分环节,最终实现PID控制。

在这里插入图片描述

#include <stdio.h>
#include "ingenious.h"
int i = 0;
int temp1 = 0, temp2 = 0, xspeed = 200, yspeed = 200, temp3 = 0, temp4 = 0, x1 = 0, y1 = 0, i1 = 0, i2, i3 = 2;
int iClockSign = 0;
void main()
{
	x1 = y1 = 20;
	i1 = 0;
	Clr_Screen();
	Langel_encodeinit(); /*左编码器初始化*/
	Rangel_encodeinit(); /*右编码器初始化*/
	Langel_encodezero(); /*左编码器计数器清零*/
	Rangel_encodezero(); /*右编码器计数器清零*/

	while (1)
	{

		temp1 = Langel_encodecap();
		temp2 = Rangel_encodecap();
		temp3 = temp1 - temp2;
		if (fabs(temp3) > 3)
		{
			xspeed = 200;
			yspeed = 200 + (4 * temp3 + 2.5 * (temp3 - temp4));
			x1 = xspeed;
			y1 = yspeed;
		}
		if (xspeed < 400 && yspeed < 400)
		{
			move(xspeed, yspeed, 0);
		}
		else
		{
			xspeed = 200;
			yspeed = 200;
		}
		temp4 = temp3;

		Mprintf(1, "       err=%d", temp3);
		Mprintf(1, "LC=%d", temp1);
		Mprintf(3, "RC=%d", temp2);
		Mprintf(5, "         x1=%d", x1);
		Mprintf(5, "LV=%d", xspeed);
		Mprintf(7, "         y1=%d", y1);
		Mprintf(7, "RV=%d", yspeed);
	}
}
}

发布了150 篇原创文章 · 获赞 450 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/Caoyang_He/article/details/89433866