PID结构体
typedef struct
{
float P;
float P_OUT;
float I;
float I_OUT;
float I_LIMIT;
float D;
float D_OUT;
float OUT;
float OUT_LIMIT;
float err;
float err_err;
float err_old;
}PID_TypeDef;
PID参数初始化
void PID_Init(void)
{
/**转速PID*/
motor.PID_SPEED[MOTOR1].P = 7.0f;
motor.PID_SPEED[MOTOR1].I = 0.1f;
motor.PID_SPEED[MOTOR1].D = 0.0f;
motor.PID_SPEED[MOTOR1].I_LIMIT = 1000;
motor.PID_SPEED[MOTOR1].OUT_LIMIT = 5000;
}
PID主函数
float PID_Cal(PID_TypeDef *PID, float get, float set)
{
PID->err = set - get;
PID->err_err = PID->err - PID->err_old;
PID->P_OUT = PID->P * PID->err;
PID->I_OUT += PID->I * PID->err;
PID->D_OUT = PID->D * PID->err_err;
PID->I_OUT = (PID->I_OUT > PID->I_LIMIT)?(PID->I_LIMIT):((PID->I_OUT < -PID->I_LIMIT)?(-PID->I_LIMIT):(PID->I_OUT));
PID->OUT = PID->P_OUT + PID->I_OUT + PID->D_OUT;
PID->OUT = (PID->OUT > PID->OUT_LIMIT)?(PID->OUT_LIMIT):((PID->OUT < -PID->OUT_LIMIT)?(-PID->OUT_LIMIT):(PID->OUT));
PID->err_old = PID->err;
return PID->OUT;
}
很简单的PID函数