PID控制算法
PID控制器是一个结构简单并且成熟稳定的控制器,在工业上应用广泛。包括比例(Proportion)、积分(Integral)、微分(Differential)三个控制元素,三者是对系统偏差不同处理方式。
比例控制 P
比例控制是基础,将反馈值和期望值的差值和一个参数KP进行相乘,表示这一个控制周期对误差的矫正力度,类似火车进入火车站时候的油门量。此参数过小会导致恢复力度不足以克制干扰变大的趋势,比例参数过大会导致超调并且系统发散。
微分控制 D
微分控制是为了弥补系统矫正过程中惯性对系统稳定性的影响,根据当前的误差变化曲线的求微分得到斜率,也就是表达一个控制周期内误差变化量(本次误差减上次误差),此值乘以一个参数KD进入到系统补偿,起到一个阻尼力的作用,系统误差变化越大此阻尼作用越明显,类似火车进站时为防止速度过快超出而踩刹车产生阻力或者单摆摆动时受到的空气阻力,若没有阻力单摆将永远摆动下去,视为超调。
积分控制 I
积分控制是一个将误差进行积分然后将积分值乘以一个参数KI进入系统补偿的控制步骤,在系统误差比较小的时候的误差叫做静差,我们前面所做的补偿作用也会比较小,无法消除静差,将误差进行累加补偿便可提升矫正效果,提升控制的精准度,类似司机最后停站位置不够精准,再进行微调。积分控制是一把双刃剑,误差的积分在误差较大的时候是一个比较大的数值,过强的补偿对系统调节反而会造成干扰,因此需注意针对积分控制的优化措施积分分离和积分限幅:误差大使停止积分作用、误差小时开启,对积分效果进行限幅。
位置式和增量式
PID有位置式和增量式之分,位置式PID是根据上述理论三个环节控制处理的叠加。
增量式pid是根据位置式pid公式进行转换得出的,增量式pid只需要三次反馈和期望值的偏差,得出的是相对于上次控制量需变化的控制量。
由此可以得出增量式PID可以规避误差累积带来的干扰。由于增量式得出控制变化量,所以要和前面的结果不停累加,这样某一次故障控制产生杂波可以有比较小的影。而缺点是没有积分作用,存在稳态误差,控制精度和灵敏度不如直接控制执行机构的位置式PID,根据被控对象的特征选择两种PID进行控制。因为无人机对高速响应和精度的要求,这里使用位置式PID。
PID算法的C语言实现
这里推荐 《PID控制算法的C语言实现》里面除了详细的概念讲解、基本的C语言实现,还有积分分离、限幅等重要操作。
pid三种调节并不一定都同时使用,根据各自作用进行选择,下面贴出笔者使用的可控制选项的位置式pid控制的C语言函数
void position_PID(pid_t *PID,float target,float measure,uint8_t mode)
{
switch(mode)
{
case P: { PID->Ki=0;PID->Kd=0;break; }
case PD:{ PID->Ki=0;break; }
case PI:{ PID->Kd=0;break; }
default:break;
}
PID->err_now = target - measure;
PID->integral += PID->err_last;
if(PID->err_now > PID->threshold || PID->err_now < -PID->threshold )
{
PID->remove_flag = 0;
PID->integral = 0;
}
else
{
PID->remove_flag = 1;
}
PID->pwm_out = PID->Kp * PID->err_now;
PID->pwm_out += PID->Kd * (PID->err_now-PID->err_last);
PID->pwm_out += PID->Ki * PID->integral*PID->remove_flag;
PID->err_last =PID->err_now;
}
注:
- 偏差有正负之分
- 积分的限幅、分离、清零处理很重要,积分这种调节方式风险较大,如果处理不当,偏差的累计造成的误差将压垮系统。积分分离可用积分计算时乘以标志位的方式,偏差大时标志位置0关闭积分调节
- 微分调节效果和控制周期关系很大
- 串级pid的实现需要注意外环和内环的衔接关系,控制器的输出作为输入的时候可进行限幅及归一化(映射成下一环期望允许的范围)等数据处理,已达到更准确的控制效果
- 多环控制器调参建议先调整内环再调整外环
- 伺服系统(伺服电机或舵机)内部自带控制器