一、简述
pid控制算法核心有三个参数控制,分别是Kp、Ki、Kd,分别代表着比例环节、积分环节、微分环节。
具体实现时表示为输出设备将实际数值传输回输出端,输出端拿到数据计算实际值和理想数据的差距,使用该差距进行比例环节、积分环节、微分环节后得到一个数值给输出端,随后输出端就使用该值控制设备改变状态。
该控制算法的最简表示是一个单闭环的系统,但是也可以优化成一个多闭环结合的串行pid。
二、三个具体参数的含义
1、Kp,p就是比例(Proportional)的英文首字母,可以根据当前误差的大小来调整系统的输出。比例系数越大,系统对于误差的响应就越灵敏。举例如对电机转速进行调节,如果理想为100转每分(后文忽略单位),而目前为0,则计算差值为100,使用Kp*100得到的数值就可以输出给电机让电机转的更快,随后再返回实际值如50.那么差值就是50,再和p相乘那对电机转速的提高就减弱,如此反复。
2、Ki,i就是积分(Integral)的首字母,可以根据过去误差的大小和方向来调整系统的输出,主要用于消除稳态误差,提高系统的无差度。从上述使用p对系统调节就可以发现,当电机转速到达与理想值极小差距时,比例环节产生的输出值会很小,在某些需要输出值与某些固定变量抵抗时,就会出现无法到达目标值的稳定状态,比如电机必须10数值的力才能保持不减速,那么当kp*差值=10的时候,虽然还有误差但是差距再也无法减小,这就是静态误差的产生原因。
因此积分环节就是将从一开始p环节产生的力不断累加进行积分,最后在遇到阻力时加上积分环节的力就有机会到达预设值,i环节的积分就会等于环境中的阻力,例如电机问题中需要的10的力。
3、Kd,d是微分(Derivative)。根据误差的变化趋势来调整系统的输出,对系统有一个阻尼作用,加快系统的响应速度。因为pi环节每次输出后再接受反馈是有一定时间间隔的,如果p值太大,比如kp等于100,那么电机第一次被输出10000的力,可能在下一次反馈是电机速度已经到了150,那么又要施加反向的力,如此反复趋于理想值。
而d环节就是对反馈回来计算后的差值随时间变化的微分,如果差值有减小的趋势,微分得出的值就是负值,用来减小前两个环节算出的值,达到阻力作用,可以让电机转速更快更稳定的到达预设值。
三、参数调节
一般在pid调参时会先调p,然后i,最后d,同时也有系统会出现pi控制和pd控制的情况,但都会先调节p值,因为这是一般情况下输出值的主要构成,先得出p就能根据输出反馈在进行后续微调。一般来说kp值太大会导致变化过大超过某些限定值,可以从较小值慢慢调大,需要适中调节;ki太小消除静差的效果会不明显,所以可以尽量给大值;kd则不能给太大,若太大对数据差值太敏感会震荡很久才稳定,阻尼效果变差。
四、部分代码实现
控制电机输出时的单环pid控制算法简单代码
motor_pid[i].speedpid.current = motor_chassis[i].speed_rpm;
void pid_calc(_pid* pid)
{
pid->cha = pid->target - pid->current;
pid->pout = (int32_t)(pid->Kp * pid->cha);
//p环节
pid->iout += (int32_t)(pid->Ki * pid->cha);
//i环节
pid->dout = (int32_t)(pid->Ki * (pid->cha - pid->last->cha));
//d环节
pid->out = pid->pout + pid->iout + pid->dout; //计算最终输出
pid->last->cha = pid->cha;
}
以上就是目前为止对pid算法学习的一些简略收获。