几种常用的PID控制方式(入门推荐)

        笔者最近做比赛,就顺便研究了一下几种常用的PID控制方法,首先我会对PID控制系统做一个简要的说明和自我理解,以方便刚入门的小白快速的理解和使用,不涉及深入的原理以及公式,如有错误,烦请指出,(大佬务笑)后面我会给出PID的初始化以及控制算法的源码,方便大家使用。需要的直接cv复制就可以了。

1、什么是PID?
P比例(proportional)

I积分(integral)

D微分(derivative)

曾经, 在我们非计算机控制领域流传着这样一张图几种常用的PID控制方式(入门推荐)_第1张图片

 emmmm.....说的确实也没错,在控制领域中不得不说,PID真的是万能的,而且调起来更多的是体力活,费脑子的很少。。。。

像笔者这种懒人就非常喜爱PID调参(所以我直接懒到和你们讲原理,并且直接放出源码。。。要是想看原理有很多优秀的文章写的比我好)

好了,简单介绍一下: 

kP(比例控制,最基本):目标值减去当前值,然后与控制系统建立一个一次函数的关系,其中kP越大,调节作用越强,kP越小,调节作用越弱。

kI(积分控制,一般用的少):设置一个积分量。只要偏差存在,系统就会不断地对偏差进行积分(累加),并反应在调节力度上。

kD(微分控制):与kP相反,相当于阻尼控制。让被控制物体的变换速度趋于0,且kD值越大,阻尼越强烈。

好了你现在已经学会了(不是),下面放上源码,仅供参考
 

2、PID初始化函数

// pid参数初始化函数(非常简单)
void PidInit()
{
  pid->kp        = 0;    //KP为比例带的倒数,比例带越小,KP越大,对误差越敏感
  pid->ki        = 0;    //引入的积分的目的是消除稳态误差
  pid->kd        = 0;
  pid->imax      = 0;
  pid->out_p     = 0;
  pid->out_i     = 0;
  pid->out_d     = 0;
  pid->out       = 0;
  pid->integrator= 0;
  pid->last_error= 0;
  pid->last_darivative   = 0;
  pid->last_t    = 0;
}

3、位置式PID:

        当前的输出与过去的所有状态都有关系(积分累加也就是误差累加),并且控制器的输出就是实际的输出结果,一旦控制输出出错,那么整个系统都可能奔溃,并且在整定参数时,要防止过冲现象,需对积分处理部分进行特别处理。

float PidLocCtrl()
{
  /* 累积误差 */
  pid->integrator += error;
  /* 误差限幅 */
  constrain_float(pid->integrator, -pid->imax, pid->imax);
  pid->out_p = pid->kp * error;
  pid->out_i = pid->ki * pid->integrator;
  pid->out_d = pid->kd * (error - pid->last_error);
  
  pid->last_error = error;

4、增量式PID

       增量式的PID输出只是控制量的增量,计算输出的结果是实际输出的增量。而实际的计算结果  +  当前的位置值   才是最终的输出,当控制输出出错时,对系统影响会小很多。

float PidIncCtrl()
{
  pid->out_p = pid->kp * (error - pid->last_error);
  pid->out_i = pid->ki * error;
  pid->out_d = pid->kd * ((error - pid->last_error) - pid->last_derivative)
  //derivative上次误差与上上次误差之差
  pid->last_derivative = error - pid->last_error;
  pid->last_error = error
  pid->out += pid->out_p + pid->out_i + pid->out_d
  return pid->out;
}

5、串级PID

这个不太好说明,比较复杂,这里直接给个大概的公式:

1、角速度环输出值= 角度环输出值-(角速度值-陀螺仪y轴零点偏差参数)

2、角度环输出值=机械零点的角度值+陀螺仪安装位置角度值-速度环输出值

3、速度环输出值=期望值-(编码器1+编码器2)/2

4、方向环输出值=目标偏差值-(z轴角速度值-陀螺仪z轴零点偏差值)

以上仅是本人的浅薄理解和方法提供,有误请指出,本方案仅供参考,谢谢~

你可能感兴趣的:(单片机,c语言,算法)