产品概述

51单片机pid控制 工业控制中最常见的控制算法——PID控制

小编 2024-10-06 产品概述 23 0

工业控制中最常见的控制算法——PID控制

声明本文属转载目的是希望大家都学习下pid哦。PID算法是个很经典的东西。而做自平衡小车,飞行器PID是一个必须翻过的坎。因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂。并举出PID的形象例子来帮助理解PID。

一、首先介绍一下PID名字的由来:

P:Proportion(比例),就是输入偏差乘以一个常数。

I :Integral(积分),就是对输入偏差进行积分运算。

D:Derivative(微分),对输入偏差进行微分运算。

注:输入偏差=读出的被控制对象的值-设定值。比如说我要把温度控制在26度,但是现在我从温度传感器上读出温度为28度。则这个26度就是”设定值“,28度就是“读出的被控制对象的值”。然后来看一下,这三个元素对PID算法的作用,了解一下即可,不懂不用勉强。

P,打个比方,如果现在的输出是1,目标输出是100,那么P的作用是以最快的速度达到100,把P理解为一个系数即可;而I呢?大家学过高数的,0的积分才能是一个常数,I就是使误差为0而起调和作用;D呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。

二、然后要知道PID算法具体分两种:一种是位置式的 ,一种是增量式的。在小车里一般用增量式,为什么呢?位置式PID的输出与过去的所有状态有关,计算时要对e(每一次的控制误差)进行累加,这个计算量非常大,而明显没有必要。而且小车的PID控制器的输出并不是绝对数值,而是一个△,代表增多少,减多少。换句话说,通过增量PID算法,每次输出是PWM要增加多少或者减小多少,而不是PWM的实际值。所以明白增量式PID就行了。

三、接着讲PID参数的整定,也就是PID公式中,那几个常数系数Kp,Ti,Td等是怎么被确定下来然后带入PID算法中的。如果要运用PID,则PID参数是必须由自己调出来适合自己的项目的。通常四旋翼,自平衡车的参数都是由自己一个调节出来的,这是一个繁琐的过程。本次我们可以不管,关于PID参数怎么确定的,网上有很多经验可以借鉴。比如那个经典的经验试凑口诀:

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

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

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

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

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

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

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

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

理想曲线两个波, 前高后低四比一。

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

四、接下来我们用例子来辅助我们把常用的PID模型讲解了。(PID控制并不一定要三者都出现,也可以只是PI、PD控制,关键决定于控制的对象。)(下面的内容只是介绍一下PID模型,可以不看,对理解PID没什么用)

例子:我们要控制一个人,让他一PID的控制方式来行走110步后停下来。

1)P比例控制,就是让他按照一定的比例走,然后停下。比如比例系数为108,则走一次就走了108步,然后就不走了。

说明:P比例控制是一种最简单的控制方式,控制器的输出与输入误差信号成比例关系。但是仅有比例控制时系统输出存在稳态误差。比如上面的只能走到108,无论怎样都走不到110。

2)PI积分控制,就是按照一定的步伐走到112步然后回头接着走,走到108步位置时,然后又回头向110步位置走。在110位置处来回晃荡几次,最后停在110步的位置。说明:在积分I控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统来说,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差的影响取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大,从而使稳态误差进一步减小,直到等于0。因此,比例+积分(PI)控制器可以使系统在进入稳态后无稳态误差。

3)PD微分控制,就是按照一定的步伐走到一百零几步后,再慢慢地走向110步的位置靠近,如果最后能精确停在110步的位置,就是无静差控制;如果停在110步附近(如109步或111步位置),就是有静差控制。

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

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

五、用小明来说明PID:

小明接到这样一个任务:有一个水缸有点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。 小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了,每30分钟来检查一次水面高度。水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果每次来水都没怎么漏,不需要加水,来得太频繁做的是无用功。几次试验后,确定每10分钟来检查一次。这个检查时间就称为采样周期。 开始小明用瓢加水,水龙头离水缸有十几米的距离,经常要跑好几趟才加够水,于是小明又改为用桶加,一加就是一桶,跑的次数少了,加水的速度也快了,但好几次将缸给加溢出了,不小心弄湿了几次鞋,小明又动脑筋,我不用瓢也不用桶,老子用盆,几次下来,发现刚刚好,不用跑太多次,也不会让水溢出。这个加水工具的大小就称为比例系数。

小明又发现水虽然不会加过量溢出了,有时会高过要求位置比较多,还是有打湿鞋的危险。他又想了个办法,在水缸上装一个漏斗,每次加水不直接倒进水缸,而是倒进漏斗让它慢慢加。这样溢出的问题解决了,但加水的速度又慢了,有时还赶不上漏水的速度。于是他试着变换不同大小口径的漏斗来控制加水的速度,最后终于找到了满意的漏斗。漏斗的时间就称为积分时间。

小明终于喘了一口,但任务的要求突然严了,水位控制的及时性要求大大提高,一旦水位过低,必须立即将水加到要求位置,而且不能高出太多,否则不给工钱。小明又为难了!于是他又开努脑筋,终于让它想到一个办法,常放一盆备用水在旁边,一发现水位低了,不经过漏斗就是一盆水下去,这样及时性是保证了,但水位有时会高多了。他又在要求水面位置上面一点将水缸要求的水平面处凿一孔,再接一根管子到下面的备用桶里这样多出的水会从上面的孔里漏出来。这个水漏出的快慢就称为微分时间。

六、在代码中理解PID:(好好看注释,很好理解的。注意结合下面PID的公式)

首先看PID的增量型公式:

PID=Uk+KP*【E(k)-E(k-1)】+KI*E(k)+KD*【E(k)-2E(k-1)+E(k-2)】

在单片机中运用PID,出于速度和RAM的考虑,一般不用浮点数,这里以整型变量为例来讲述PID在单片机中的运用。由于是用整型来做的,所以不是很精确。但是对于一般的场合来说,这个精度也够了,关于系数和温度在程序中都放大了10倍,所以精度不是很高,但是大部分的场合都够了,若不够,可以再放大10倍或者100倍处理,不超出整个数据类型的范围就可以了。一下程序包括PID计算和输出两部分。当偏差>10度时全速加热,偏差在10度以内时为PID计算输出。

程序说明:下面的程序,先看main函数。可知在对定时器0初始化后就一直在执行PID_Output()函数。在PID_Output()函数中先用iTemp变量来得到PID运算的结果,来决定是启动加热丝加热还是不启动加热丝。下面的if语句结合定时器来决定PID算法多久执行一次。PID_Operation()函数看似很复杂,其实就一直在做一件事:根据提供的数据,用PID公式把最终的PID值算出来。

51单片机的代码展示

#include <reg52.h>

typedef unsigned char uChar8;

typedef unsigned int uInt16;

typedef unsigned long int uInt32;

sbit ConOut = P1^1; //加热丝接到P1.1口

typedef struct PID_Value

{

uInt32 liEkVal[3]; //差值保存,给定和反馈的差值

uChar8 uEkFlag[3]; //符号,1则对应的为负数,0为对应的为正数

uChar8 uKP_Coe; //比例系数

uChar8 uKI_Coe; //积分常数

uChar8 uKD_Coe; //微分常数

uInt16 iPriVal; //上一时刻值

uInt16 iSetVal; //设定值

uInt16 iCurVal; //实际值

}PID_ValueStr;

PID_ValueStr PID; //定义一个结构体,这个结构体用来存算法中要用到的各种数据

bit g_bPIDRunFlag = 0; //PID运行标志位,PID算法不是一直在运算。而是每隔一定时间,算一次。

/* ********************************************************

/* 函数名称:PID_Operation()

/* 函数功能:PID运算

/* 入口参数:无(隐形输入,系数、设定值等)

/* 出口参数:无(隐形输出,U(k))

/* 函数说明:U(k)+KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)]

******************************************************** */

void PID_Operation(void )

{

uInt32 Temp[3] = {0}; //中间临时变量

uInt32 PostSum = 0; //正数和

uInt32 NegSum = 0; //负数和

if (PID.iSetVal > PID.iCurVal) //设定值大于实际值否?

{

if (PID.iSetVal - PID.iCurVal > 10) //偏差大于10否?

PID.iPriVal = 100; //偏差大于10为上限幅值输出(全速加热)

else //否则慢慢来

{

Temp[0] = PID.iSetVal - PID.iCurVal; //偏差<=10,计算E(k)

PID.uEkFlag[1] = 0; //E(k)为正数,因为设定值大于实际值

/* 数值进行移位,注意顺序,否则会覆盖掉前面的数值 */

PID.liEkVal[2] = PID.liEkVal[1];

PID.liEkVal[1] = PID.liEkVal[0];

PID.liEkVal[0] = Temp[0];

/* =================================================================== */

if (PID.liEkVal[0] > PID.liEkVal[1]) //E(k)>E(k-1)否?

{

Temp[0] = PID.liEkVal[0] - PID.liEkVal[1]; //E(k)>E(k-1)

PID.uEkFlag[0] = 0; //E(k)-E(k-1)为正数

}

else

{

Temp[0] = PID.liEkVal[1] - PID.liEkVal[0]; //E(k)<E(k-1)

PID.uEkFlag[0] = 1; //E(k)-E(k-1)为负数

}

/* =================================================================== */

Temp[2] = PID.liEkVal[1] * 2; //2E(k-1)

if ((PID.liEkVal[0] + PID.liEkVal[2]) > Temp[2]) //E(k-2)+E(k)>2E(k-1)否?

{

Temp[2] = (PID.liEkVal[0] + PID.liEkVal[2]) - Temp[2];

PID.uEkFlag[2]=0; //E(k-2)+E(k)-2E(k-1)为正数

}

else //E(k-2)+E(k)<2E(k-1)

{

Temp[2] = Temp[2] - (PID.liEkVal[0] + PID.liEkVal[2]);

PID.uEkFlag[2] = 1; //E(k-2)+E(k)-2E(k-1)为负数

}

/* =================================================================== */

Temp[0] = (uInt32)PID.uKP_Coe * Temp[0]; //KP*[E(k)-E(k-1)]

Temp[1] = (uInt32)PID.uKI_Coe * PID.liEkVal[0]; //KI*E(k)

Temp[2] = (uInt32)PID.uKD_Coe * Temp[2]; //KD*[E(k-2)+E(k)-2E(k-1)]

/* 以下部分代码是讲所有的正数项叠加,负数项叠加 */

/* ========= 计算KP*[E(k)-E(k-1)]的值 ========= */

if (PID.uEkFlag[0] == 0)

PostSum += Temp[0]; //正数和

else

NegSum += Temp[0]; //负数和

/* ========= 计算KI*E(k)的值 ========= */

if (PID.uEkFlag[1] == 0)

PostSum += Temp[1]; //正数和

else

; /* 空操作。就是因为PID.iSetVal > PID.iCurVal(即E(K)>0)才进入if的,

那么就没可能为负,所以打个转回去就是了 */

/* ========= 计算KD*[E(k-2)+E(k)-2E(k-1)]的值 ========= */

if (PID.uEkFlag[2]==0)

PostSum += Temp[2]; //正数和

else

NegSum += Temp[2]; //负数和

/* ========= 计算U(k) ========= */

PostSum += (uInt32)PID.iPriVal;

if (PostSum > NegSum) //是否控制量为正数

{

Temp[0] = PostSum - NegSum;

if (Temp[0] < 100 ) //小于上限幅值则为计算值输出

PID.iPriVal = (uInt16)Temp[0];

else PID.iPriVal = 100; //否则为上限幅值输出

}

else //控制量输出为负数,则输出0(下限幅值输出)

PID.iPriVal = 0;

}

}

else PID.iPriVal = 0; //同上,嘿嘿

}

/* ********************************************************

/* 函数名称:PID_Output()

/* 函数功能:PID输出控制

/* 入口参数:无(隐形输入,U(k))

/* 出口参数:无(控制端)

******************************************************** */

void PID_Output(void )

{

static uInt16 iTemp;

static uChar8 uCounter;

iTemp = PID.iPriVal;

if (iTemp == 0)

ConOut = 1; //不加热

else ConOut = 0; //加热

if (g_bPIDRunFlag) //定时中断为100ms(0.1S),加热周期10S(100份*0.1S)

{

g_bPIDRunFlag = 0;

if (iTemp) iTemp--; //只有iTemp>0,才有必要减“1”

uCounter++;

if (100 == uCounter)

{

PID_Operation(); //每过0.1*100S调用一次PID运算。

uCounter = 0;

}

}

}

/* ********************************************************

/* 函数名称:PID_Output()

/* 函数功能:PID输出控制

/* 入口参数:无(隐形输入,U(k))

/* 出口参数:无(控制端)

******************************************************** */

void Timer0Init(void )

{

TMOD |= 0x01; // 设置定时器0工作在模式1下

TH0 = 0xDC;

TL0 = 0x00; // 赋初始值

TR0 = 1; // 开定时器0

EA = 1; // 开总中断

ET0 = 1; // 开定时器中断

}

void main(void )

{

Timer0Init();

while (1)

{

PID_Output();

}

}

void Timer0_ISR(void ) interrupt 1

{

static uInt16 uiCounter = 0;

TH0 = 0xDC;

TL0 = 0x00;

uiCounter++;

if (100 == uiCounter)

{

g_bPIDRunFlag = 1;

}

}

详细讲解PID控制

PID的数学模型

在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在很多控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的。PID算法的一般形式:

PID算法通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻):

1.输入量为

2.输出量为

3.偏差量为

PID算法的数字离散化

假设采样间隔为T,则在第K个T时刻:

偏差=

积分环节用加和的形式表示,即

微分环节用斜率的形式表示,即

PID算法离散化后的式子:

则可表示成为:

其中式中:

比例参数

:控制器的输出与输入偏差值成比例关系。系统一旦出现偏差,比例调节立即产生调节作用以减少偏差。特点:过程简单快速、比例作用大,可以加快调节,减小误差;但是使系统稳定性下降,造成不稳定,有余差。

积分参数

:积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有系统上以抵消系统造成的静差。

微分参数

:微分信号则反应了偏差信号的变化规律,或者说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的快速性。

PID的基本离散表示形式如上。目前的这种表述形式属于位置型PID,另外一种表述方式为增量式PID,由上述表达式可以轻易得到:

那么:

上式就是离散化PID的增量式表示方式,由公式可以看出,增量式的表达结果和最近三次的偏差有关,这样就大大提高了系统的稳定性。需要注意的是最终的输出结果应该为:

输出量 =

+ 增量调节值

目的

PID 的重要性应该无需多说了,这个控制领域的应用最广泛的算法了.

本篇文章的目的是希望通过一个例子展示算法过程,并解释以下概念:

(1)简单描述何为PID, 为何需要PID,PID 能达到什么作用。

(2)理解P(比例环节)作用:基础比例环节。

缺点: 产生稳态误差.

疑问: 何为稳态误差 为什么会产生稳态误差.

(3)理解I(积分环节)作用:消除稳态误差.

缺点: 增加超调

疑问: 积分为何能消除稳态误差?

(4) 理解D(微分环节)作用:加大惯性响应速度,减弱超调趋势

疑问: 为何能减弱超调

(5)理解各个比例系数的作用

何为PID以及为何需要PID?

以下即PID 控制的整体框图,过程描述为:

设定一个输出目标,反馈系统传回输出值,如与目标不一致,则存在一个误差,PID 根据此误差调整输入值,直至输出达到设定值.

疑问:

那么我们为什么需要PID 呢,比如我控制温度,我不能监控温度值,温度值一到就停止吗?

这里必须要先说下我们的目标,因为我们所有的控制无非就是想输出能够达到我们的设定,即如果我们设定了一个目标温度值,那么我们想要一个什么样的温度变化呢.

比如设定目标温度为30度, 目标无非是希望达到图1 希望其能够快速而且没有抖动的达到30度.

那这样大家应该就明白,如果使用温度一到就停止的办法,当然如果要求不高可能也行,当肯定达不到图1 这样的要求,因为温度到了后余温也会让温度继续升高.而且温度自身也会通过空气散热的.

图 系统输出的响应目标

综上所述,我们需要PID的原因无非就是普通控制手段没有办法使输出快速稳定的到达设定值。

控制器的P,I,D项选择

下面将常用的各种控制规律的控制特点简单归纳一下:

(1)、比例控制规律P:采用P控制规律能较快地克服扰动的影响,它的作用于输出值较快,但不能很好稳定在一个理想的数值,不良的结果是虽较能有效的克服扰动的影响,但有余差出现。它适用于控制通道滞后较小、负荷变化不大、控制要求不高、被控参数允许在一定范围内有余差的场合。如:金彪公用工程部下设的水泵房冷、热水池水位控制;油泵房中间油罐油位控制等。

(2)、比例积分控制规律(PI):在工程中比例积分控制规律是应用最广泛的一种控制规律。积分能在比例的基础上消除余差,它适用于控制通道滞后较小、负荷变化不大、被控参数不允许有余差的场合。如:在主线窑头重油换向室中F1401到F1419号枪的重油流量控制系统;油泵房供油管流量控制系统;退火窑各区温度调节系统等。

(3)、比例微分控制规律(PD):微分具有超前作用,对于具有容量滞后的控制通道,引入微分参与控制,在微分项设置得当的情况下,对于提高系统的动态性能指标,有着显著效果。因此,对于控制通道的时间常数或容量滞后较大的场合,为了提高系统的稳定性,减小动态偏差等可选用比例微分控制规律。如:加热型温度控制、成分控制。需要说明一点,对于那些纯滞后较大的区域里,微分项是无能为力,而在测量信号有噪声或周期性振动的系统,则也不宜采用微分控制。如:大窑玻璃液位的控制。

(4)、例积分微分控制规律(PID):PID控制规律是一种较理想的控制规律,它在比例的基础上引入积分,可以消除余差,再加入微分作用,又能提高系统的稳定性。它适用于控制通道时间常数或容量滞后较大、控制要求较高的场合。如温度控制、成分控制等。

鉴于D规律的作用,我们还必须了解时间滞后的概念,时间滞后包括容量滞后与纯滞后。其中容量滞后通常又包括:测量滞后和传送滞后。测量滞后是检测元件在检测时需要建立一种平衡,如热电偶、热电阻、压力等响应较慢产生的一种滞后。而传送滞后则是在传感器、变送器、执行机构等设备产生的一种控制滞后。纯滞后是相对与测量滞后的,在工业上,大多的纯滞后是由于物料传输所致,如:大窑玻璃液位,在投料机动作到核子液位仪检测需要很长的一段时间。

总之,控制规律的选用要根据过程特性和工艺要求来选取,决不是说PID控制规律在任何情况下都具有较好的控制性能,不分场合都采用是不明智的。如果这样做,只会给其它工作增加复杂性,并给参数整定带来困难。当采用PID控制器还达不到工艺要求,则需要考虑其它的控制方案。如串级控制、前馈控制、大滞后控制等。

Kp,Ti,Td三个参数的设定是PID控制算法的关键问题。一般说来编程时只能设定他们的大概数值,并在系统运行时通过反复调试来确定最佳值。因此调试阶段程序须得能随时修改和记忆这三个参数。

数字PID控制器

(1)模拟PID控制规律的离散化

(2)数字PID控制器的差分方程

参数的自整定

在某些应用场合,比如通用仪表行业,系统的工作对象是不确定的,不同的对象就得采用不同的参数值,没法为用户设定参数,就引入参数自整定的概念。实质就是在首次使用时,通过N次测量为新的工作对象寻找一套参数,并记忆下来作为以后工作的依据。具体的整定方法有三种:临界比例度法、衰减曲线法、经验法。

1、临界比例度法(Ziegler-Nichols)

1.1 在纯比例作用下,逐渐增加增益至产生等副震荡,根据临界增益和临界周期参数得出PID控制器参数,步骤如下:

(1)将纯比例控制器接入到闭环控制系统中(设置控制器参数积分时间常数Ti =∞,实际微分时间常数Td =0)。

(2)控制器比例增益K设置为最小,加入阶跃扰动(一般是改变控制器的给定值),观察被调量的阶跃响应曲线。

(3)由小到大改变比例增益K,直到闭环系统出现振荡。

(4)系统出现持续等幅振荡时,此时的增益为临界增益(Ku),振荡周期(波峰间的时间)为临界周期(Tu)。

(5) 由表1得出PID控制器参数。

表1

1.2 采用临界比例度法整定时应注意以下几点:

(1)在采用这种方法获取等幅振荡曲线时,应使控制系统工作在线性区,不要使控制阀出现开、关的极端状态,否则得到的持续振荡曲线可能是“极限循环”,从线性系统概念上说系统早已处于发散振荡了。

(2)由于被控对象特性的不同,按上表求得的控制器参数不一定都能获得满意的结果。对于无自平衡特性的对象,用临界比例度法求得的控制器参数往住使系统响应的衰减率偏大(ψ>0.75 )。而对于有自平衡特性的高阶等容对象,用此法整定控制器参数时系统响应衰减率大多偏小(ψ<0.75 )。为此,上述求得的控制器参数,应针对具体系统在实际运行过程中进行在线校正。

(3) 临界比例度法适用于临界振幅不大、振荡周期较长的过程控制系统,但有些系统从安全性考虑不允许进行稳定边界试验,如锅炉汽包水位控制系统。还有某些时间常数较大的单容对象,用纯比例控制时系统始终是稳定的,对于这些系统也是无法用临界比例度法来进行参数整定的。

(4)只适用于二阶以上的高阶对象,或一阶加纯滞后的对象,否则,在纯比例控制情况下,系统不会出现等幅振荡。

1.3 若求出被控对象的静态放大倍数KP=△y/△u ,则增益乘积KpKu可视为系统的最大开环增益。 通常认为Ziegler-Nichols闭环试验整定法的适用范围为:

(1) 当KpKu > 20时,应采用更为复杂的控制算法,以求较好的调节效果。

(2)当KpKu < 2时,应使用一些能补偿传输迟延的控制策略。

(3)当1.5 <KpKu< 2时,在对控制精度要求不高的场合仍可使用PID控制器,但需要对表1进行修正。在这种情况下,建议采用SMITH预估控制和IMC控制策略。

(4)当KpKu< 1.5时,在对控制精度要求不高的场合仍可使用PI控制器,在这种情况下,微分作用已意义不大。

2、衰减曲线法

衰减曲线法与临界比例度法不同的是,闭环设定值扰动试验采用衰减振荡(通常为4:1或10:l),然后利用衰减振荡的试验数据,根据经验公式求取控制器的整定参数。整定步骤如下:

(1)在纯比例控制器下,置比例增益K为较小值,并将系统投入运行。

(2)系统稳定后,作设定值阶跃扰动,观察系统的响应,若系统响应衰减太快,则减小比例增益K;反之,应增大比例增益K。直到系统出现如下图(a)所示的4:1衰减振荡过程,记下此时的比例增益Ks及和振荡周期Ts数值。

(3)利用Ks和Ts值,按下表给出的经验公式,计算出控制器的参数整定值。

(4)10:1衰减曲线法类似,只是用Tr带入计算。

采用衰减曲线法必须注意几点:

(1)加给定干扰不能太大,要根据生产操作要求来定,一般在5%左右,也有例外的情况。

(2)必须在工艺参数稳定的情况下才能加给定干扰,否则得不到正确得 整定参数。

(3)对于反应快的系统,如流量、管道压力和小容量的液位调节等,要得到严格的4:1衰减曲线较困难,一般以被调参数来回波动两次达到稳定,就近似地认为达到4:1衰减过程了。

(4)投运时,先将K放在较小的数值,把Ti减少到整定值,把Td逐步放大到整定值,然后把K拉到整定值(如果在K=整定值的条件下很快地把Td放到整定值,控制器的输出会剧烈变化)。

3、经验整定法

3.1方法一A:

(1)确定比例增益

使PID为纯比例调节,输入设定为系统允许最大值的60%~70%,由0逐渐加大比例增益至系统出现振荡;再反过来,从此时的比例增益逐渐减小至系统振荡消失,记录此时的比例增益,设定PID的比例增益P为当前值的60%~70%。

(2)确定积分时间常数

比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti至系统出现振荡,之后在反过来,逐渐加大Ti至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。

(3)确定积分时间常数Td

积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。

(4)系统带载联调,再对PID参数进行微调,直至满足要求。

3.2 方法一B:

(1)PI调节

(a)纯比例作用下,把比例度从较大数值逐渐往下降,至开始产生周期振荡(测量值以给定值为中心作有规则得振荡),在产生周期性振荡得情况下,把此比例度逐渐加宽直至系统充分稳定。

(b)接下来把积分时间逐渐缩短至产生振荡,此时表示积分时间过短,应把积分时间稍加延长,直至振荡停止。

(2)PID调节

(a)纯比例作用下寻求起振点。

(b)加大微分时间使振荡停止,接着把比例度调得稍小一些,使振荡又产生,加大微分时间,使振荡再停止,来回这样操作,直至虽加大微分时间,但不能使振荡停止,求得微分时间的最佳值,此时把比例度调得稍大一些直至振荡停止。

(c)把积分时间调成和微分时间相同的数值,如果又产生振荡则加大积分时间直至振荡停止。

3.3 方法二:

另一种方法是先从表列范围内取Ti的某个数值,如果需要微分,则取Td=(1/3~1/4)Ti,然后对δ进行试凑,也能较快地达到要求。实践证明,在一定范围内适当地组合δ和Ti的数值,可以得到同样衰减比的曲线,就是说,δ的减少,可以用增加Ti的办法来补偿,而基本上不影响调节过程的质量。所以,这种情况,先确定Ti、Td再确定δ的顺序也是可以的。而且可能更快些。如果曲线仍然不理想,可用Ti、Td再加以适当调整。

3.4 方法三:

(1)在实际调试中,也可以先大致设定一个经验值,然后根据调节效果修改。

流量系统:P(%)40--100,I(分)0.1--1

压力系统:P(%)30--70, I(分)0.4--3

液位系统:P(%)20--80, I(分)1—5

温度系统:P(%)20--60, I(分)3--10,D(分)0.5--3

(2)以下整定的口诀:

阶跃扰动投闭环,参数整定看曲线;先投比例后积分,最后再把微分加;

理想曲线两个波,振幅衰减4比1;比例太强要振荡,积分太强过程长;

动差太大加微分,频率太快微分降;偏离定值回复慢,积分作用再加强。

4、复杂调节系统的参数整定

以串级调节系统为例来说明复杂调节系统的参数整定方法。由于串级调节系统中,有主、副两组参数,各通道及回路间存在着相互联系和影响。改变主、副回路的任一参数,对整个系统都有影响。特别是主、副对象时间常数相差不大时,动态联系密切,整定参数的工作尤其困难。

