久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9301|回復: 1
打印 上一主題 下一主題
收起左側

PID算法原理,調整規律及代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:75263 發表于 2015-6-9 03:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、PID算法簡介

在智能車競賽中,要想讓智能車根據賽道的不斷變化靈活的行進,PID算法的采用很有意義。

   首先必須明確PID算法是基于反饋的。一般情況下,這個反饋就是速度傳感器返回給單片機當前電機的轉速。簡單的說,就是用這個反饋跟預設值進行比較,如果轉速偏大,就減小電機兩端的電壓;相反,則增加電機兩端的電壓。



圖1  PID框架圖

控制器公式為:


式中:Kp——比例放大系數  KI——積分放大系數 KD——微分放大系數

   顧名思義,P指是比例(Proportion),I指是積分(Integral),D指微分(Differential)。在電機調速系統中,輸入信號為正,要求電機正轉時,反饋信號也為正(PID算法時,誤差=輸入-反饋),同時電機轉速越高,反饋信號越大。要想搞懂PID算法的原理,首先必須先明白P,I,D各自的含義及控制規律:

比例P比例項部分其實就是對預設值和反饋值差值的發大倍數。舉個例子,假如原來電機兩端的電壓為U0,比例P為0.2,輸入值是800,而反饋值是1000,那么輸出到電機兩端的電壓應變為U0+0.2*(800-1000)。從而達到了調節速度的目的。顯然比例P越大時,電機轉速回歸到輸入值的速度將更快,及調節靈敏度就越高。從而,加大P值,可以減少從非穩態到穩態的時間。但是同時也可能造成電機轉速在預設值附近振蕩的情形,所以又引入積分I解決此問題。

積分I顧名思義,積分項部分其實就是對預設值和反饋值之間的差值在時間上進行累加。當差值不是很大時,為了不引起振蕩?梢韵茸岆姍C按原轉速繼續運行。當時要將這個差值用積分項累加。當這個和累加到一定值時,再一次性進行處理。從而避免了振蕩現象的發生?梢,積分項的調節存在明顯的滯后。而且I值越大,滯后效果越明顯。

微分D微分項部分其實就是求電機轉速的變化率。也就是前后兩次差值的差而已。也就是說,微分項是根據差值變化的速率,提前給出一個相應的調節動作。可見微分項的調節是超前的。并且D值越大,超前作用越明顯?梢栽谝欢ǔ潭壬暇彌_振蕩。比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等于零,甚至為負值,從而避免了被控量的嚴重超調。

二、參數調整一般規則

由各個參數的控制規律可知,比例P使反應變快,微分D使反應提前,積分I使反應滯后。在一定范圍內,P,D值越大,調節的效果越好。各個參數的調節原則如下:

PID調試一般原則

a.      在輸出不振蕩時,增大比例增益P。

b.      在輸出不振蕩時,減小積分時間常數Ti。

c.      輸出不振蕩時,增大微分時間常數Td。

三、參數調整一般步驟

a.確定比例增益P

確定比例增益P時,首先去掉PID的積分項和微分項,一般是令Ti=0、Td=0,PID為純比例調節。輸入設定為系統允許的最大值的60%~70%,由0逐漸加大比例增益P,直至系統出現振蕩;再反過來,從此時的比例增益P逐漸減小,直至系統振蕩消失,記錄此時的比例增益P,設定PID的比例增益P為當前值的60%~70%。比例增益P調試完成。

b.確定積分時間常數Ti

比例增益P確定后,設定一個較大的積分時間常數Ti的初值,然后逐漸減小Ti,直至系統出現振蕩,之后在反過來,逐漸加大Ti,直至系統振蕩消失。記錄此時的Ti,設定PID的積分時間常數Ti為當前值的150%~180%。積分時間常數Ti調試完成。

c.確定積分時間常數Td

積分時間常數Td一般不用設定,為0即可。若要設定,與確定 P和Ti的方法相同,取不振蕩時的30%。

d.系統空載、帶載聯調,再對PID參數進行微調,直至滿足要求

四、參數調整

PID控制器參數選擇的方法很多,例如試湊法、臨界比例度法、擴充臨界比例度法等。但是,對于PID控制而言,參數的選擇始終是一件非常煩雜的工作,需要經過不斷的調整才能得到較為滿意的控制效果。依據經驗,一般PID參數確定的步驟如下:

(1)確定比例系數Kp

確定比例系數Kp時,首先去掉PID的積分項和微分項,可以令Ti=0、Td=0,使之成為純比例調節。輸入設定為系統允許輸出最大值的60%~70%,比例系數Kp由0開始逐漸增大,直至系統出現振蕩;再反過來,從此時的比例系數Kp逐漸減小,直至系統振蕩消失。記錄此時的比例系數Kp,設定PID的比例系數Kp為當前值的60%~70%。

(2)確定積分時間常數Ti

比例系數Kp確定之后,設定一個較大的積分時間常數Ti,然后逐漸減小Ti,直至系統出現振蕩,然后再反過來,逐漸增大Ti,直至系統振蕩消失。記錄此時的Ti,設定PID的積分時間常數Ti為當前值的150%~180%。

(3) 確定微分時間常數Td

微分時間常數Td一般不用設定,為0即可,此時PID調節轉換為PI調節。如果需要設定,則與確定Kp的方法相同,取不振蕩時其值的30%。

(4) 系統空載、帶載聯調

對PID參數進行微調,直到滿足性能要求。

PID代碼如下:

#include
#include
typedef struct PID {
double SetPoint; // 設定目標Desiredvalue
double Proportion; // 比例常數ProportionalConst
double Integral; // 積分常數IntegralConst
double Derivative; // 微分常數DerivativeConst
double LastError; // Error[-1]

double PrevError; // Error[-2]
double SumError; // Sums ofErrors
} PID;

//===================================================================================================
//PID計算函數
//==================================================================================================

double PIDCalc( PID *pp, double NextPoint)
{
    doubledError, Error;
    Error =pp->SetPoint - NextPoint; //偏差
   pp->SumError += Error; //積分
    dError =pp->LastError - pp->PrevError; //當前微分
   pp->PrevError =pp->LastError;
   pp->LastError =Error;
    return(pp->Proportion * Error //比例項
    +pp->Integral * pp->SumError //積分項
    +pp->Derivative * dError //微分項 );
}

//===================================================================================================
//PID結構體變量初始化函數
//===================================================================================================voidPIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}

//===================================================================================================//讀取輸入變量函數(在此設定為固定值100)
//===================================================================================================doublesensor (void)  
{
return 100.0;
}

//======================================================================//輸出變量控制函數
//=====================================================================voidactuator(double rDelta)  
{
}

//主函數
void main(void)
{
    PID sPID; //PID Control Structure
    double rOut;// PID Response (Output)
    double rIn;// PID Feedback (Input)
    PIDInit (&sPID ); // InitializeStructure
   sPID.Proportion = 0.5; // SetPID Coefficients
   sPID.Integral =0.5;
   sPID.Derivative =0.0;
   sPID.SetPoint = 100.0; // SetPID Setpoint
    for(;;)
    { // Mock Upof PID Processing
       rIn = sensor (); // ReadInput
       rOut = PIDCalc ( &sPID,rIn); // Perform PID Interation
       actuator ( rOut ); // EffectNeeded Changes
   }
}   


評分

參與人數 1威望 +6 黑幣 +6 收起 理由
王朗的誘惑 + 6 + 6 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:308342 發表于 2018-4-15 00:08 | 只看該作者
請問,第三部分的pid是調一個的時候其他兩個直接設為0,最后在帶入那個比例嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 小川阿佐美pgd-606在线 | av一区在线观看 | 日韩欧美在线视频一区 | 久久这里只有精品首页 | 伊人网国产 | 不用播放器看的av | 欧美一区二 | 国产精品亚洲一区二区三区在线观看 | 国产a视频| 欧美中文字幕在线 | 91一区二区 | 久久国产区| 欧洲亚洲一区二区三区 | h视频免费在线观看 | 亚洲 欧美 另类 综合 偷拍 | 午夜影晥 | www精品美女久久久tv | 久久久国产精品 | 免费爱爱视频 | 黄色片视频免费 | 中文字幕亚洲欧美日韩在线不卡 | 午夜影院在线播放 | 一区二区三区网站 | 国产在线观看一区二区 | 免费一级黄 | 中文字幕欧美日韩 | 国产精品高潮呻吟久久 | 欧美日韩亚洲一区 | 久久久精品一区 | 免费v片在线观看 | 欧美一级在线免费观看 | 日韩欧美国产精品一区二区 | 韩日在线 | 国产精品国产成人国产三级 | 欧美精品一区三区 | 久久精品国产免费看久久精品 | 国产精品毛片一区二区在线看 | 久久成人午夜 | 亚洲一区精品在线 | 精品视频在线播放 | 欧美在线视频不卡 |