增量式PID控制C語言代碼

來源:互聯網
上載者:User

增量式PID控制C語言代碼

增量式PID控制公式:



上面△u(k)是控制量增量,“增量式PID”就是直接以這個增量進行控制。

至於參數的整定,根據響應的情況調,比如,響應慢了,我就增大kp,或者減小kd,超調大了,就減小kp或增大點kd,這個規律你可以看看PID三個參數的作用:)

////////////////////////////////////////////////////////////////

// 定義PID參數結構體

///////////////////////////////////////////////////////////////

typedef struct PID {              //結構體定義

        int  SetPoint            //設定值

        int  Proportion;         // Proportion 比例係數

        int  Integral;            // Integral   積分係數

        int  Derivative;          // Derivative  微分係數

        int  LastError;          // Error[-1]  前一拍誤差

        int  PreError;           // Error[-2]  前兩拍誤差

} PID;

main()

{

  PID vPID;                        //定義結構變數名

PIDInit ( &vPID );                 //Initialize Structure

vPID.Proportion = 10;             //Set PID Coefficients  

  vPID.Integral   = 10;             // Set PID Integral

  vPID.Derivative = 10;             // Set PID Derivative

  vPID. SetPoint =                 //根據實際情況設定

  while(1)

{

       Verror=Measure();               //得到AD的輸出值

       Error =vPID. SetPoint- Verror;   //與設定值比較,得到誤差值

tempi=PIDCal(&vPID, Error;

       laser.Value+=tempi;          // Value與Num[2]為共同體,共同體名laser

LASERH=laser.Num[0];

LASERL=laser.Num[1];

  }

}

///////////////////////////////////////////////////////////////////////

//Title:PID參數初始化

//Description: Proportion="0"

//           Integral=0

//           LastError=0

//Input: PID的P、I控制常數和之前的誤差量(PID *pp)

//Return:

//////////////////////////////////////////////////////////////////////

void PIDInit (PID *pp)                     //PID參數初始化,都置0

   {                                           

     memset ( pp,0,sizeof(PID));

//memset()的函數, 它可以一位元組一位元組地把整個數組設定為一個指定的值。

// memset()函數在mem.h標頭檔中聲明,它把數組的起始地址作為其第一個參數,

//第二個參數是設定數組每個位元組的值,第三個參數是數組的長度(位元組數,不是元素個數)。

//其函數原型為: void *memset(void*,int,unsigned);

//標頭檔<string.h>

   }

///////////////////////////////////////////////////////////////////////

//Title:增量式PID演算法程式

//Description:給出一個誤差增量

//Input: PID的P、I控制常數和之前的誤差量(PID *pp)& 當前誤差量(ThisError)

//Return: 誤差增量templ

//////////////////////////////////////////////////////////////////////

int PIDCal( PID *pp, int ThisError ){

//增量式PID演算法(需要控制的不是控制量的絕對值,而是控制量的增量)

    int pError,dError,iError;

long templ;

    pError = ThisError-pp->LastError;

    iError = ThisError;

    dError = ThisError-2*(pp->LastError)+pp->PreError;

//增量計算

    templ=pp->Proportion*pError + pp->Integral*iError+pp->Derivative*dError;  //增量

    //儲存誤差用於下次運算

    pp->PreError  = pp->LastError;

    pp->LastError = ThisError;

    return ((int)(templ>>8));

}

參考自:http://blog.sina.com.cn/s/blog_408540af0100asu3.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.