PID算法的(de)C程(cheng)序(xu)實現方(fang)式,大神帶你入(ru)門
時間:2018-04-24 來(lai)源:未(wei)知
一、PID算法簡介
在水溫控(kong)制(zhi)模型、智能(neng)車比賽、四軸飛行器穩定(ding)(ding),平(ping)衡車速度等(deng)控(kong)制(zhi)實(shi)現時,因(yin)為(wei)預設(she)值與(yu)實(shi)際控(kong)制(zhi)效(xiao)果之(zhi)間存在一(yi)(yi)定(ding)(ding)的(de)偏差、實(shi)際輸出與(yu)數據反饋之(zhi)間存在一(yi)(yi)定(ding)(ding)的(de)延時,往往不(bu)能(neng)得到(dao)理想的(de)控(kong)制(zhi)效(xiao)果。PID作為(wei)應(ying)用為(wei)廣泛(fan)的(de)一(yi)(yi)種自動控(kong)制(zhi)器,在實(shi)際控(kong)制(zhi)中加入PID算(suan)法將能(neng)達到(dao)系(xi)統(tong)不(bu)斷靈活變(bian)化的(de)效(xiao)果。
上面的提(ti)到的幾(ji)種實例都可以稱為(wei)惰性系統(過程(cheng)控(kong)制(zhi)(zhi)對(dui)象具(ju)有“一介(jie)滯(zhi)后+純滯(zhi)后”與(yu)“二介(jie)滯(zhi)后+純滯(zhi)后 ”特點,說白了就是響(xiang)應延遲(chi)+反饋延時),PID控(kong)制(zhi)(zhi)器(qi)是一種最優控(kong)制(zhi)(zhi)器(qi)。
顧(gu)名思義,P指是(shi)比例(Proportion),I指是(shi)積分(Integral),D指微分(Differential)。在電機調(diao)速系統中,輸(shu)入(ru)信號為(wei)(wei)正,要(yao)求電機正轉時(shi),反(fan)饋(kui)信號也為(wei)(wei)正(PID算(suan)法時(shi),誤(wu)差=輸(shu)入(ru)-反(fan)饋(kui)),同時(shi)電機轉速越高,反(fan)饋(kui)信號越大。要(yao)想搞懂(dong)PID算(suan)法的原理,首(shou)先必須先明白P,I,D各自的含義及(ji)控制規律:
1.1比(bi)例P
Proportion(比例(li)),就是輸入(ru)偏差乘以一個常(chang)數。
比例調節器方程為(wei):
y=Kp*e(t)
調節器的輸(shu)出與輸(shu)入偏(pian)差(cha)成正比。比例(li)項部(bu)分其實就是對預設值和反饋(kui)值差(cha)值的放(fang)大倍數(shu)。
圖示

圖1 比(bi)例放大示意(yi)圖
控制對象為電(dian)機(ji)時,比例Kp越大(da)(da)時,電(dian)機(ji)轉速(su)回歸到輸入值的(de)(de)(de)速(su)度(du)(du)將更快,及調(diao)節靈敏度(du)(du)就越高(gao)。從而(er),加Kp值,可(ke)以減少從非穩態到穩態的(de)(de)(de)時間(jian)。但是同時也可(ke)能(neng)造(zao)成(cheng)電(dian)機(ji)轉速(su)在預設(she)值附(fu)近(jin)振蕩的(de)(de)(de)情形(xing),即用力過(guo)(guo)猛(meng),調(diao)整(zheng)跨度(du)(du)太大(da)(da),如(ru)果是舵機(ji)轉向系統(tong),會出現智能(neng)車搖擺S型前(qian)進,這就是Kp過(guo)(guo)大(da)(da)造(zao)成(cheng)的(de)(de)(de),所以又引入積分I解決此問題。
1.2 積(ji)分(fen)I
Integral(積(ji)分(fen)),積(ji)分(fen)作用是指調節器的(de)輸出與(yu)輸入偏差的(de)積(ji)分(fen)成比例的(de)作用。
積分方程為:

Ti是(shi)積(ji)分(fen)時間常數,它表示積(ji)分(fen)速度的(de)大(da)小,Ti越(yue)大(da),積(ji)分(fen)速度越(yue)慢,積(ji)分(fen)作(zuo)用越(yue)弱(ruo)。
圖示

圖(tu)2 積分調節示(shi)意圖(tu)
積(ji)分(fen)環節(jie)的(de)(de)(de)(de)調節(jie)作用雖(sui)然會(hui)消除靜態誤(wu)差(cha),但也會(hui)降低系統(tong)的(de)(de)(de)(de)響應速度,也就是(shi)(shi)積(ji)分(fen)項(xiang)的(de)(de)(de)(de)調節(jie)存在明顯(xian)的(de)(de)(de)(de)滯后,因為Ti代表的(de)(de)(de)(de)是(shi)(shi)時(shi)間常(chang)數,Ti值(zhi)(zhi)(zhi)越大,時(shi)間越長,滯后效果(guo)越明顯(xian),增加系統(tong)的(de)(de)(de)(de)超(chao)調量。積(ji)分(fen)常(chang)數T I 越大,積(ji)分(fen)的(de)(de)(de)(de)積(ji)累(lei)作用越弱。增大積(ji)分(fen)常(chang)數T I 會(hui)減(jian)(jian)慢靜態誤(wu)差(cha)的(de)(de)(de)(de)消除過程,但可(ke)以減(jian)(jian)少超(chao)調量,提高(gao)系統(tong)的(de)(de)(de)(de)穩定性(xing)。所以,必須(xu)根據實際控(kong)制的(de)(de)(de)(de)具體要(yao)求來確定TI 。比如:當(dang)差(cha)值(zhi)(zhi)(zhi)不是(shi)(shi)很大時(shi),可(ke)以減(jian)(jian)小控(kong)制效果(guo),維持原(yuan)系統(tong)的(de)(de)(de)(de)輸出值(zhi)(zhi)(zhi)。但是(shi)(shi)還是(shi)(shi)要(yao)將(jiang)偏差(cha)進行加法(fa)積(ji)累(lei)。當(dang)這個和累(lei)加超(chao)過預(yu)定值(zhi)(zhi)(zhi)時(shi),再一次性(xing)進行處理。從(cong)而(er)避免(mian)了頻繁(fan)控(kong)制而(er)出現振蕩現象(xiang)。
1.3 微分D
Derivative(微分(fen)),微分(fen)項部分(fen)其實就(jiu)是求電機轉速(su)的變(bian)化率。也就(jiu)是前(qian)后兩次差值的差。
微(wei)分調節器(qi)的微(wei)分方(fang)程為

圖示

圖3 微分控制器曲線
微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)反應了(le)偏(pian)差(cha)信號的(de)(de)(de)(de)(de)變(bian)(bian)(bian)化(hua)(hua)規律,或者說是(shi)(shi)變(bian)(bian)(bian)化(hua)(hua)趨(qu)勢(shi),偏(pian)差(cha)的(de)(de)(de)(de)(de)微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)實際偏(pian)差(cha)的(de)(de)(de)(de)(de)變(bian)(bian)(bian)化(hua)(hua)速率(lv),變(bian)(bian)(bian)化(hua)(hua)越(yue)快,其微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)絕對值越(yue)大。偏(pian)差(cha)增大時,其微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)為(wei)正;偏(pian)差(cha)減(jian)小時,其微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)為(wei)負(fu)。控制(zhi)器(qi)輸出(chu)量的(de)(de)(de)(de)(de)微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)部分(fen)(fen)(fen)(fen)與(yu)誤差(cha)的(de)(de)(de)(de)(de)微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)成(cheng)正比,反映了(le)被控量變(bian)(bian)(bian)化(hua)(hua)的(de)(de)(de)(de)(de)趨(qu)勢(shi)。根據(ju)(ju)偏(pian)差(cha)信號的(de)(de)(de)(de)(de)變(bian)(bian)(bian)化(hua)(hua)趨(qu)勢(shi)來進行超(chao)(chao)前(qian)(qian)調(diao)(diao)節,從(cong)而增加了(le)系統的(de)(de)(de)(de)(de)快速性。Td值越(yue)大,超(chao)(chao)前(qian)(qian)控制(zhi)作用就會(hui)越(yue)明顯,可以在做到提(ti)(ti)前(qian)(qian)控制(zhi)。比例僅(jin)僅(jin)是(shi)(shi)偏(pian)差(cha)的(de)(de)(de)(de)(de)放(fang)大增幅,表示當前(qian)(qian)調(diao)(diao)節參(can)數,微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)是(shi)(shi)預測(ce)偏(pian)差(cha)的(de)(de)(de)(de)(de)變(bian)(bian)(bian)化(hua)(hua),相當于提(ti)(ti)前(qian)(qian)加入了(le)控制(zhi)數據(ju)(ju)。在比例微(wei)(wei)(wei)(wei)分(fen)(fen)(fen)(fen)調(diao)(diao)節器(qi)中,能夠提(ti)(ti)前(qian)(qian)控制(zhi)偏(pian)差(cha),也有可能出(chu)現負(fu)值,避免了(le)惰(duo)性系統的(de)(de)(de)(de)(de)超(chao)(chao)調(diao)(diao)現象。
一、PID算法內容
2.1 PID算法選擇
PID算法(fa)中有比例積分調節(jie)(jie)(PI),比例微(wei)分調節(jie)(jie)器(PD),可根據系(xi)統要求進行選(xuan)擇,通常為了(le)改善調節(jie)(jie)品質,往(wang)往(wang)把比例、積分、微(wei)分三種作用組(zu)合起來(lai),形(xing)成PID調節(jie)(jie)器。理想(xiang)的PID微(wei)分方程為:

其中(zhong)u(t) 調節器的輸出信號;
e(t) 調節(jie)器的偏差信號,它等于給定值與測量值之差
Kp 為比例增益;
T i 積(ji)分(fen)時間
T d 微(wei)分(fen)時間
KP /T I 積分系(xi)數
KP / T D 微分系數
2.2 PID算法(fa)要求
PID需要在一個(ge)閉環系(xi)統(tong)里(li)面(橋黑板)。閉環系(xi)統(tong)即在控制系(xi)統(tong)中,有(you)執行處(chu)理單元,同時必(bi)須有(you)輸入反饋單元,電機系(xi)統(tong)中,必(bi)須有(you)編碼器、測速(su)電機等測速(su)設備。控制系(xi)統(tong)原理圖如下:

圖4 閉環PID控制系統
2.3 PID參數常用小口訣:
整定參數(shu)尋(xun)最佳(jia),從小到大逐步查;
先調(diao)比例后(hou)積分,微分作用最后(hou)加;
曲線震(zhen)蕩很頻(pin)繁,比例刻度要放(fang)大;
曲(qu)線漂浮波動大,比例刻度(du)要拉小;
曲(qu)線(xian)偏離回復慢,積分時間往小降(jiang);
曲線波動(dong)周期長(chang),積分時(shi)間要(yao)加(jia)長(chang);
曲線震蕩(dang)動作繁,微分時間(jian)要加長。
一、C代碼實現
由于(yu)計(ji)算(suan)機控(kong)制(zhi)是(shi)一種(zhong)采樣控(kong)制(zhi),它只能(neng)(neng)根據(ju)采樣許可的偏差計(ji)算(suan)控(kong)制(zhi)量,而不(bu)能(neng)(neng)象模擬控(kong)制(zhi)那(nei)樣連(lian)續輸出控(kong)制(zhi)量,進行連(lian)續控(kong)制(zhi)。那(nei)么上面的PID公式不(bu)能(neng)(neng)直接使用(yong),必須(xu)進行離散化處理
假設采(cai)樣時間間隔為T,則在k時刻:
偏差為e(k);
積分(fen)為e(k)+e(k-1)+e(k-2)+...+e(0);
微分(fen)為(e(k)-e(k-1))/T;
從而公(gong)式離散(san)化后(hou)如下:

