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