在整定参数前,先要明确串级调节系统的设计目的。如果主要是保证主参数的调节质量,对副参数要求不高,则整定工作就比较容易;如果主、副参数都要求高,整定工作就比较复杂。下面介绍“先副后主”两步参数整定法。

第一步:在工况稳定情况下,将主回路闭合,把主控制器比例度放在100%,积分时间放在最大,微分时间放在零。用4:1衰减曲线整定副回路,求出副回路得比例增益K2s和振荡周期T2s。

第二步:把副回路看成是主回路的一个环节,使用4:1衰减曲线法整定主回路,求得主控制器K1s和T1s。

根据K1s、K2s、T1s、T2s按表2经验公式算出串级调节系统主、副回路参数。先放上副回路参数,再放上主回路参数,如果得到满意的过渡过程,则整定工作完毕。否则可进行适当调整。

如果主、副对象时间常数相差不大,按4:1衰减曲线法整定,可能出现“共振”危险,这时,可适当减小副回路比例度或积分时间,以达到减少副回路振荡周期的目的。同理,加大主回路比例度或积分时间,以期增大主回路振荡周期,使主、副回路振荡周期之比加大,避免“共振”。这样做的结果会降低调节质量。

如果主、副对象特性太相近,则说明确定的方案欠妥当,就不能完全依靠参数整定来提高调节质量了。

实际应用体会:

一是利用数字PID控制算法调节直流电机的速度,方案是采用光电开关来获得电机的转动产生的脉冲信号,单片机(MSP430G2553)通过测量脉冲信号的频率来计算电机的转速(具体测量频率的算法是采用直接测量法,定时1s测量脉冲有多少个,本身的测量误差可以有0.5转加减),测量的转速同给定的转速进行比较产生误差信号,来产生控制信号,控制信号是通过PWM调整占空比也就是调整输出模拟电压来控制的(相当于1位的DA,如果用10位的DA来进行模拟调整呢?效果会不会好很多?),这个实验控制能力有一定的范围,只能在30转/秒和150转/秒之间进行控制,当给定值(程序中给定的速度)高于150时,实际速度只能保持在150转,这也就是此系统的最大控制能力,当给定值低于30转时,直流电机转轴实际是不转动的,但由于误差值过大,转速会迅速变高,然后又会停止转动,就这样循环往复,不能达到控制效果。

根据实测,转速稳态精度在正负3转以内,控制时间为4到5秒。实验只进行到这种程度,思考和分析也只停留在这种深度。

二是利用数字PID控制算法调节直流减速电机的位置,方案是采用与电机同轴转动的精密电位器来测量电机转动的位置和角度,通过测量得到的角度和位置与给定的位置进行比较产生误差信号,然后位置误差信号通过一定关系(此关系纯属根据想象和实验现象来拟定和改善的)转换成PWM信号,作为控制信号的PWM信号是先产生对直流减速电机的模拟电压U,U来控制直流减速电机的力矩(不太清楚),力矩产生加速度,加速度产生速度,速度改变位置,输出量是位置信号,所以之间应该对直流减速电机进行系统建模分析,仿真出直流减速电机的近似系统传递函数,然后根据此函数便可以对PID的参数进行整定了。

两次体会都不是特别清楚PID参数是如何整定的,没有特别清晰的理论指导和实验步骤,对结果的整理和分析也不够及时,导致实验深度和程度都不能达到理想效果。

怎样形象理解PID算法

小明接到这样一个任务:

有一个水缸点漏水(而且漏水的速度还不一定固定不变)

要求水面高度维持在某个位置

一旦发现水面高度低于要求位置,就要往水缸里加水。

小明接到任务后就一直守在水缸旁边,时间长就觉得无聊,就跑到房里看小说了,每30分钟来检查一次水面高度。水漏得太快,每次小明来检查时,水都快漏完了,离要求的高度相差很远,小明改为每3分钟来检查一次,结果每次来水都没怎么漏,不需要加水,来得太频繁做的是无用功。

几次试验后,确定每10分钟来检查一次。这个检查时间就称为采样周期。

开始小明用瓢加水,水龙头离水缸有十几米的距离,经常要跑好几趟才加够水,于是小明又改为用桶加,一加就是一桶,跑的次数少了,加水的速度也快了,

但好几次将缸给加溢出了,不小心弄湿了几次鞋,小明又动脑筋,我不用瓢也不用桶,老子用盆,几次下来,

发现刚刚好,不用跑太多次,也不会让水溢出。这个加水工具的大小就称为比例系数。

小明又发现水虽然不会加过量溢出了,有时会高过要求位置比较多,还是有打湿鞋的危险。他又想了个办法,在水缸上装一个漏斗,

每次加水不直接倒进水缸,而是倒进漏斗让它慢慢加。这样溢出的问题解决了,但加水的速度又慢了,有时还赶不上漏水的速度。

于是他试着变换不同大小口径的漏斗来控制加水的速度,最后终于找到了满意的漏斗。漏斗的时间就称为积分时间 。

小明终于喘了一口,但任务的要求突然严了,水位控制的及时性要求大大提高,一旦水位过低,必须立即将水加到要求位置,而且不能高出太多,否则不给工钱。

小明又为难了!于是他又开努脑筋,终于让它想到一个办法,常放一盆备用水在旁边,一发现水位低了,不经过漏斗就是一盆水下去,这样及时性是保证了,但水位有时会高多了。

