一、基本参数
PID控制算法有几个关键的参数Ts(采样时间),Kc(Gain,增益),Ti(积分时间常数),Td(微分时间常数)。PID参数的取值,以及它们之间的配合,对PID控制是否稳定具有重要的意义。
采样时间就是对反馈进行采样的间隔。短于采样时间间隔的信号变化是不能测量到的。过短的采样时间没有必要,过长的采样间隔显然不能满足扰动变化比较快、或者速度响应要求高的场合。
增益与偏差(给定与反馈的差值)的乘积作为控制器输出中的比例部分。提高响应速度,减少误差,但不能消除稳态误差,当比例作用过大时,系统的稳定性下降。
偏差值恒定时,积分时间决定了控制器输出的变化速率。积分时间的长度相当于在阶跃给定下,增益为“1”的时候,输出的变化量与偏差值相等所需要的时间,也就是输出变化到二倍于初始阶跃偏差的时间。如果将积分时间设为最大值,则相当于没有积分作用。
偏差值发生改变时,微分作用将增加一个尖峰到输出中,随着时间流逝减小。微分时间越长,输出的变化越大。微分使控制对扰动的敏感度增加,也就是偏差的变化率越大,微分控制作用越强。微分相当于对反馈变化趋势的预测性调整。如果将微分时间设置为0就不起作用,控制器将作为PI调节器工作。
二、PID基本特点
比例调节:提高响应速度,减少误差,但不能消除稳态误差,当比例作用过大时,系统的稳定性下降。(由小到大单独调节)
积分调节:增大积分时间 I 有利于减小超调,减小振荡。消除稳态误差,使系统的动态响应变慢,积分时间越小,积分作用越大 ,偏差得到的修正越快,过短的积分时间有可能造成不稳定。(将调好的比例增益调整到50%~80%后,由大到小减小积分时间)
微分调节:增大微分时间D有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。超前调节,能预测误差变化的趋势,提前抑制误差的控制作用,从而避免了被控量的严重超调。可以改善系统的响应速度和稳定性,对噪声干扰有放大作用,对具有滞后性质的被控对象,应加入微分环节。
三、常用口诀
参数整定找最佳,从小到大顺序查;先是比例后积分,最后再把微分加;曲线振荡很频繁,比例度盘要放大;曲线漂浮绕大湾,比例度盘往小扳;曲线偏离回复慢,积分时间往下降;曲线波动周期长,积分时间再加长;
四、公式
4.1.理想连续公式:
4.2.应用离散公式:
五、PID控制优化
虽然PID控制对于大多数工业控制应用而言都是不错的选择,但有时它不足以处理具有挑战性或无法归结为简单设定值(SP)、过程变量(PV)和控制变量(CV)的系统。有些系统的死区时间较长,即 CV 发生变化到 PV 发生明显变化所需的时间。在这种情况下,有六种先进策略可以简化流程,帮助在具有挑战性的应用中补充 PID控制。
5.1.调谐仪表以获得更好的PID结果
PID 的 PV 输入驱动着控制环路其他部分的一切运行。有噪声的测量会使偏差计算(SP和PV之间的差值)不稳定。
在对输入和输出(I/O)进行扫描的单个周期内,如果偏差出现显著变化或波动,那么微分输出就比较大,CV会立即冲到最小或最大值。调整或更换产生噪声PV的仪表,可以将不稳定的控制回路转变为性能良好的系统。
5.2.信号滤波清理PID信息
一些过程参数有噪声,仪表会准确记录这些噪声。处理该噪声的一种方法是使用信号滤波。这种方法包括对PV使用基于时间的滤波器,并将瞬时信号替换为某个时间段内的平均值。
在选择滤波方案时,目标应该是在消除噪声的同时尽可能多地保留有意义的信号。重要的是要记住,PID积分项是对偏差的时间滤波评估,因此应用了两次滤波。为了控制带噪声的PV,一些控制回路的调整过于激进。在这种情况下,减少增益以对PID进行去调谐,将比信号滤波效果更佳。信号滤波可能会对运行人员和控制回路隐藏重要的过程信息,因此要谨慎使用。
5.3.级联控制,使用一个PID来控制另一个PID
控制高难度PV的另一种方法,是使用一个PID来控制另一个PID,这被称为级联PID控制。高优先级PV被馈送到低速主PID,该主PID将动态SP发送到快速二级PID,该二级PID控制不同的二级PV,然后通过过程交互影响主PV。例如,蒸汽热交换器的压力是一个快速变化的属性,可以通过调节来控制流出热交换器的流体的慢速温度。通过控制次级PV(压力),可以使初级PV(温度)更快地达到其SP值,并使其保持在SP值上,几乎不会出现直接使用单个PID控制温度所产生的振荡。
5.4.前馈控制:基于未来预期的变化
有时,控制系统设计者准确地知道:CV变化时PV将如何反应,他们可以将这些知识编码到控制策略中。这就是广泛使用的前馈。PID系统基本上是一种反馈方案,在CV发生变化,测量由此产生的PV变化以计算新的偏差项。在前馈中,控制逻辑使用CV变化来计算误差项的预期变化,并将其用于 PID逻辑。
许多现代PID控制逻辑对象都包含一个前馈项的输入,它通常有自己的增益调整常数。通常情况下,如果比例-积分 (PI) 控制器出现问题,最好的改进方法是增加一些前馈项,而不是增加微分控制,前提是能找到合适的前馈变量。
5.5.增益调度有时可以帮助PID
对于在预定运行范围内是非线性的过程,如果运行范围内的每一段基本上都是线性响应,那么PID控制仍然是一种选择。可以为每个分段确定比例、积分和微分增益,然后在PID对象中进行编程,以便在流程沿不同线性域移动时对其进行更改。这通常称为增益调度。
在进行增益调度时要谨慎,要特别注意增益区间的界限。如果该过程经常在边界附近运行,则应考虑更改增益调度,以避免在增益之间频繁切换。
5.6.模型预测控制可利用控制器的强大功能
现代PLC和DCS中使用更快的中央处理单元(CPU)。有些人可能还记得,为了避免控制器出现故障或跳过例程,人们曾煞费苦心地管理控制器内存使用率和时钟周期。现在,控制器的CPU具有惊人的计算能力,这开启了被称为模型预测控制(MPC)的控制方案创新。在MPC中,控制系统工程师与物理过程方面的专家合作,为物理过程设计一个数学模型,并将其置于控制器中。这种实时过程模型使控制逻辑能够预测不同CV设置下所有相关的PV变化。这些预测用于确定实现整体工艺过程状态所需的最佳CV更改。
六、微分电路和积分电路
6.1.分压电路
首先我们先来认识最简单的分压电路,如图根据欧姆定律VCC=2.5V,该纯阻性的分压电路就是比例运算电路的雏形。
6.2.积分电路
我们把R2换成104(0.1μF)电容,C1电容充满电后近似开路,VCC=5V;该电路就是积分运算电路的雏形。那么把5V改成信号源就构成了低通滤波电路。
下图为上图的充电波形,红色表示5V的波形,蓝色表示VCC的波形,因为电容充电时的容抗由小变大直至开路,所以分压VCC也由小变大直至为5V。而且电容充电需要一定的时间,导致VCC的波形要缓一些。(该5V是开关电源上电软启动时的输出波形)
6.3.PI电路
把上面两个电路组合就得到下图的电路,这就是我们经常使用的PI电路(比例积分),在参考电压或分压电路里很常见,加电容的目的就是增加延时性,稳定VCC的电压不受5V波动而波动,VCC=2.5V。
6.4.微分电路
将 <6.2.积分电路> 的电容和电阻的位置交换一下得到下图的电路,C1电容充满电后近似开路,VCC=0V;该电路就是微分运算电路的雏形。那么把5V改成信号源就构成了高通滤波电路。
下图为上图的充电波形,红色表示5V的波形,蓝色表示VCC的波形,因为电容充电时的容抗由小变大直至开路,所以分压VCC由大变小直至为0V。也就是红色波形从0开始跳变一瞬间,VCC已经是最大值,所以微分有超前预判的性质(反映的是输入信号的变化率)。
七、PID算法简单代码
PID 控制算法可以分为位置式 PID 和增量式 PID 控制算法。
两者的区别:
(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。
7.1.位置式PID
typedef struct
{
float Kp; //比例系数Proportional
float Ki; //积分系数Integral
float Kd; //微分系数Derivative
float Ek; //当前误差
float Ek1; //前一次误差 e(k-1)
float Ek2; //再前一次误差 e(k-2)
float LocSum; //累计积分位置
}PID_LocTypeDef;
/************************************************
函数名称 :PID_Loc
功 能 :PID位置(Location)计算
参 数 :SetValue ------ 设置值(期望值)
ActualValue --- 实际值(反馈值)
PID ----------- PID数据结构
返 回 值 :PIDLoc -------- PID位置
作 者 :strongerHuang
*************************************************/
float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
{
float PIDLoc; //位置
PID->Ek = SetValue - ActualValue;
PID->LocSum += PID->Ek; //累计误差
PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);
PID->Ek1 = PID->Ek; return PIDLoc;
}
7.2.增量式PID
typedef struct
{
float Kp; //比例系数Proportional
float Ki; //积分系数Integral
float Kd; //微分系数Derivative
float Ek; //当前误差
float Ek1; //前一次误差 e(k-1)
float Ek2; //再前一次误差 e(k-2)
}PID_IncTypeDef;
/************************************************
函数名称 :PID_Inc
功 能 :PID增量(Increment)计算
参 数 :SetValue ------ 设置值(期望值)
ActualValue --- 实际值(反馈值)
PID ----------- PID数据结构
返 回 值 :PIDInc -------- 本次PID增量(+/-)
作 者 :strongerHuang
*************************************************/
float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
{
float PIDInc; //增量
PID->Ek = SetValue - ActualValue;
PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);
PID->Ek2 = PID->Ek1;
PID->Ek1 = PID->Ek; return PIDInc;
}
相关文章: