PID控制算法介紹與實現(xiàn)_第1頁
PID控制算法介紹與實現(xiàn)_第2頁
PID控制算法介紹與實現(xiàn)_第3頁
PID控制算法介紹與實現(xiàn)_第4頁
PID控制算法介紹與實現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、PID控制算法介紹與實現(xiàn)一、PID的數(shù)學模型在工業(yè)應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現(xiàn)過程,對于一般的研發(fā)人員來講,應該是足夠應對一般研發(fā)問題了,而難能可貴的是,在很多控制算法當中,PID控制算法又是最簡單,最能體現(xiàn)反饋思想的控制算法,可謂經(jīng)典中的經(jīng)典。經(jīng)典的未必是復雜的,經(jīng)典的東西常常是簡單的,而且是最簡單的。PID算法的一般形式:PID算法通過誤差信號控制被控量,而控制器本身就是比例、積分、微分三個環(huán)節(jié)的加和。這里我們規(guī)定(在t時刻):1.輸入量為i(t)2.輸出量為o(t)3.偏差量為errt= i(t)- o(t)

2、u(t)=kp(errt+1Ti.errtdt+TDderr(t)dt)二、PID算法的數(shù)字離散化假設采樣間隔為T,則在第K個T時刻:偏差err(k)=i(k) - o(k)積分環(huán)節(jié)用加和的形式表示,即errk + err(k+1) + 微分環(huán)節(jié)用斜率的形式表示,即err(k)- err(k-1)/T;PID算法離散化后的式子:u(k)=kp(errk+TTi.errj+TDT(errk-err(k-1)則u(k)可表示成為:u(k)=kp(errk+kierrj+kd(errk-err(k-1)其中式中:比例參數(shù)kp:控制器的輸出與輸入偏差值成比例關系。系統(tǒng)一旦出現(xiàn)偏差,比例調(diào)節(jié)立即產(chǎn)生調(diào)節(jié)

3、作用以減少偏差。特點:過程簡單快速、比例作用大,可以加快調(diào)節(jié),減小誤差;但是使系統(tǒng)穩(wěn)定性下降,造成不穩(wěn)定,有余差。積分參數(shù)ki:積分環(huán)節(jié)主要是用來消除靜差,所謂靜差,就是系統(tǒng)穩(wěn)定后輸出值和設定值之間的差值,積分環(huán)節(jié)實際上就是偏差累計的過程,把累計的誤差加到原有系統(tǒng)上以抵消系統(tǒng)造成的靜差。微分參數(shù)kd:微分信號則反應了偏差信號的變化規(guī)律,或者說是變化趨勢,根據(jù)偏差信號的變化趨勢來進行超前調(diào)節(jié),從而增加了系統(tǒng)的快速性。PID的基本離散表示形式如上。目前的這種表述形式屬于位置型PID,另外一種表述方式為增量式PID,由上述表達式可以輕易得到:u(k-1)=kp(errk-1+kierrj+kd(er

4、rk-1-err(k-2)那么:u(k)=kp(errk-errk-1)+kierr(k)+kd(errk-2err(k-1)+err(k-2)上式就是離散化PID的增量式表示方式,由公式可以看出,增量式的表達結果和最近三次的偏差有關,這樣就大大提高了系統(tǒng)的穩(wěn)定性。需要注意的是最終的輸出結果應該為:輸出量 = u(k) + 增量調(diào)節(jié)值三、PID的C語言實現(xiàn)1.位置式PID的C語言實現(xiàn)上邊已經(jīng)抽象出了位置性PID和增量型PID的數(shù)學表達式,這里重點講解C語言代碼的實現(xiàn)過程。   第一步:定義PID變量結構體,代碼如下:struct t_pid   

5、0;float SetSpeed;         /定義設定值    float ActualSpeed;       /定義實際值    float err;           /定義偏差值    float err_last;        

6、 /定義上一個偏差值    float Kp,Ki,Kd;         /定義比例、積分、微分系數(shù)    float voltage;         /定義電壓值(控制執(zhí)行器的變量)    float integral;         /定義積分值pid;第二部:初始化變量,代碼如下:void PID_init

7、()    pid.SetSpeed=0.0;    pid.ActualSpeed=0.0;    pid.err=0.0;    pid.err_last=0.0;    pid.voltage=0.0;    egral=0.0;    pid.Kp=0.2;    pid.Ki=0.015;    pid.

8、Kd=0.2; 統(tǒng)一初始化變量,尤其是Kp,Ki,Kd三個參數(shù),調(diào)試過程當中,對于要求的控制效果,可以通過調(diào)節(jié)這三個量直接進行調(diào)節(jié)。第三步:編寫控制算法,代碼如下:float PID_realize(float speed)    pid.SetSpeed=speed;    pid.err=pid.SetSpeed-pid.ActualSpeed;    egral+=pid.err;    pid.voltage=pid.Kp*pid.err+pid.Ki*

9、egral+pid.Kd*(pid.err-pid.err_last);    pid.err_last=pid.err;    pid.ActualSpeed=pid.voltage*1.0;    return pid.ActualSpeed;注意:這里用了最基本的算法實現(xiàn)形式,沒有考慮死區(qū)問題,沒有設定上下限,只是對公式的一種直接的實現(xiàn),后面的介紹當中還會逐漸的對此改進。 到此為止,PID的基本實現(xiàn)部分就初步完成了。下面是測試代碼:int main()   

10、; PID_init();    int count=0;    while(count<1000)            float speed=PID_realize(200.0);        printf("%fn",speed);        count+;  

11、0; return 0;2.增量型PID的C語言實現(xiàn) 上一節(jié)中介紹了最簡單的位置型PID的實現(xiàn)手段,這一節(jié)講解增量式PID的實現(xiàn)方法。#include<stdio.h>#include<stdlib.h>struct t_pid    float SetSpeed;          /定義設定值    float ActualSpeed;        /定義實際值

12、60;   float err;             /定義偏差值    float err_next;          /定義上一個偏差值    float err_last;          /定義最上前的偏差值    floa

13、t Kp,Ki,Kd;          /定義比例、積分、微分系數(shù)pid;void PID_init()    pid.SetSpeed=0.0;    pid.ActualSpeed=0.0;    pid.err=0.0;    pid.err_last=0.0;    pid.err_next=0.0;    pid.Kp=0.2;

14、0;   pid.Ki=0.015;    pid.Kd=0.2;float PID_realize(float speed)    pid.SetSpeed=speed;    pid.err=pid.SetSpeed-pid.ActualSpeed;    float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pi

15、d.err_last);    pid.ActualSpeed+=incrementSpeed;    pid.err_last=pid.err_next;    pid.err_next=pid.err;    return pid.ActualSpeed;int main()    PID_init();    int count=0;    while(count<1000)

16、            float speed=PID_realize(200.0);        printf("%fn",speed);        count+;        return 0;3.積分分離的PID控制算法 在普通PID控制中,引入積分環(huán)節(jié)的目的,主要是為了消除靜差,提高控制精度。

17、但是在啟動、結束或大幅度增減設定時,短時間內(nèi)系統(tǒng)輸出有很大的偏差,會造成PID運算的積分積累,導致控制量超過執(zhí)行機構可能允許的最大動作范圍對應極限控制量,從而引起較大的超調(diào),甚至是震蕩,這是絕對不允許的。   為了克服這一問題,引入了積分分離的概念,其基本思路是 當被控量與設定值偏差較大時,取消積分作用; 當被控量接近給定值時,引入積分控制,以消除靜差,提高精度。其具體實現(xiàn)代碼如下:    pid.Kp=0.2;    pid.Ki=0.04;    pid.Kd=0.2; 

18、 /初始化過程if(abs(pid.err)>200)        index=0;    else    index=1;    egral+=pid.err;        pid.voltage=pid.Kp*pid.err+index*pid.Ki*egral+pid.Kd*(pid.err-pid.err_last);  

19、  /算法具體實現(xiàn)過程4.抗積分飽和的PID控制算法C語言實現(xiàn) 所謂的積分飽和現(xiàn)象是指如果系統(tǒng)存在一個方向的偏差,PID控制器的輸出由于積分作用的不斷累加而加大,從而導致執(zhí)行機構達到極限位置,若控制器輸出U(k)繼續(xù)增大,執(zhí)行器開度不可能再增大,此時計算機輸出控制量超出了正常運行范圍而進入飽和區(qū)。一旦系統(tǒng)出現(xiàn)反向偏差,u(k)逐漸從飽和區(qū)退出。進入飽和區(qū)越深則退出飽和區(qū)時間越長。在這段時間里,執(zhí)行機構仍然停留在極限位置而不隨偏差反向而立即做出相應的改變,這時系統(tǒng)就像失控一樣,造成控制性能惡化,這種現(xiàn)象稱為積分飽和現(xiàn)象或積分失控現(xiàn)象。 防止積分飽和的方法之一就是抗積分飽和法,該方法的思

20、路是在計算u(k)時,首先判斷上一時刻的控制量u(k-1)是否已經(jīng)超出了極限范圍: 如果u(k-1)>umax,則只累加負偏差; 如果u(k-1)<umin,則只累加正偏差。從而避免控制量長時間停留在飽和區(qū)。struct t_pid    float SetSpeed;            /定義設定值    float ActualSpeed;        /定義實際值

21、    float err;                /定義偏差值    float err_last;            /定義上一個偏差值    float Kp,Ki,Kd;           

22、0;/定義比例、積分、微分系數(shù)    float voltage;            /定義電壓值(控制執(zhí)行器的變量)    float integral;            /定義積分值    float umax;    float umin;pid;void PID_init()

23、60;   pid.SetSpeed=0.0;    pid.ActualSpeed=0.0;    pid.err=0.0;    pid.err_last=0.0;    pid.voltage=0.0;    egral=0.0;    pid.Kp=0.2;    pid.Ki=0.1;     

24、  /注意,和上幾次相比,這里加大了積分環(huán)節(jié)的值    pid.Kd=0.2;    pid.umax=400;    pid.umin=-200; float PID_realize(float speed)    int index;    pid.SetSpeed=speed;    pid.err=pid.SetSpeed-pid.ActualSpeed;   if(p

25、id.ActualSpeed>pid.umax)  /灰色底色表示抗積分飽和的實現(xiàn)           if(abs(pid.err)>200)      /藍色標注為積分分離過程                    index=0;      

26、  else            index=1;            if(pid.err<0)                        egral+=pid.err;   &#

27、160;                    else if(pid.ActualSpeed<pid.umin)        if(abs(pid.err)>200)      /積分分離過程             

28、60;      index=0;        else            index=1;            if(pid.err>0)                 &

29、#160;      egral+=pid.err;                        else        if(abs(pid.err)>200)              

30、;   /積分分離過程                    index=0;        else            index=1;            egral

31、+=pid.err;                pid.voltage=pid.Kp*pid.err+index*pid.Ki*egral+pid.Kd*(pid.err-pid.err_last);    pid.err_last=pid.err;    pid.ActualSpeed=pid.voltage*1.0;    return pid.ActualSpee

32、d;5.梯形積分的PID控制算法先看一下梯形算法的積分環(huán)節(jié)公式0Te(t)dt=i=0ke(i)+e(i-1)2.T 作為PID控制律的積分項,其作用是消除余差,為了盡量減小余差,應提高積分項運算精度,為此可以將矩形積分改為梯形積分,具體實現(xiàn)的語句為:pid.voltage=pid.Kp*pid.err+index*pid.Ki*egral/2+pid.Kd*(pid.err-pid.err_last);  /梯形積分6.變積分的PID控制算法   變積分PID可以看成是積分分離的PID算法的更一般的形式。在普通的PID控制算法中,由于積分系數(shù)ki是

33、常數(shù),所以在整個控制過程中,積分增量是不變的。但是,系統(tǒng)對于積分項的要求是,系統(tǒng)偏差大時,積分作用應該減弱甚至是全無,而在偏差小時,則應該加強。積分系數(shù)取大了會產(chǎn)生超調(diào),甚至積分飽和,取小了又不能短時間內(nèi)消除靜差。因此,根據(jù)系統(tǒng)的偏差大小改變積分速度是有必要的。   變積分PID的基本思想是設法改變積分項的累加速度,使其與偏差大小相對應:偏差越大,積分越慢; 偏差越小,積分越快。   這里給積分系數(shù)前加上一個比例值index:   當abs(err)<180時,index=1;   當180<abs(e

34、rr)<200時,index=(200-abs(err))/20;   當abs(err)>200時,index=0;   最終的比例環(huán)節(jié)的比例系數(shù)值為ki*index;   具體PID實現(xiàn)代碼如下:    pid.Kp=0.4;    pid.Ki=0.2;    /增加了積分系數(shù)    pid.Kd=0.2;   float PID_realize(float speed)

35、0;   float index;    pid.SetSpeed=speed;    pid.err=pid.SetSpeed-pid.ActualSpeed;    if(abs(pid.err)>200)           /變積分過程        index=0.0;    else if(abs(p

36、id.err)<180)    index=1.0;    egral+=pid.err;    else    index=(200-abs(pid.err)/20;    egral+=pid.err;        pid.voltage=pid.Kp*pid.err+index*pid.Ki*egral+pid.Kd*(pid.er

37、r-pid.err_last);    pid.err_last=pid.err;    pid.ActualSpeed=pid.voltage*1.0;    return pid.ActualSpeed;7.專家PID和模糊PID 從前面的講解中不難看出,PID的控制思想非常簡單,其主要問題點和難點在于比例、積分、微分環(huán)節(jié)上的參數(shù)整定過程,對于執(zhí)行器控制模型確定或者控制模型簡單的系統(tǒng)而言,參數(shù)的整定可以通過計算獲得,對于一般精度要求不是很高的執(zhí)行器系統(tǒng),可以采用拼湊的方法進行實驗型的整定。 然而,在實

38、際的控制系統(tǒng)中,線性系統(tǒng)畢竟是少數(shù),大部分的系統(tǒng)屬于非線性系統(tǒng),或者說是系統(tǒng)模型不確定的系統(tǒng),如果控制精度要求較高的話,那么對于參數(shù)的整定過程是有難度的。專家PID和模糊PID就是為滿足這方面的需求而設計的。專家算法和模糊算法都歸屬于智能算法的范疇,智能算法最大的優(yōu)點就是在控制模型未知的情況下,可以對模型進行控制。這里需要注意的是,專家PID也好,模糊PID也罷,絕對不是專家系統(tǒng)或模糊算法與PID控制算法的簡單加和,他是專家系統(tǒng)或者模糊算法在PID控制器參數(shù)整定上的應用。也就是說,智能算法是輔助PID進行參數(shù)整定的手段。 專家系統(tǒng)、模糊算法,需要參數(shù)整定就一定要有整定的依據(jù),也就是說什么情況下

39、整定什么值是要有依據(jù)的,這個依據(jù)是一些邏輯的組合,只要找出其中的邏輯組合關系來,這些依據(jù)就再明顯不過了。下面先說一下專家PID的C語言實現(xiàn)。正如前面所說,需要找到一些依據(jù),還得從PID系數(shù)本身說起。 (1).比例系數(shù)Kp的作用是加快系統(tǒng)的響應速度,提高系統(tǒng)的調(diào)節(jié)精度。Kp越大,系統(tǒng)的響應速度越快,系統(tǒng)的調(diào)節(jié)精度越高,但是容易產(chǎn)生超調(diào),甚至會使系統(tǒng)不穩(wěn)定。Kp取值過小,則會降低調(diào)節(jié)精度,使響應速度緩慢,從而延長調(diào)節(jié)時間,是系統(tǒng)靜態(tài)、動態(tài)特性變差; (2).積分作用系數(shù)Ki的作用是消除系統(tǒng)的穩(wěn)態(tài)誤差。Ki越大,系統(tǒng)的靜態(tài)誤差消除的越快,但是Ki過大,在響應過程的初期會產(chǎn)生積分飽和的現(xiàn)象,從而引起響

40、應過程的較大超調(diào)。若Ki過小,將使系統(tǒng)靜態(tài)誤差難以消除,影響系統(tǒng)的調(diào)節(jié)精度; (3).微分系數(shù)Kd的作用是改善系統(tǒng)的動態(tài)特性,其作用主要是在響應過程中抑制偏差向任何方向的變化,對偏差變化進行提前預報。但是Kd過大,會使響應過程提前制動,從而延長調(diào)節(jié)時間,而且會降低系統(tǒng)的抗干擾性。 反應系統(tǒng)性能的兩個參數(shù)是系統(tǒng)誤差e和誤差變化律ec,這點還是好理解的: 首先我們規(guī)定一個誤差的極限值,假設為Mmax;規(guī)定一個誤差的比較大的值,假設為Mmid;規(guī)定一個誤差的較小值,假設為Mmin; 當abs(e)>Mmax時,說明誤差的絕對值已經(jīng)很大了,不論誤差變化趨勢如何,都應該考慮控制器的輸入應按最大(或

41、最?。┹敵?,以達到迅速調(diào)整誤差的效果,使誤差絕對值以最大的速度減小。此時,相當于實施開環(huán)控制。 當e*ec>0時,說明誤差在朝向誤差絕對值增大的方向變化,此時,如果abs(e)>Mmid,說明誤差也較大,可考慮由控制器實施較強的控制作用,以達到扭轉(zhuǎn)誤差絕對值向減小的方向變化,并迅速減小誤差的絕對值。此時如果abs(e)<Mmid,說明盡管誤差是向絕對值增大的方向變化,但是誤差絕對值本身并不是很大,可以考慮控制器實施一般的控制作用,只需要扭轉(zhuǎn)誤差的變化趨勢,使其向誤差絕對值減小的方向變化即可。 當e*err<0且e*err(k-1)>0或者e=0時,說明誤差的絕對值

42、向減小的方向變化,或者已經(jīng)達到平衡狀態(tài),此時保持控制器輸出不變即可。 當e*err<0且e*err(k-1)<0時,說明誤差處于極限狀態(tài)。如果此時誤差的絕對值較大,大于Mmin,可以考慮實施較強控制作用。如果此時誤差絕對值較小,可以考慮實施較弱控制作用。 當abs(e)<Mmin時,說明誤差絕對值很小,此時加入積分,減小靜態(tài)誤差。上面的邏輯判斷過程,實際上就是對于控制系統(tǒng)的一個專家判斷過程。 實際上模糊算法屬于智能算法,智能算法也可以叫非模型算法,智能算法包含了專家系統(tǒng)、模糊算法、遺傳算法、神經(jīng)網(wǎng)絡算法等。其實這其中的任何一種算法都可以跟PID去做結合,而選擇的關鍵在于,處理

43、的實時性能不能得到滿足。當我們處理器的速度足夠快速時,我們可以選擇更為復雜的、精度更加高的算法。但是,控制器的處理速度限制了我們算法的選擇。當然,成本是限制處理器速度最根本的原因。模糊PID適應一般的控制系統(tǒng)是沒有問題。 模糊算法其實并不模糊。模糊算法其實也是逐次求精的過程。這里舉個例子說明。我們設計一個倒立擺系統(tǒng),假如擺針偏差5°,我們說它的偏差比較“小”;擺針偏差在5°和10°之間,我們說它的偏差處于“中”的狀態(tài);當擺針偏差10°的時候,我們說它的偏差有點兒“大”了。對于“小”、“中”、“大”這樣的詞匯來講,他們是精確的表述,可問題是如果擺針偏差是3

44、°呢,那么這是一種什么樣的狀態(tài)呢。我們可以用“很小”來表述它。如果是7°呢,可以說它是“中”偏“小”。那么如果到了80°呢,它的偏差可以說“非常大”。而我們調(diào)節(jié)的過程實際上就是讓系統(tǒng)的偏差由非常“大”逐漸向非?!靶 边^度的過程。當然,我們系統(tǒng)這個調(diào)節(jié)過程是快速穩(wěn)定的。通過上面的說明,可以認識到,其實對于每一種狀態(tài)都可以劃分到大、中、小三個狀態(tài)當中去,只不過他們隸屬的程度不太一樣,比如6°隸屬于小的程度可能是0.3,隸屬于中的程度是0.7,隸屬于大的程度是0。這里實際上是有一個問題的,就是這個隸屬的程度怎么確定?這就要求我們?nèi)ピO計一個隸屬函數(shù)。詳細內(nèi)容可以

45、查閱相關的資料,這里沒有辦法那么詳細的說明了。那么,知道了隸屬度的問題,就可以根據(jù)目前隸屬的程度來控制電機以多大的速度和方向轉(zhuǎn)動了,當然,最終的控制量肯定要落實在控制電壓上。這點可以很容易的想想,我們控制的目的就是讓倒立擺從隸屬“大”的程度為1的狀態(tài),調(diào)節(jié)到隸屬“小”的程度為1的狀態(tài)。當隸屬大多一些的時候,我們就加快調(diào)節(jié)的速度,當隸屬小多一些的時候,我們就減慢調(diào)節(jié)的速度,進行微調(diào)??蓡栴}是,大、中、小的狀態(tài)是漢字,怎么用數(shù)字表示,進而用程序代碼表示呢?其實我們可以給大、中、小三個狀態(tài)設定三個數(shù)字來表示,比如大表示用3表示,中用2表示,小用1表示。那么我們完全可以用1*0.3+2*0.7+3*0.0=1.7來表示它,當然這個公式也不一定是這樣的,這個公式的設計是系統(tǒng)模糊化和精確化的一個過程,讀者也可參見相關文獻理解。但就1.7這個數(shù)字而言,可以說明,目前6°的角度偏差處于小和中之間,但是更偏向于中。我們就可以根據(jù)這個數(shù)字來調(diào)節(jié)電

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論