當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > PID算法的C程序?qū)崿F(xiàn)方式,大神帶你入門(mén)
一、PID算法簡(jiǎn)介
在水溫控制模型、智能車(chē)比賽、四軸飛行器穩(wěn)定,平衡車(chē)速度等控制實(shí)現(xiàn)時(shí),因?yàn)轭A(yù)設(shè)值與實(shí)際控制效果之間存在一定的偏差、實(shí)際輸出與數(shù)據(jù)反饋之間存在一定的延時(shí),往往不能得到理想的控制效果。PID作為應(yīng)用為廣泛的一種自動(dòng)控制器,在實(shí)際控制中加入PID算法將能達(dá)到系統(tǒng)不斷靈活變化的效果。
上面的提到的幾種實(shí)例都可以稱(chēng)為惰性系統(tǒng)(過(guò)程控制對(duì)象具有“一介滯后+純滯后”與“二介滯后+純滯后 ”特點(diǎn),說(shuō)白了就是響應(yīng)延遲+反饋延時(shí)),PID控制器是一種最優(yōu)控制器。
顧名思義,P指是比例(Proportion),I指是積分(Integral),D指微分(Differential)。在電機(jī)調(diào)速系統(tǒng)中,輸入信號(hào)為正,要求電機(jī)正轉(zhuǎn)時(shí),反饋信號(hào)也為正(PID算法時(shí),誤差=輸入-反饋),同時(shí)電機(jī)轉(zhuǎn)速越高,反饋信號(hào)越大。要想搞懂PID算法的原理,首先必須先明白P,I,D各自的含義及控制規(guī)律:
1.1比例P
Proportion(比例),就是輸入偏差乘以一個(gè)常數(shù)。
比例調(diào)節(jié)器方程為:
y=Kp*e(t)
調(diào)節(jié)器的輸出與輸入偏差成正比。比例項(xiàng)部分其實(shí)就是對(duì)預(yù)設(shè)值和反饋值差值的放大倍數(shù)。
圖示
圖1 比例放大示意圖
控制對(duì)象為電機(jī)時(shí),比例Kp越大時(shí),電機(jī)轉(zhuǎn)速回歸到輸入值的速度將更快,及調(diào)節(jié)靈敏度就越高。從而,加Kp值,可以減少?gòu)姆欠(wěn)態(tài)到穩(wěn)態(tài)的時(shí)間。但是同時(shí)也可能造成電機(jī)轉(zhuǎn)速在預(yù)設(shè)值附近振蕩的情形,即用力過(guò)猛,調(diào)整跨度太大,如果是舵機(jī)轉(zhuǎn)向系統(tǒng),會(huì)出現(xiàn)智能車(chē)搖擺S型前進(jìn),這就是Kp過(guò)大造成的,所以又引入積分I解決此問(wèn)題。
1.2 積分I
Integral(積分),積分作用是指調(diào)節(jié)器的輸出與輸入偏差的積分成比例的作用。
積分方程為:
Ti是積分時(shí)間常數(shù),它表示積分速度的大小,Ti越大,積分速度越慢,積分作用越弱。
圖示
圖2 積分調(diào)節(jié)示意圖
積分環(huán)節(jié)的調(diào)節(jié)作用雖然會(huì)消除靜態(tài)誤差,但也會(huì)降低系統(tǒng)的響應(yīng)速度,也就是積分項(xiàng)的調(diào)節(jié)存在明顯的滯后,因?yàn)門(mén)i代表的是時(shí)間常數(shù),Ti值越大,時(shí)間越長(zhǎng),滯后效果越明顯,增加系統(tǒng)的超調(diào)量。積分常數(shù)T I 越大,積分的積累作用越弱。增大積分常數(shù)T I 會(huì)減慢靜態(tài)誤差的消除過(guò)程,但可以減少超調(diào)量,提高系統(tǒng)的穩(wěn)定性。所以,必須根據(jù)實(shí)際控制的具體要求來(lái)確定TI 。比如:當(dāng)差值不是很大時(shí),可以減小控制效果,維持原系統(tǒng)的輸出值。但是還是要將偏差進(jìn)行加法積累。當(dāng)這個(gè)和累加超過(guò)預(yù)定值時(shí),再一次性進(jìn)行處理。從而避免了頻繁控制而出現(xiàn)振蕩現(xiàn)象。
1.3 微分D
Derivative(微分),微分項(xiàng)部分其實(shí)就是求電機(jī)轉(zhuǎn)速的變化率。也就是前后兩次差值的差。
微分調(diào)節(jié)器的微分方程為
圖示
圖3 微分控制器曲線
微分反應(yīng)了偏差信號(hào)的變化規(guī)律,或者說(shuō)是變化趨勢(shì),偏差的微分實(shí)際偏差的變化速率,變化越快,其微分絕對(duì)值越大。偏差增大時(shí),其微分為正;偏差減小時(shí),其微分為負(fù)。控制器輸出量的微分部分與誤差的微分成正比,反映了被控量變化的趨勢(shì)。根據(jù)偏差信號(hào)的變化趨勢(shì)來(lái)進(jìn)行超前調(diào)節(jié),從而增加了系統(tǒng)的快速性。Td值越大,超前控制作用就會(huì)越明顯,可以在做到提前控制。比例僅僅是偏差的放大增幅,表示當(dāng)前調(diào)節(jié)參數(shù),微分是預(yù)測(cè)偏差的變化,相當(dāng)于提前加入了控制數(shù)據(jù)。在比例微分調(diào)節(jié)器中,能夠提前控制偏差,也有可能出現(xiàn)負(fù)值,避免了惰性系統(tǒng)的超調(diào)現(xiàn)象。
一、PID算法內(nèi)容
2.1 PID算法選擇
PID算法中有比例積分調(diào)節(jié)(PI),比例微分調(diào)節(jié)器(PD),可根據(jù)系統(tǒng)要求進(jìn)行選擇,通常為了改善調(diào)節(jié)品質(zhì),往往把比例、積分、微分三種作用組合起來(lái),形成PID調(diào)節(jié)器。理想的PID微分方程為:
其中u(t) 調(diào)節(jié)器的輸出信號(hào);
e(t) 調(diào)節(jié)器的偏差信號(hào),它等于給定值與測(cè)量值之差
Kp 為比例增益;
T i 積分時(shí)間
T d 微分時(shí)間
KP /T I 積分系數(shù)
KP / T D 微分系數(shù)
2.2 PID算法要求
PID需要在一個(gè)閉環(huán)系統(tǒng)里面(橋黑板)。閉環(huán)系統(tǒng)即在控制系統(tǒng)中,有執(zhí)行處理單元,同時(shí)必須有輸入反饋單元,電機(jī)系統(tǒng)中,必須有編碼器、測(cè)速電機(jī)等測(cè)速設(shè)備。控制系統(tǒng)原理圖如下:
圖4 閉環(huán)PID控制系統(tǒng)
2.3 PID參數(shù)常用小口訣:
整定參數(shù)尋最佳,從小到大逐步查;
先調(diào)比例后積分,微分作用最后加;
曲線震蕩很頻繁,比例刻度要放大;
曲線漂浮波動(dòng)大,比例刻度要拉小;
曲線偏離回復(fù)慢,積分時(shí)間往小降;
曲線波動(dòng)周期長(zhǎng),積分時(shí)間要加長(zhǎng);
曲線震蕩動(dòng)作繁,微分時(shí)間要加長(zhǎng)。
一、C代碼實(shí)現(xiàn)
由于計(jì)算機(jī)控制是一種采樣控制,它只能根據(jù)采樣許可的偏差計(jì)算控制量,而不能象模擬控制那樣連續(xù)輸出控制量,進(jìn)行連續(xù)控制。那么上面的PID公式不能直接使用,必須進(jìn)行離散化處理
假設(shè)采樣時(shí)間間隔為T(mén),則在k時(shí)刻:
偏差為e(k);
積分為e(k)+e(k-1)+e(k-2)+...+e(0);
微分為(e(k)-e(k-1))/T;
從而公式離散化后如下:
k 采樣信號(hào),k=0,1,2,…
u k 第k 次采樣時(shí)刻的計(jì)算機(jī)輸出值
e k 第k 次采樣時(shí)刻輸入的偏差值
e k −1 第k-1 次采樣時(shí)刻輸入的偏差值。
實(shí)際上面的公式為位置式PID,運(yùn)算較多,占用單片機(jī)資源,還可以推出增量式PID:
U(k) = P *e(k) + I *[e(k)+e(k-1)+...+e(0)]+ D *[e(k)-e(k-1)]。
簡(jiǎn)化后可以在C語(yǔ)言中寫(xiě)成:
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))
上面的表達(dá)式就是增量式表達(dá)形式,u(k)與最后三次計(jì)算偏差有關(guān)。
C語(yǔ)言理解代碼:
//創(chuàng)建變量結(jié)構(gòu)體
struct pid_type{
float Kp; //PI調(diào)節(jié)的比例常數(shù)
float Ti; //PI調(diào)節(jié)的積分常數(shù)
float T; //采樣周期
float Ki;
float ek; //偏差e[k]
float ek1; //偏差e[k-1]
float ek2; //偏差e[k-2]
float uk; //u[k]
signed int uk1; //對(duì)u[k]四舍五入取整
signed int adjust; //調(diào)節(jié)器輸出調(diào)整量
}pid;
//變量初始
void Pid_Init(void)
{
pid.Kp=4;
pid.Ti=0.005;
pid.T=0.001;
pid.Ki=0.6; //微分系數(shù)Kd=KpTd/T。根據(jù)實(shí)際調(diào)節(jié)
pid.ek=0;
pid.ek1=0;
pid.ek2=0;
pid.uk=0;
pid.uk1=0;
pid.adjust=0;
}
int PIDadjust(float ek) //PI調(diào)節(jié)算法
{
if( gabs(ek)<0.1 )
{
pid.adjust=0;
}
else
{
pid.uk=pid.Kp*(pid.ek-pid.ek1)+pid.Ki*pid.ek; //計(jì)算控制增量
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;
}
一、小結(jié)
增大比例系數(shù)P一般將加快系統(tǒng)的響應(yīng),在有靜差的情況下有利于減小靜差,但是過(guò)大的比例系數(shù)會(huì)使系統(tǒng)有比較大的超調(diào),并產(chǎn)生振蕩,使穩(wěn)定性變壞。
增大積分時(shí)間I有利于減小超調(diào),減小振蕩,使系統(tǒng)的穩(wěn)定性增加,但是系統(tǒng)靜差消除時(shí)間變長(zhǎng)。
增大微分時(shí)間D有利于加快系統(tǒng)的響應(yīng)速度,使系統(tǒng)超調(diào)量減小,穩(wěn)定性增加,但系統(tǒng)對(duì)擾動(dòng)的抑制能力減弱。
也可以說(shuō)比例系數(shù)P代表著現(xiàn)在,表明現(xiàn)在預(yù)設(shè)值與實(shí)際的偏差,積分代表著過(guò)去,是過(guò)去Ti時(shí)間內(nèi)的偏差積累,可以減少震蕩,微分D代表著未來(lái),反應(yīng)了偏差變化率,可以超前預(yù)測(cè)并提出控制。
這里有關(guān)PID資料的講的非常好,推薦給大家:
1. https://blog.csdn.net/u010312937/article/details/53363831#t3《PID控制算法的C語(yǔ)言實(shí)現(xiàn)<完整版>》
2. https://blog.csdn.net/qq229596421/article/details/51419813
3. https://blog.csdn.net/msdnwolaile/article/details/51038196
祝君爽!!