PID专题及C语言的实现


注意:任何算法使用程序表示,都得将算法离散化,以下的算法公式及代码都是将连续函数离散化后的表示结果。

 

问题一:位置式pid与增量式pid差别?

       位置式PID将误差累加,增量式PID与当前及前两派误差有关。

问题二:位置式PID计算公式是什么?

   

问题三:增量式PID计算公式是什么?

         由问题二的位置式的PID计算公式可知,u(k)和u(k-1)的计算公式。将二者做差,即得到增量式PID的计算公式。

      

问题四:位置式PID实现C语言代码?

    typedef struct{

        float kp,ki,kd;

        float ek,ek1,ek2;       //ek1 是 ek 的前一次误差

        float eSUM;

    }PID;

  结构体PID的初始化:

         PID pid = {10.0,10.0,0.0,0.0,0.0,0.0};

float PID_Loc(float SetValue,    float ActualValue, PID *pid){

          float PIDLoc;

           pid->ek  =  SetValue  -  ActualValue;

           pid->eSum += pid->ek;   //累计误差

           PIDLoc  =  (pid->kp*pid-ek) 

                         +  (pid->ki*pid->eSUM) 

                         +  [pid->kd*(pid->ek1   -   pid->ek)]

            pid->ek1 = pid->ek;

            return PIDLoc;

}

问题五:增量式PID的实现代码?该pid计算结果如何使用?

                 //PID结构体的定义见问题四,

float  PID_Inc(float SetValue,  float ActualValue,  PID *pid){

      float PIDInc;

      pid->ek  =   SetValue  -  ActualValue;

      PIDInc  =  [pid->kp  *  (pid->ek  -  pid->ek1)]

                  +   (pid->ki  *  pid->ek)

                  +  [pid->kd  *  (pid->ek  -  2*pid->ek1  +  pid->ek2)];

 

     //注意:可以将公式化简,这是一种思维,不要简单的将下面化简的kp,ki,kd。理解为书上的PID。这里是提了公因式的

     PIDInc  =  (pid->kp  *  pid->ek)

                  -  (pid->ki   *   pid->ek1)

                 +  (pid->kd  *   pid->ek2)

 

 

      pid->ek2  =  pid->ek1;

      pid->ek1  =  pid->ek;

      return PIDInc;

}    //由于计算结果是属于增量,那么计算后,该PIDInc需要叠加到原PWM的占空比上面,具体是还是看具体情况。

问题六:为什么在使用增量式PID的时候,反馈的调节现象是正反馈?

         增量式的pid,在实际的应用上,需要根据具体的情况判断是还是,弄错了就成为了反馈。

 

问题七:实际应用中,PID三个参数该如何确定?

              先调P值,P从小往大了调,调到临界振荡,取临界振荡的70%

              再调I值,I值从大往小了调,调到消除稳定误差。

              D值,视情况来调。默认为零。

 

 参考文献:

 [1] 何俊龙,杜封.微缩智能车路径跟踪的增量式PID控制[J].天津职业技术师范大学学报.2018,28(2):5-9

 

 

       

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM