一、pid概述
1.p为比例(大幅度的调节),i为积分,d为微分
2.闭环系统,输入当前状态、要达到的状态,返回输出变化量(配合反馈输出当前状态使用)
例:智能车电机 输入当前值、要达到的值,根据增量式pid公式算出一个输出变化量
当前值由编码器脉冲获得,要达到的值根据赛道的判断(直道,弯道,斜坡)自己设的值,根据公式算出电机变化量返回
3.增量式pid公式:out=Kp*e0-Ki*e1+Kd*e2;(e(t)为差值)
代码
int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)
{
MotorPID.Kp = Speed_Kp;
MotorPID.Ki = Speed_Ki;
MotorPID.Kd = Speed_Kd;
MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
MotorPID.e0 =SpeedSet-count;
MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0- MotorPID.Ki * MotorPID.e1 +MotorPID.Kd * MotorPID.e2;
MotorPID.Sum+=MotorPID.DefaultSum;
if(MotorPID.Sum>MotorMax)
MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
MotorPID.Sum=MotorMin;
return MotorPID.Sum;
}
优点:只需要当前和上一个的偏差即可得出结果,不需要存储每一拍的偏差,因此占内存空间小
4.位置式pid公式
int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)
{
MotorPID.Kp = Speed_Kp;//12.0;
MotorPID.Ki = Speed_Ki;//0.5;
MotorPID.Kd = Speed_Kd;//7.0;
MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
MotorPID.e0 =SpeedSet-count;
Err_sum2+=MotorPID.e0;
MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0+ MotorPID.Ki * Err_sum2 – MotorPID.Kd * (MotorPID.e0-MotorPID.e1); 位置
MotorPID.Sum+=MotorPID.DefaultSum;
if(MotorPID.Sum>MotorMax)
MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
MotorPID.Sum=MotorMin;
return MotorPID.Sum;
}
优点: 位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了。
相比较缺点:占用内存大,浪费程序跑的时间