pid

一、pid概述

1.p为比例(大幅度的调节),i为积分,d为微分

2.闭环系统,输入当前状态、要达到的状态,返回输出变化量(配合反馈输出当前状态使用)

例:智能车电机 输入当前值、要达到的值,根据增量式pid公式算出一个输出变化量

       当前值由编码器脉冲获得,要达到的值根据赛道的判断(直道,弯道,斜坡)自己设的值,根据公式算出电机变化量返回

3.增量式pid公式:out=Kp*e0-Ki*e1+Kd*e2;(e(t)为差值)

   代码

int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)         
{    
    
MotorPID.Kp = Speed_Kp;
MotorPID.Ki = Speed_Ki;
MotorPID.Kd = Speed_Kd;
        MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
        MotorPID.e0 =SpeedSet-count;

       MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0- MotorPID.Ki *  MotorPID.e1 +MotorPID.Kd *  MotorPID.e2; 

       MotorPID.Sum+=MotorPID.DefaultSum;
       
        if(MotorPID.Sum>MotorMax)
  MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
  MotorPID.Sum=MotorMin;        
 return MotorPID.Sum;
}      

优点:只需要当前和上一个的偏差即可得出结果,不需要存储每一拍的偏差,因此占内存空间小

4.位置式pid公式

int32_t MotorPidCal(int16_t count,uint16_t SpeedSet,float Speed_Kp,float Speed_Ki,float Speed_Kd)         
{    
    
MotorPID.Kp = Speed_Kp;//12.0;
MotorPID.Ki = Speed_Ki;//0.5;
MotorPID.Kd = Speed_Kd;//7.0;
        MotorPID.e2=MotorPID.e1;
MotorPID.e1=MotorPID.e0;
        MotorPID.e0 =SpeedSet-count;
      Err_sum2+=MotorPID.e0;
     
   MotorPID.DefaultSum = MotorPID.Kp* MotorPID.e0+ MotorPID.Ki * Err_sum2 – MotorPID.Kd * (MotorPID.e0-MotorPID.e1);   位置 
MotorPID.Sum+=MotorPID.DefaultSum;
       
        if(MotorPID.Sum>MotorMax)
  MotorPID.Sum=MotorMax;
if(MotorPID.Sum<MotorMin)
  MotorPID.Sum=MotorMin;        
 return MotorPID.Sum;
}    

优点:  位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了。

相比较缺点:占用内存大,浪费程序跑的时间

点赞