PID控制是大家在智能车制作中碰到最常见的算法,它主要分两种:位置式和增量式。下面来谈谈这两种PID的特点以及代码实现。
1. 位置式PID
特点:位置式PID用到了过去所有误差值的积分,因此与过去的整个状态有关。
代码实现:
typedef struct PID //定义结构体
{
float LastError; //上一次误差
float SumError; //误差积分项
} PID;
static PID sPID;
static PID *sptr=&sPID;
void PID_init(void) //指针初始化
{
sptr->LastError = 0;
sptr->SumError = 0;
}
float PIDCalc(float NextPoint)
{
float dError,Error;
Error = SetPoint - NextPoint; // 偏差
sptr->SumError += Error; // 积分
dError = Error - sptr->PrevError; // 当前微分
sptr->LastError = Error;
return ( KP* Error // 比例项
+KI * sptr->SumError // 积分项
+KD* dError ); // 微分项
}
2. 增量式PID
特点:由于增量式PID输出的是控制量增量,误动作影响较小
代码实现:
typedefstruct PID
{
float V_lasterror; //Error[-1]
float V_preserror; //Error[-2]
}PID;
staticPID sPID;
staticPID *sptr=&sPID;
voidPID_Init(void) //指针初始化
{
sptr->V_lasterror = 0; //Error[-1]
sptr->V_preserror = 0; //Error[-2]
}
voidPID_caculate(u16 Set_Value,float Get_Value)
{
float g_fDirectionControlOut1=0;
V_error=Get_Value-Set_Value;
g_fDirectionControlOut1= P *(V_error-sptr->V_lasterror) + I * V_error + D(V_error-2*sptr->V_lasterror+sptr->V_preserror);//计算当前输出增量
sptr->V_preserror =sptr->V_lasterror; //存储误差,用于下次计算
sptr->V_lasterror = V_error;
g_fDirectionControlOut2 += g_fDirectionControlOut1;//上一次输出量加上当前输出增量
g_fDirectionControlOutOld = g_fDirectionControlOutNew;
g_fDirectionControlOutNew =g_fDirectionControlOut2;
}
关于P、I、D三个环节的选择,一般只会用到PI控制或者PD控制,例如速度控制要求稳态无误差,那么就需要积分环节,所以使用PI控制;而使用方向控制的时候,由于不需要无稳态误差,所以使用PD控制即可,D的作用是消除P环节所带来震荡。
联系我们
淘宝店铺 : http://shop60443799.taobao.com/
技术交流QQ群 :108190422 摄像头群
132879827 光电群
118404899 电磁群
技术交流邮箱 : demok@vip.qq.com
技术论坛 : http://blog.csdn.net/demok2010
官方网站 : www.demok.com.cn