一、是什么是PID
P:比例 proportional
I: 积分 integral
D:微分 derivative
二、参数调整
Kp:比例系数:
让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系
Kp 参数越大,调节作用越激进,参数越小,调节作用越保守。
Kd微分系数: 更注重于当前状态
你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。
Kd就相当于水的阻力,作用就是让系统尽快达到稳定状态。
Ki积分系数: 注重于系统整体过程
设置一个积分量,只要误差一直存在,就会对偏差不断进行累加,反应在调节力度上。
三、位置式PID
e(k): 用户设定的值(目标值) - 控制对象的当前的状态值
比例P : e(k)
积分I : ∑e(i) 误差的累加(包括e(k))
微分D : e(k) - e(k-1) 这次误差-上次误差
位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制。
注意: 参数Ki作用的是积分项,与过去的状态都有关 ,所以当系统的值突然大幅度变化时就会引起整体大幅度变化。并且在积分项饱和时 系统还需要一段时间才能稳定,需要积分限幅输出限幅。
位置式PID,一般直接使用PD控制。
//pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
typedef struct PID
{
float kp;
float ki;
float kd;
float ek; //当前误差
float ek_1; //上一次误差
float ek_sum; //误差总和
float limit; //限幅
}PID;
static PID pid;
void PID_Init()
{
pid.kp = 0.1;
pid.ki = 0.2;
pid