前言
一、为什么使用PID
PID 算法是控制领域非常常见的算法,小到控制温度,大到控制飞机的飞行姿态和速度等等,都会涉及到 PID 控制,在控制领域可以算是万能的算法,如果你能够掌握 PID 算法的控制与实现,那么已经足以应对控制领域的一般问题了。
二、PID算法介绍
PID 是 Proportional(比例)、 Integral(积分)、 Differential(微分)的首字母缩写;是一种结合比例、积分和微分三种环节于一体的闭环控制算法,它是目前为止在连续控制系统中计数最为成熟的
一种控制算法。
pid控制效果图演示
- 比例(P)
- 比例控制器的输出与输入成正比关系,能够迅速的反应偏差,偏差减小的速度取决于比例系数 Kp,Kp 越大偏差减小的就越快。
- 该环节可以提高系统的响应速度,但容易引起震荡,以及存在不能消除的静态误差。
- 积分(I)
- 在比例控制环节产生了静态误差,通过引入积分环节,对输入偏差进行积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。积分作用的强弱,取决于积分时间常数 Ti, Ti 越大积分作用越弱,反之则越强。
- 该环节的主要作用是消除静态误差,提高系统的无差度。但也会降低系统的响应速度,此外,积分环节作用太强,会使系统超调增大,甚至出现震荡。
- 微分(D)
- 微分环节的作用是反应系统偏差的一个变化趋势,即变化率,可以在误差来临之前提前引入一个有效的修正信号,有利于提高输出响应的快速性, 减小被控量的超调和增加系统的稳定性。但容易引入高频噪声,此外微分时间常数过大,会使系统出现不稳定的情况。
- 适合具有较大惯性的被控对象使用 PI 控制器很难得到很好的动态调节品质,系统会产生较大的超调和振荡,这时可以引入微分作用。
- 不适合干扰信号比较严重的流量控制系统,容易引入高频噪声。
位置式PID
位置式PID优缺点:
- 此种方法为一种非递推式算法,可以直接控制执行机构,输出值与执行机构的实际位置是一一对应的。
- 每次输出均与过去的状态有关,计算时需要对e(k)进行累加,容易产生较大的累计误差(积分饱和现象),运算工作量大。
- 位置式适用于执行机构不带积分部件的对象,如电液伺服阀。
- 需要进行积分限幅和输出限幅。
增量式PID
增量式PID优缺点
- 误差不需要累加,仅与最近的三次采样值有关,误动作影响小。
- 手动/自动切换时冲击小,便于实现无扰动切换。
- 有产生比例和微分失控现象的可能,导致系统的动态性能变坏。
- 增量式控制输出的是增量,无积分作用,适用于执行机构带积分作用的部件,如步进电机。
- 需要进行输出限幅。
三、PID使用例程
需要学会系统分析和系统框图的绘制,大多数的问题都来源于这两处的模糊不清。
四、 PID算法的C语言实现
以下只列出PID算法的结构体设计,代码按照公式编写就完了。
位置式PID
/* 位置式pid数据结构 */
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float Kd; // 微分系数
float setpoint; // 设定值
float actpoint; // 实际值
float integral; // 积分项累计值
float prev_error; // 上一次误差值
float output_min; // 输出最小值限制
float output_max; // 输出最大值限制
} PositionalPID;
/* 增量式pid数据结构 */
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float Kd; // 微分系数
float setpoint; // 设定值
float actpoint; // 实际值
float prev_error; // 上一次误差值
float prev_prev_error; // 上上次误差值
float output_min; // 输出最小值限制
float output_max; // 输出最大值限制
float last_output; // 上一次输出值
} IncrementalPID;