k 采樣信號,k=0,1,2,…
u k 第k 次采樣時刻的計(ji)算機輸(shu)出值
e k 第k 次采(cai)樣(yang)時(shi)刻輸入的偏差(cha)值
e k −1 第k-1 次采樣時(shi)刻(ke)輸入的偏差值(zhi)。
實(shi)際上面的公式(shi)為位置式(shi)PID,運算較多,占用單片(pian)機資源(yuan),還可以(yi)推出增(zeng)量(liang)式(shi)PID:
U(k) = P *e(k) + I *[e(k)+e(k-1)+...+e(0)]+ D *[e(k)-e(k-1)]。
簡化(hua)后可(ke)以在C語(yu)言中寫成(cheng):
u(k) = u(k)-u(k-1) = Kp(e(k) - e(k-1)) + Ki *e(k) + Kd(e(k)) - 2e(k-1) + e(k-2))
上面(mian)的(de)表達式就是(shi)增量式表達形式,u(k)與最后三(san)次計算偏(pian)差有關。
C語言理(li)解(jie)代碼:
//創建變量結(jie)構(gou)體
struct pid_type{
float Kp; //PI調(diao)節的比例常數
float Ti; //PI調節的積分(fen)常數(shu)
float T; //采樣周(zhou)期
float Ki;
float ek; //偏差e[k]
float ek1; //偏(pian)差e[k-1]
float ek2; //偏差e[k-2]
float uk; //u[k]
signed int uk1; //對u[k]四舍五(wu)入取(qu)整
signed int adjust; //調節(jie)器輸出調整量
}pid;
//變(bian)量(liang)初始
void Pid_Init(void)
{
pid.Kp=4;
pid.Ti=0.005;
pid.T=0.001;
pid.Ki=0.6; //微(wei)分(fen)系數Kd=KpTd/T。根據(ju)實際(ji)調(diao)節
pid.ek=0;
pid.ek1=0;
pid.ek2=0;
pid.uk=0;
pid.uk1=0;
pid.adjust=0;
}
int PIDadjust(float ek) //PI調節算法
{
if( gabs(ek)<0.1 )
{
pid.adjust=0;
}
else
{
pid.uk=pid.Kp*(pid.ek-pid.ek1)+pid.Ki*pid.ek; //計算控(kong)制增量
pid.ek1=pid.ek;
pid.uk1=(signed int)pid.uk;
if(pid.uk>0)
{
if(piduk-piduk1>=0.5)
{
pi.uk1=pid.uk1+1;
}
}
if(piduk<0)
{
if(pid.uk1-pid.uk>=0.5)
{
pid.uk1=pid.uk1-1;
}
}
adjust=pid.uk1;
}
return adjust;
}
一、小結
增大比(bi)(bi)例系(xi)(xi)數P一般將加快系(xi)(xi)統的(de)響應,在(zai)有靜差的(de)情況下有利于(yu)減(jian)小靜差,但是過大的(de)比(bi)(bi)例系(xi)(xi)數會使系(xi)(xi)統有比(bi)(bi)較大的(de)超調,并產生振蕩,使穩定性變壞。
增(zeng)大積分時(shi)(shi)間I有利于減小超調,減小振(zhen)蕩,使系統(tong)的穩定(ding)性增(zeng)加,但是系統(tong)靜差消除時(shi)(shi)間變長。
增大微分時間D有利(li)于(yu)加快系統的(de)響(xiang)應(ying)速度,使系統超調量減小,穩定(ding)性增加,但(dan)系統對擾(rao)動的(de)抑制(zhi)能力(li)減弱(ruo)。
也可(ke)以說比例(li)系數P代表(biao)(biao)著(zhu)現(xian)在,表(biao)(biao)明現(xian)在預設值與實(shi)際的(de)偏差,積分代表(biao)(biao)著(zhu)過去(qu),是過去(qu)Ti時間(jian)內(nei)的(de)偏差積累,可(ke)以減少震(zhen)蕩(dang),微分D代表(biao)(biao)著(zhu)未(wei)來,反應了偏差變化(hua)率,可(ke)以超前預測并提出控制。
這里有關PID資料的講的非(fei)常好(hao),推薦給大家:
1. //blog.csdn.net/u010312937/article/details/53363831#t3《PID控制算(suan)法的C語(yu)言(yan)實現(xian)<完整版>》
2. //blog.csdn.net/qq229596421/article/details/51419813
3. //blog.csdn.net/msdnwolaile/article/details/51038196
祝君爽!!

