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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 60912|回復: 49
收起左側

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

  [復制鏈接]
ID:72008 發表于 2015-1-12 14:29 | 顯示全部樓層 |閱讀模式
一、PID算法簡介
在智能車競賽中,要想讓智能車根據賽道的不斷變化靈活的行進,PID算法的采用很有意義。
    首先必須明確PID算法是基于反饋的。一般情況下,這個反饋就是速度傳感器返回給單片機當前電機的轉速。簡單的說,就是用這個反饋跟預設值進行比較,如果轉速偏大,就減小電機兩端的電壓;相反,則增加電機兩端的電壓。

控制器公式 為:
  
 式中  
     顧名思義,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顧名思義,積分項部分其實就是對預設值和反饋值之間的差值在時間上進行累加。當差值不是很大時,為了不引起振蕩。可以先讓電機按原轉速繼續運行。當時要將這個差值用積分項累加。當這個和累加到一定值時,再一次性進行處理。從而避免了振蕩現象的發生。可見,積分項的調節存在明顯的滯后。而且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<string.h>
#include<stdio.h>
typedef struct PID {

double SetPoint; // 設定目標Desired value
double Proportion; // 比例常數Proportional Const
double Integral; // 積分常數Integral Const
double Derivative; // 微分常數Derivative Const
double LastError; // Error[-1]

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

/*====================================================================================================
PID計算函數
=====================================================================================================*/
double PIDCalc( PID *pp, double NextPoint )
{
    double dError, 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結構體變量初始化函數
=====================================================================================================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}

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

/*====================================================================================================
輸出變量控制函數
======================================================================================================*/

void actuator(double rDelta)  
{
}

//主函數

void main(void)
{
    PID sPID; // PID Control Structure
    double rOut; // PID Response (Output)
    double rIn; // PID Feedback (Input)
    PIDInit ( &sPID ); // Initialize Structure
    sPID.Proportion = 0.5; // Set PID Coefficients
    sPID.Integral = 0.5;
    sPID.Derivative = 0.0;
    sPID.SetPoint = 100.0; // Set PID Setpoint
    for (;;)
    { // Mock Up of PID Processing

        rIn = sensor (); // Read Input
        rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation
        actuator ( rOut ); // Effect Needed Changes
    }

}

評分

參與人數 9黑幣 +68 收起 理由
123000.。 + 10 很給力!
溫存723 + 7 絕世好帖!
dww465757120 + 30 很給力!
為之則易 + 1 共享資料的黑幣獎勵!
zha + 3
owlandauk + 1 贊一個!
涼城以北 + 3 贊一個!
wei1996313 + 5 絕世好帖!
send + 8 很給力!

查看全部評分

回復

使用道具 舉報

ID:72527 發表于 2015-1-20 10:26 | 顯示全部樓層
學習了,51黑有你更精彩!!
回復

使用道具 舉報

ID:56903 發表于 2015-1-22 10:32 | 顯示全部樓層
講得太棒了,這是我見過的把智能小車 PID講解的最透徹的文章。
回復

使用道具 舉報

ID:72995 發表于 2015-2-2 14:43 | 顯示全部樓層
終于在手機上看完了,解決了我一直以來關于pid的疑惑 謝謝樓主.
回復

使用道具 舉報

ID:100002 發表于 2016-4-12 11:08 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:113840 發表于 2016-4-12 22:41 | 顯示全部樓層
終于了解pid
回復

使用道具 舉報

ID:101392 發表于 2016-4-15 22:05 | 顯示全部樓層
只能給你刷波666
回復

使用道具 舉報

ID:117647 發表于 2016-4-30 13:56 | 顯示全部樓層
看完了,卻沒看懂
回復

使用道具 舉報

ID:130196 發表于 2016-8-5 00:40 來自手機 | 顯示全部樓層
寫的清楚明白
回復

使用道具 舉報

ID:107832 發表于 2016-11-5 10:21 | 顯示全部樓層
在實際的工程例如溫控,速度控制中。也是只用PI控制就可以嗎?
回復

使用道具 舉報

ID:72292 發表于 2016-12-17 15:27 | 顯示全部樓層
很好,謝謝樓主
回復

使用道具 舉報

ID:185968 發表于 2017-4-23 11:11 | 顯示全部樓層
贊一個,慢慢理解
回復

使用道具 舉報

ID:202452 發表于 2017-5-19 10:41 | 顯示全部樓層
為什么上面說微分越大越好,但是下面的微分直接設置為零????
回復

使用道具 舉報

ID:187365 發表于 2017-7-19 16:14 | 顯示全部樓層
講的很清楚贊一個
回復

使用道具 舉報

ID:222737 發表于 2017-7-27 17:41 | 顯示全部樓層
講的很清楚贊一個,解決了我一直以來關于pid的疑惑 謝謝樓主.
回復

使用道具 舉報

ID:203640 發表于 2017-7-31 15:37 | 顯示全部樓層
多謝分享經驗
回復

使用道具 舉報

ID:110278 發表于 2017-8-4 13:41 | 顯示全部樓層
參考一下。。。
回復

使用道具 舉報

ID:222394 發表于 2017-8-5 21:59 | 顯示全部樓層
好帖!
回復

使用道具 舉報

ID:125038 發表于 2017-8-5 22:26 | 顯示全部樓層
學習了,謝謝樓主!
回復

使用道具 舉報

ID:225338 發表于 2017-8-7 04:32 來自手機 | 顯示全部樓層
編程還是不會,傷心
回復

使用道具 舉報

ID:229761 發表于 2017-9-12 10:31 | 顯示全部樓層
怎么進行參數的整定?對于實際工程項目來說也是這樣的嗎?
回復

使用道具 舉報

ID:231115 發表于 2017-9-25 11:18 | 顯示全部樓層
慢滿消化,謝謝
回復

使用道具 舉報

ID:244991 發表于 2017-11-2 13:49 | 顯示全部樓層
看看能不能結合到我的安卓里面
回復

使用道具 舉報

ID:160351 發表于 2017-11-2 14:25 | 顯示全部樓層
學習了,不光是在智能小車上,在溫度控制上PID也是 一樣的道理!
回復

使用道具 舉報

ID:223788 發表于 2018-3-31 17:41 | 顯示全部樓層
學習了,51黑有你更精彩!!
回復

使用道具 舉報

ID:343709 發表于 2018-8-10 10:33 | 顯示全部樓層
謝謝啦
回復

使用道具 舉報

ID:400755 發表于 2018-9-21 13:32 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:402219 發表于 2018-9-25 16:33 | 顯示全部樓層
插個眼,下來慢慢理解
回復

使用道具 舉報

ID:338711 發表于 2018-10-29 14:51 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:350791 發表于 2018-12-18 09:30 | 顯示全部樓層
這是我見過的把PID講解的最透徹,我要好好理解和學習
回復

使用道具 舉報

ID:276118 發表于 2018-12-18 13:18 | 顯示全部樓層
這就是理論與軟件的結合
回復

使用道具 舉報

ID:426166 發表于 2018-12-18 15:09 | 顯示全部樓層

這就是理論與軟件的結合
回復

使用道具 舉報

ID:525712 發表于 2019-12-23 16:40 | 顯示全部樓層
學習了,很有幫助
回復

使用道具 舉報

ID:444278 發表于 2020-3-28 17:45 | 顯示全部樓層
學習了,棒棒噠
回復

使用道具 舉報

ID:601357 發表于 2020-7-23 11:24 | 顯示全部樓層
講的清楚明白,謝謝,學到了
回復

使用道具 舉報

ID:259648 發表于 2020-8-6 14:44 | 顯示全部樓層
受益匪淺!!  感謝分享  51黑有你更精彩
回復

使用道具 舉報

ID:259648 發表于 2020-8-6 14:46 | 顯示全部樓層
這個屬于增量式還是位置式呢
回復

使用道具 舉報

ID:91521 發表于 2022-3-16 12:11 | 顯示全部樓層
樓主好人一生平安!
回復

使用道具 舉報

ID:91521 發表于 2022-3-16 12:11 | 顯示全部樓層
溫存723 發表于 2020-8-6 14:46
這個屬于增量式還是位置式呢

當然是增量式
回復

使用道具 舉報

ID:1024431 發表于 2022-5-6 23:09 | 顯示全部樓層
這個文章太透徹了謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成在线观看免费视频 | 国产精品一区二区三区久久 | 偷拍自拍在线观看 | 精品少妇一区二区三区在线播放 | 亚洲网站在线观看 | 狠狠的干狠狠的操 | 99精品久久久国产一区二区三 | 成人免费网视频 | 欧美一级精品片在线看 | 亚洲 欧美 精品 | 久久99精品久久久久久琪琪 | 日韩在线看片 | 97久久国产| 一区二区av | 色伊人 | 婷婷国产一区 | 成人国产精品一级毛片视频毛片 | 日韩在线播放第一页 | 国产精品18久久久久久白浆动漫 | 亚洲精品一区二区三区 | 欧美v日韩v | 日韩av.com| 精品国产乱码久久久久久88av | 亚洲成人日韩 | 国产aⅴ爽av久久久久久久 | www.色.com| 午夜丰满少妇一级毛片 | 国产精品久久久久久久久久妞妞 | 精产国产伦理一二三区 | 色偷偷噜噜噜亚洲男人 | 亚洲精品99999 | 欧美激情一区二区 | 久久日本 | 一区二区三区在线观看视频 | 亚洲国产成人精品女人 | 精品婷婷 | 在线激情视频 | 99自拍视频 | 久久久久国产精品一区 | 国产精品高潮呻吟 | 国产在线视频在线观看 |