智能车电机增量式PID控制算法
Pid_Inc Right;
Pid_Inc Left;
int16 PulseRight=0;
int16 PulseLeft=0;
int16 P_SET=0;
int16 I_SET=0;
int16 D_SET=0;
void Pid_Inc_Init()
{
Right.P = P_SET; //p参数
Right.I = I_SET; //i参数
Right.D = D_SET; //d参数
Right.Err = 0.0; //偏差值
Right.Err_Last = 0.0; //定义上上个偏差值
Right.Err_Next = 0.0; //定义上一个偏差值
Right.Set_Speed = 0; //设定的速度
Right.Actual_Speed = 0.0; //定义实际速度
Right.Out = 0.0; //电机输出
Right.increment = 0.0; //定义增量
Right.proportion = 0.0; //PID比例项
Right.integration = 0.0; //PID积分项
Right.differential = 0.0; //PID微分项
Left.P = P_SET; //p参数
Left.I = I_SET; //i参数
Left.D = D_SET; //d参数
Left.Err = 0.0; //偏差值
Left.Err_Last = 0.0; //定义上上个偏差值
Left.Err_Next = 0.0; //定义上一个偏差值
Left.Set_Speed = 0; //设定的速度
Left.Actual_Speed = 0.0; //定义实际速度
Left.Out = 0.0; //电机输出
Left.increment = 0.0; //定义增量
Left.proportion = 0.0; //PID比例项
Left.integration = 0.0; //PID积分项
Left.differential = 0.0; //PID微分项
}
void Pid_Deal(Pid_Inc *pid)
{
pid->Err = pid->Set_Speed - pid->Actual_Speed;
//偏差 = 期望 - 实际
pid->proportion = pid->P * (pid->Err - pid->Err_Next);
//比例
pid->integration = pid->I * pid->Err;
//积分
pid->differential = pid->D * (pid->Err - 2*pid->Err_Next + pid->Err_Last);
//微分
pid->increment = pid->proportion + pid->integration + pid->differential;
//增量 = 比例 + 积分 + 微分
pid->Out += pid->increment;
//输出
pid->Err_Last = pid->Err_Next;
//上上次偏差赋值
pid->Err_Next = pid->Err;
//上次偏差赋值
}