经典控制器-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;
}

Date: <2017-04-06 Thu>

Author: Matrikslee

Created: 2017-05-29 Mon 17:56

Emacs 25.2.1 (Org mode 8.2.10)