分享

PID控制概述

 陆潇潇 2017-03-31

PID控制的原理和特点

在工业现场实际应用中,最为广泛的调节器控制规律是比例积分微分控制,简称PID控制,又称PID调节。

PID控制器问世至今已有近70年历史,它以其结构简单稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。

当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象﹐或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例积分微分计算出控制量进行控制的。

1、比例(P)控制

比例控制是一种最简单的控制方式其控制器的输出与输入误差信号成比例关系当仅有比例控制时系统输出存在稳态误差(Steady-state error)

2、积分(I)控制

在积分控制中,控制器的输出与输入误差信号的积分成正比关系对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)为了消除稳态误差,在控制器中必须引入积分项积分项对误差取决于时间的积分,随着时间的增加,积分项会增大这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差

3、微分(D)控制

在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系

自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳,其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化超前,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入比例项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是微分项,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性

PID参数的整定

一、自动控制系统性能评价

评价一个自动控制系统性能是否优越,有三个指标:快、稳、准

1.快速性:就是系统输出能快速地达到期望值的能力。

2.稳定性:就是系统输出稳定不波动或波动量小。

3.准确性,就是要求命令值与输出值之间的误差e小。

对于系统来说,要求快的话,可以增大Kp、Ki值

要求准的话,可以增大Ki值

要求稳的话,可以增大Kd值,可以减少压力波动

尤其要注意:这三个指标是相互矛盾的,如果太快,可能导致不稳; 如果太稳,可能导致不快。

二、误差问题

只要系统稳定且存在积分Ki,该系统在静态是没有误差的(会存在动态误差);

所谓动态误差,指当命令值不为恒值时,输出值跟不上命令值而存在的误差不管是谁设计的再好的系统都存在动态误差,动态误差体现的是系统的跟踪特性,比如说,有的音响功放对高频声音不敏感,就说明功放跟踪性能不好

三、PID控制器的参数整定

PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数积分时间和微分时间的大小。

PID控制器参数整定的方法很多,概括起来有两大类:

一是理论计算整定法它主要是依据系统的数学模型,经过理论计算确定控制器参数这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。

二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单易于掌握。

在工程实际中被广泛采用PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。现在一般采用的是临界比例法,利用该方法进行PID控制器参数的整定步骤如下:

(1)首先预选择一个足够短的采样周期让系统工作﹔

(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期﹔

(3)在一定的控制度下通过公式计算得到PID控制器的参数

PID参数的设定:是靠经验及工艺的熟悉,参考测量值跟踪与设定值曲线,从而调整P\I\D的大小

PID控制器参数的工程整定,各种调节系统中P.I.D参数经验数据以下可参照:

温度T: P=20~60%,T=180~600s,D=3-180s

压力P: P=30~70%,T=24~180s,

液位L: P=20~80%,T=60~300s,

流量L: P=40~100%,T=6~60s

 书上的常用口诀:

参数整定找最佳,从小到大顺序查

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳

曲线偏离回复慢,积分时间往下降

曲线波动周期长,积分时间再加长

曲线振荡频率快,先把微分降下来

动差大来波动慢微分时间应加长

理想曲线两个波,前高后低4比1

一看二调多分析,调节质量不会低

 这里介绍一种经验法这种方法实质上是一种试凑法,它是在生产实践中总结出来的行之有效的方法,并在现场中得到了广泛的应用

 这种方法的基本程序是先根据运行经验,确定一组调节器参数,并将系统投入闭环运行,然后人为地加入阶跃扰动(如改变调节器的给定值),观察被调量或调节器输出的阶跃响应曲线若认为控制质量不满意,则根据各整定参数对控制过程的影响改变调节器参数这样反复试验,直到满意为止。 经验法简单可靠,但需要有一定现场运行经验,整定时易带有主观片面性当采用PID调节器时,有多个整定参数,反复试凑的次数增多,不易得到最佳整定参数。

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

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

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

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

 引入适当的实际微分系数k和实际微分时间TD,此时可适当增大比例系数S1和积分系数S0和前述步骤相同,微分时间的整定也需反复调整,直到控制过程满意为止

 注意:仿真系统所采用的PID调节器与传统的工业 PID调节器有所不同,各个参数之间相互隔离,互不影响,因而用其观察调节规律十分方便

PID参数是根据控制对象的惯量来确定的大惯量如:大烘房的温度控制,一般P可在10以上,I=3-10,D=1左右小惯量如:一个小电机带

 一水泵进行压力闭环控制,一般只用PI控制P=1-10,I=0.1-1,D=0,这些要在现场调试时进行修正的

提供一种增量式PID供大家参考

 U(k)=Ae(k)-Be(k-1)+Ce(k-2)

 A=Kp(1+T/Ti+Td/T)

 B=Kp(1+2Td/T)

 C=KpTd/T      T采样周期 Td微分时间 Ti积分时间

 用上面的算法可以构造自己的PID算法

U(K)=U(K-1)+U(K)

调整PID参数有两种方法:

1仿真法;

2试凑法

试凑法设置PID参数的建议步骤:

1把Ki与Kd设为0,不要积分与微分;

2把Kp值从0开始慢慢增大,观察压力的反应速度是否在你的要求内;

3当压力的反应速度达到你的要求,停止增大Kp值;

4在该Kp值的基础上减少10%;

5把Ki值从0开始慢慢增大;

6当压力开始波动,停止增大Ki值;

7在该Ki值的基础上减少10%;

8把Kd值从0开始慢慢增大,观察压力的反应速度是否在你的要求内;

PID控制是目前工程上应用最广的一种控制方法,它的优点在于结构简单,且不依赖被控对象模型,控制所需的信息量也很少,因而非常易于工程实现,同时通过参数的调整也可获得较好的控制效果。

    PID控制是将误差信号的比例(P)、积分(I)和微分通过线性组合构成控制量,故称之为PID控制。因此,在使用中只需要设定三个参数即可。在很多情况,往往不一定需要三个单元,但是比例单元是必不可少的。
    PID控制器设计的难点在于参数整定。但是实际上很多情况下我们可以直接根据系统的时域响应来调整比例、微分和积分三个环节的参数,当然这就需要了解这三个环节对时域响应的有什么样的影响。
    (1)比例环节:直接将误差信号放大或缩小,因此将比例环节参数增大可以提高响应速度并且减小稳态误差,但是,快速性和稳定性总是一对矛盾,也就是在增大比例系数的同时,系统的稳定性逐渐减低,系统将会出现超调、振荡,甚至发散,因此合适的比例增益是在快速性和稳定性之间进行折中。
     (2)积分环节:从积分的定义可知,该环节是将误差不断进行累积,可实现消除稳态误差。增益越大,积分作用越强,稳态误差消除也越快,但是带来的问题是容易产生积分饱和现象,带来大的超调并延缓了系统进入稳态的速度,因此这又是一个矛盾。
    (3)微分环节:该环节或取的是误差的微分信息,根据微分的定义,我们可以知道,这是一个超前环节,也就是说该信号提前告诉我们控制量是该减还是该增,避免造成超调、振荡,因此增大该环节增益有助于提高系统的稳定性,避免振荡,但是对快速性却产生了负作用(快速性和稳定性总是一会矛盾体),因此必须合理选取。还有必须注意的是,微分环节对噪声信号将产生放大作用,因此在噪声较大的系统中慎用。
 
 
离散形式的PID控制
最近看了一些文献,发现其中一些文献标题写着是用增量式PID控制,但是看表达式似乎仍是位置式PID控制。不知是他弄错了,还是我的理解错了,下面根据我的理解比较一下位置式PID与增量式PID控制。
首先看表达式,这里采用离散形式。
位置式PID控制:
 
 
增量式PID控制:
 
 从表达式我们可以得出以下结论:
(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。


    正是由于PID控制参数整定的复杂性,目前出现了多种改进的PID控制方法,我们将在下一篇中对这些改进型进行归纳总结。


 
 
PID控制器C代码(部分)
typedef struct PID{
 double Command; //输入指令
 double Proportion;  //比例系数
 double Integral;   //积分系数
 double Derivative;  //微分系数
 double preErr;    //前一拍误差
 double sumErr;    //误差累积
};PID
double PIDCale(PID *p,double feedback)
{
 double dErr,Err;
 Err=p->Command-feedback;  //当前误差
 p->sumErr+=Err;      //误差累加
 dErr=Err-p->preErr;   //误差微分
 p->preErr=Err;    
 return(p->Proportion*Err  //比例项
  +p->Derivative*dErr   //微分项
  +p->Integral*p->sumErr);  //积分项
}
void PIDInit(PID *p)
{
 memset(p,0,sizeof(PID));  //初始化
}
 
 
PID控制器验证(C++)
#include <string.h>
#include<stdio.h>
typedef struct PID{
 double Command; //输入指令
 double Proportion;  //比例系数
 double Integral;   //积分系数
 double Derivative;  //微分系数
 double preErr;    //前一拍误差
 double sumErr;    //误差累积
}PID;
double PIDCale(PID *p,double feedback)
{
 double dErr,Err;
 Err=p->Command-feedback;  //当前误差
 p->sumErr+=Err;      //误差累加
 dErr=Err-p->preErr;   //误差微分
 p->preErr=Err;    
 return(p->Proportion*Err  //比例项
  +p->Derivative*dErr   //微分项
  +p->Integral*p->sumErr);  //积分项
}
void PIDInit(PID *p)
{
 memset(p,0,sizeof(PID));  //初始化
}
typedef struct motor{
 double lastY;
 double preY;
 double lastU;
 double preU;
}motor;
void motorInit(motor *m)
{
 memset(m,0,sizeof(motor));
}
double motorCal(motor *m,double u)
{
 double y=1.9753*m->lastY-0.9753*m->preY+0.00003284*u+0.00006568*m->lastU+0.00003284*m->preU;//二阶系统
 m->preY=m->lastY;
 m->lastY=y;
 m->preU=m->lastU;
 m->lastU=u;
 return y;
}
void main()
{
 FILE *fp=fopen("data.txt","w+");
 PID sPID;
 double u;
 double y=0;
 PIDInit(&sPID);
 sPID.Proportion=2;
 sPID.Derivative=10;
 sPID.Integral=0.00001;
 sPID.Command=10;
 motor m_motor;
 motorInit(&m_motor);
 int k=0;
 while(k<=1000)
 {
  fprintf(fp,"%f %f\n",y,sPID.Command);
  u=PIDCale(&sPID,y);
  y=motorCal(&m_motor,u);
  k++;
 }
 printf("%f\n",y);
 fclose(fp);
}
 
 
增量式PID控制函数源代码(C语言)
typedef struct PID{
 double Command; //输入指令
 double Proportion;  //比例系数
 double Integral;   //积分系数
 double Derivative;  //微分系数
 double pre2Err;  //前两拍误差
 double preErr;  //前一拍误差
}PID;
double PIDCale(PID *p,double feedback)
{
 double Err,pErr,dErr,dU;
 Err=p->Command-feedback;  //当前误差
 pErr=Err-p->preErr;   //比例项增量式误差
 dErr=Err-2*p->preErr+p->pre2Err;  //微分项增量式误差
 dU=p->Proportion*pErr+p->Derivative*dErr+p->Integral*Err;  //控制量增量
 p->pre2Err=p->preErr;
 p->preErr=Err;
 return dU;
}
void PIDInit(PID *p)
{
 memset(p,0,sizeof(PID));  //初始化
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多