PID原理介绍
大家在调节电机转速或者一些需要控制的程序之中,为了更好的实现自己想要的结果,PID控制就是比较好用的控制误差的一种方法。
今天为大家分享一下我暑假做智能车时对增量式PID控制和位置式PID控制的了解,分为原理讲解和代码讲解两部分。
公式:
Kp:比例系数,可以调节到里目标值相近,但是无法到达目标值,只能粗调,存在误差。
Ki:积分系数,控制系统的准确性,逐渐消除累计的误差,使输出值达到目标值。
Kd:微分控制,具有超前控制的作业,能让输出值快速到达目标值。同时防止超出。
一、增量式PID
(1)、原理
增量式PID一般用于对速度进行控制,在行进过程中,为了保持速度稳定一般采取增量式的PI控制,闭环电机的速度环,增量式PID比位置式更加敏捷,在调节速度的时候可以更快更好的反应速度输出。
(2)、代码实现
NowSpeed编码器数据
ExpectSpeed目标速度
/*
* @brief 电机增量式PID:左轮
* @param NowSpeed实测速度 ExpectSpeed目标速度
* @return Increase 反馈增量值
*/
static int MotorPID_output(int NowSpeed, int ExpectSpeed)
{
//当前误差,定义为寄存器变量,只能用于整型和字符型变量,提高运算速度
int iError, //当前误差
Increase; //最后得出的实际增量
iError = ExpectSpeed - NowSpeed; //计算当前误差
Increase = speed_kp * (iError - LastError)+ speed_ki * iError+speed_kd * ((iError - LastError) - PrevError);
PrevError = iError - LastError;
LastError = iError;
return Increase;
}
二、位置式PID
(1)、原理
位置式是离散型的PID,会有误差,速度比较慢
(2)、代码实现
/*位置式pid
@param pid 要计算的pid
@param set_value 想要设定的值
返回 增量
*/
float position_pid(PID *pid,float set_value,float actual_value)
{
pid->error = set_value - actual_value;
pid->integral += pid->error; /*误差累积*/
if(pid->integral > +1200) pid->integral = +1200; //积分限幅
if(pid->integral < -1200) pid->integral = -1200;
//比例项
pid->P = pid->Kp*pid->error;
//积分项
pid->I = pid->Ki*pid->integral;
//微分项
pid->D =pid->Kd*(pid->error-pid->error_pre);
pid->error_pre_pre = pid->error_pre;
pid->error_pre = pid->error;
float uk = pid->P + pid->I +pid->D;
actual_value += uk;
return uk;
}
了解的比较粗糙,不会写文章,写的不好勿喷,如有侵权可告知删除