他又在要求水面位置上面一点将水凿一孔,再接一根管子到下面的备用桶里这样多出的水会从上面的孔里漏出来。这个水漏出的快慢就称为微分时间。

拿一个水池水位来说,我们 可以制定一个规则,

把水位分为超高、高、较高、中、较低、低、超低几个区段;

再把水位波动的趋势分为甚快、快、较快、慢、停几个区段,并区分趋势的正负;

把输出分为超大幅 度、大幅度、较大幅度、微小几个区段。

当水位处于中值、趋势处于停顿的时候,不调节;

当水位处于中值、趋势缓慢变化的时候,也可以暂不调节;

当水位处于较高、趋势缓慢变化 的时候,输出一个微小调节两就够了;

当水位处于中值、趋势较快变化的时候,输出进行叫 大幅度调节……。

如上所述,我们需要制定一个控制规则表,然后制定参数判断水位区段的界值、波动趋 势的界值、输出幅度的界值。

比例控制(P)是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。

根据设备有所不同,比例带一般为2~10%(温度控制)。

但是,仅仅是P控制的话,会产生下面将提到的offset (稳态误差),所以一般加上积分控制(I),以消除稳态误差。

比例带与比例控制(P)输出的关系如图所示。用MVp运算式的设定举例:

稳态误差(Off set)

比例控制中,经过一定时间后误差稳定在一定值时,此时的误差叫做稳态误差(off set)。

仅用比例控制的时候,根据负载的变动及设备的固有特性不同,会出现不同的稳态误差。

负载特性与控制特性曲线的交点和设定值不一致是产生稳态误差的原因。

比例带小时不会产生。为消除稳态误差,我们设定手动复位值--manual reset值(MR),以消除控制误差。

手动复位(Manual reset)

如前所述,仅用比例控制不能消除稳态误差。

为此,将MR(manual reset值)设为可变,则可自由整定(即调整)调节器的输出。

只要手动操作输出相当于offset的量,就能与目标值一致。

这就叫做手动复位(manual reset),通常比例调节器上配有此功能。

在实际的自动控制中,每次发生off set时以手动进行reset的话,这样并不实用。

在后面将叙述的积分控制功能,能自动消除稳态误差。

所谓积分控制(I),就是在出现稳态误差时自动的改变输出量,使其与手动复位动作的输出量相同,达到消除稳态误差的目的。

当系统存在误差时,进行积分控制,根据积分时间的大小调节器的输出会以一定的速度变化,只要误差还存在,就会不断的进行输出。

积分时间的定义:

当积分项和比例项对于控制器的输出的贡献相同,即积分作用重复了一次比例作用时所花费的时间,就是积分时间。

微分控制(D)的功能是通过误差的变化率预报误差信号的未来变化趋势。

通过提供超前控制作用,微分控制能使被控过程趋于稳定。

因此,它经常用来抵消积分控制产生的不稳定趋势。

微分时间的定义:

当输入量持续的以一定速率变化时,微分项和比例项对于控制器的输出的贡献相同,即微分作用重复了一次比例作用时所花费的时间,就是微分时间。

实际中如何使用

我们看一个生活例子,冬天洗热水澡,需要先放掉一段时间的冷水,因为水管里有一段冷水,热水器也需要一个加热过程,等过了这段时间之后水温有些接近目标值后,开始调节水龙头来调节冷、热水之间的比例及出水量,之后再慢慢的微调,在洗浴过程中感觉温度不合适,再一点点的调节。这个过程,其实就是PID算法过程。我们之所以微调,是因为水温的变化速度与我调节的速度不相匹配,存在一个滞后效应,我们需要调节一点点,等一下再感觉一下温度,不够再调节一点点,再感觉,这个过程就叫PID算法,也可以说,滞后效应是引入PID的原因。

失去的能否找回来?能、只是我找回了纽扣,却发现衣服已经不再了。这个就是滞后效应。

负反馈系统,都有滞后效应,但为什么运放、电源这类的却从来不提PID算法呢?这是因为这类系统的滞后延时时间非常短,若考虑这个延时,负反馈引入180度相位,延时恰好引入180度相位,则完全可能引起振荡。问题在于这个延时时间足够短,它的谐振频率点比较高,以运放为例,加入延时加上负反馈引起的谐振点为10MHz,但这片运放的频率响应是1MHz,则在10MHz下完全不可能导致振荡,因为这个芯片的频响特性只有1MHz。我们常用的线性电源IC,比如SOT23封装的LDO,假如输出不加电容,就会输出一个振荡的波形,相对来说电源IC的滞后效应比运放要大,但是,因为电源一般后面都要接大电容的,它的频响特性很低,接近直流0Hz,所以当有电容时候,就无法振荡了。

而工业控制领域,比如温度等,都是滞后效应很严重的,往往都是mS,甚至是10mS级别的,若直接用负反馈,因为激励与反馈的不同步,必然导致强烈的振荡,所以为了解决这个问题,我们需要引入PID算法,来实现这类滞后效应严重系统的负反馈控制,我们以高频感应加热设备加热工件,从常温25度加热到700度为例做说明:

1、25~600度,100%的全功率加热工件,这是因为温差太大,前期要全功率,先加热到靠近目标温度。之所以考虑在600度,是因为滞后效应,若设定太高,当发现接近700度再停下来,但实际上,温度会冲过700度。当然,600度是一个经验值,以下几个温度点都是经验值,根据实际情况而来。

