经典控制器-PID
Table of Contents
PID 是历史最久,应用最广,适应性最强的一种控制方式.
PID 的简单介绍
网络上有很多关于 PID 的资料,我查看的最多的就是 PID 控制器 - 维基百科,自由的百科全书.个人认为其内容比较准确.各种公式和解释都可以在其中找到.
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称 PID 控制,又称 PID 调节。PID 控制器问世至今已有近 70 年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。 当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用 PID 控制技术最为方便。即当我们不完全了解一个系统和被控对象﹐或不能通过有效的测量手段来获得系统参数时,最适合用 PID 控制技术。 PID 控制,实际中也有 PI 和 PD 控制。PID 控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
在最开始学习 PID 的时候,我在网络上找到了这篇文 PID 控制原理:看完这三个故事,你就明白了, 其内容通俗易懂,看完之后可以对 PID 有一个简单的理解. 在这里,我引用其中的一段.
PID 控制器的一般规律
- 比例控制 P 比例控制考虑当前误差,误差值和一个正值的常数 Kp( 表示比例 ) 相乘.Kp 只是在控制器的输出和系统的误差成比例的时候成立.比例控制是一种最简单的控制方式.其控制器的输出与输入误差信号成比例关系.当仅有比例控制时系统输出存在稳态误差.
- 积分控制 I 积分控制考虑过去误差,将误差值过去一段时间和 ( 误差和 ) 乘以一个正值的常数 Ki.Ki 从过去的平均误差值来找到系统的输出结果和预定值的平均误差.一个简单的比例系统会震荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正.通过加上负的平均误差值.平均系统误差值就会渐渐减少.
- 微分控制 D 微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数 Kd 相乘.这个导数的控制会对系统的改变作出反应.导数的结果越大,那么控制系统就对输出结果作出更快速的反应.这个 Kd 参数也是 PID 被称为可预测的控制器的原因.Kd 参数对减少控制器短期的改变很有帮助.一些实际中的速度缓慢的系统可以不需要 Kd 参数.
PID 控制器系数的定性分析
- 增大比例系数 P 一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。
- 增大积分时间 I 有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。
- 增大微分时间 D 有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。
PID 算法的数学模型
经典模型
PID 算法的经典模型可用如下公式进行表示: $$u(t)=K_p{e(t)}+K_i\int_0^t{e(\tau)}\,{d\tau}+K_d{\frac{d}{dt}}e(t)$$ 其中:
- \(K_p\):比例增益,是调适参数
- \(K_i\):积分增益,也是调适参数
- \(K_d\):微分增益,也是调适参数
- \(e\):误差=设定值(SP)- 回授值(PV)
- \(t\):目前时间
- \(\tau\):积分变数,数值从 0 到目前时间 t
离散化模型
离散化模型有两种表示方式:
分别为位置式 (1) 和增量式 (2)
$$\begin{array}{ll} u(t_k)={K_p}e(t_k)+K_i \sum_{i=1}^n e(t_i)+K_d\left[e(t_k)-e(t_{k-1})\right] & (1) \\ u(t_k)=u(t_{k-1})+K_p\left[e(t_k)-e(t_{k-1}\right]+K_i e(t_k)+K_d \left[e(t_k)-2e(t_{k-1})+e(t_{k-2})\right] & (2) \end{array}$$
PID 控制器的应用和实现
积分分离的 PID 控制器
在一般的 PID 控制方式中,在开始或停止工作的瞬间,或者大幅度地给定量时,由于偏差较大,在积分项的作用下,将会产生一个很大的超调。 为此,可以采用积分分离手段,即在被控制量开始跟踪时,取消积分作用,直到被控制量接近新的给定值时,才可以在 PID 算式中,引入如下的算法逻辑功能。 $$\begin{array}{ll} u(k)=K_pe(k)+\beta K_i\sum_{i=0}^{k}e(i)+K_d[e(k)-e(k-1)] \\其中\, \quad \beta = \left\{ \begin{array}{ll}1\, \quad e(k)\le\varepsilon \\ 0\, \quad e(k)>\varepsilon \end{array} \right. \, \quad \varepsilon 为积分阈值.\end{array}$$
PID 控制器的 C 语言实现
我用 C 语言实现了一个简单的 PID 控制器.代码如下:
#include "math.h" typedef struct _pid_t{ double sp,pv; //设定值,反馈值 ( 测量值 ) double Kp,Ki,Kd; //比例系数, 积分系数, 微分系数 double intergral; //积分值 double err_last; //前一次误差值 double threshold; //分离积分阈值 double umax,umin; //积分限幅 } pid_t; double pidCalc(pid_t* pid) { double error; double output; double intergral; // 计算偏差 error = pid->sp - pid->pv; // 计算比例相 output = pid->Kp*error; // 计算积分相 ( 分离积分 ) if(fabs(error)<pid->threshold) { intergral = pid->intergral+error; intergral = fmin(intergral, pid->umax); intergral = fmax(intergral, pid->umin); pid->intergral = intergral; output += pid->Ki*intergral; } // 计算微分相 output += pid->Kd*(error - pid->err_last); pid->err_last = error; return output; }