【智能车新手入门】-位置式、增量式PID实现代码

时间:2021-04-23 20:11:30

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