2、600以上,开启P算法,P就是根据测量值与目标值的误差来决定负反馈的大小。P算法公式:反馈=P*(当前温度-目标温度)。但因为负反馈是基于存在误差为前提的,所以P算法导致一个问题,永远到不了想要的值:700度。因为到了700度,反馈值就没有了。P算法的开启,进一步逼近了目标温度,假设稳态下可以达到650度,这样就算因为滞后效应导致的延时,也不会超过700度太多。

3、当达到P算法的稳态极限650度附近的时候,比如640度,就应该开启另外一个算法解决P算法引起的极限误差,那就是I算法。I算法就是为了消除这个P算法导致的误差值,毕竟我们想要的是700度,而不是650度。I算法,本质上讲就是获取一个700度下对应的一个驱动值,之后用这个驱动值来取代P算法,那么我们怎么得到这个驱动值呢,唯一的手段就是把之前的误差都累加起来,最后得到一个期望值,这个期望值就是我们想要的驱动值。因为只要与目标值存在误差,那么把这些误差值积累起来再去反馈控制,就能一步步的逼近目标值,这如同水温不够高,再加一点点热水,不够高再加,这样总能达到想要的水温。值得注意的是,I算法不能接入太高,必须要在P算法的后期介入,不然很容易积累过大。这个时候可以引入一个误差门限,比如误差为60,当作6来处理,误差为50,当作5来处理,消除大的误差值,具体根据项目情况决定。

4、当I算法把工件温度加热到很接近目标温度后,那么可以调节的范围就很小了,最后一点点的微动,让调节的每一次的变化,不要太大,这就是D算法。D算法本质上讲就是反对剧烈的变化,所以适用于达到目标温度的时候。

PID算法其实不复杂,但从目前看,很多人都是因为对这三者的使用条件不了解导致的问题,都是从加热一开始,三个要素都上,结果可想而知。P算法是温度接近目标值的时候用,I算法是在P算法到稳态极限的时候用,D算法是达到目标值附近的时候用。实际项目中,D算法一般不用,效果不大。假如非要找一个现实中对应的实物,那么以开关电源为例,TL431基准电源比较器可以认为是P,输出滤波电容C是I,输出滤波电感是D,两者完全等价。它们各自的应用工作点可以认为:假设目标温度700度,600~800度:P算法;640~760度:I算法;690~710度:D算法。具体值,以实验为准,数据仅供参考。

最后给出一个PID最通俗的解读:我们设计一样东西,一般都是先打个样,这个样跟我们想要的接近,但细节没到位,这就是P,样有差异,所以就要修改,拟合逼近,这就是I,到了定稿,就不允许随便修改了,就算要修改,也是有限制的修改,这就是D。

相关问答

单片机 中的 PID 算法是什么意思啊,有什么用途呢?谢谢! - ?Nov...

PID算法是一种经典的控制算法.由比例/积分/微分组成.建议看看控制理论.PID就是比例积分微分控制,在工业里面应用非常广泛,据统计,现在有一半以上以...

8位 单片机PID控制 PWM的算法如何实现,C语言计算? - 177****7...

直接配置单片机PWM输出的占空比就行了啊能帮我设计一个用单片机控制PWM占空比再控制可控硅的开端的硬件及程序。如果有发至liu983580@163.com

怎么用 单片机 的P2口 控制 步进电机驱动模块?电机 控制 模块评价...

我们采用AVR的高端单片机ATMEGA128来实现对步进电机的控制,同时采用高性价比的L298驱动芯片来驱动步进电机。这就要藉由碳刷及整流子。故我们使用AT...

...根据实际数据测出来的吗?具体测量要注意什么? 单片机 求_作业帮

[最佳回答]去不断改变参数观察输出曲线,值到找到合适的参数,一个经验丰富的工程师往往在不断改变参数的时候也遵循一定的规律.根据整定好的参数,可用如下方法...

关于DCS的现场工作站的概念-盖德问答-化工人互助问答社区

如果你是指的dcs机柜内的控制器每个公司的做法不一样一般的是单片机嵌入式开发之类的(这个好像也没什么了解的必要,对于用户来讲,因为没得选择)...

机器人巡线有哪几种算法?

(1)P比例控制,就是让他走110步,他按照一定的步伐走到一百零几步(如108步)或100多步(如112步)就停了。说明:P比例控制是一种最简单的控制方式。...积分项对...

热控专工必备知识?

1、冷热水系统基础知识:冷热水系统的设计、安装、技术要求及维护保养等。2、暖通空调系统:冷热控制系统的运作原理、控制系统构造及各部件功能;控制器的安装与...

自动 控制 原理中,为什么说系统阶次越高越难以保持稳定?

...这样做在实际应用中有个好处:由于现实中很多物理量不能用解析表达式得到,因此微分运算一般通过差分近似代替,这种运算会放大噪声影响,破坏稳定性。下图是...

怎么 控制 转差率调节电机转速-ZOL问答

——★2、可控硅调速方法:新型的电风扇控制器,利用双向可控硅来调节电压,以控制电风扇的速度。可控硅调速,还可以具备其他的功能,例如:自然风方式。有用(0)回...

plc实现电机断续前进的优缺点?

PLC编程,比较简单,而单片机编程不易掌握。PLC是生产商将其功能模块化了,并提供专用的编程软件,主要用于开关量的控制,其可靠性比较高。单片机就是一个没有外...

猜你喜欢