|
之前章節(jié)已經(jīng)把PID從理論到時(shí)間基本上講完了,剩下一個(gè)位置式PID就能收尾了。趕緊更完,就開始平衡小車下一步制作了。最近也是比較忙,更貼慢了很多。不過,這個(gè)零基礎(chǔ)教程我還是要堅(jiān)持寫完的。
位置式PID部分主要代碼
/********************位置式 PID 控制設(shè)計(jì)************************************/unsigned int LocPIDCalc(int NextPoint){ int iError,dError; iError = SetPoint - NextPoint; //求出當(dāng)前偏差 SumError += iError; //對(duì)偏差進(jìn)行積分 dError = iError - LastError; //對(duì)偏差求微分 LastError = iError; //轉(zhuǎn)換賦值 //返回位置式PID計(jì)算結(jié)果 return(Proportion * iError //比例項(xiàng) + Integral * SumError //積分項(xiàng) + Derivative * dError); //微分項(xiàng)}
注釋已經(jīng)很詳細(xì)了,看了之前我的帖子應(yīng)該能看的懂代碼的。推導(dǎo)過程不明白的在往前看看吧。
之后在中斷中直接調(diào)用公式即可,計(jì)算出來的結(jié)果直接賦值給PWM(計(jì)算結(jié)果既是PWM,計(jì)算出來是0,PWM就是0)
count=(short)(TIM2 -> CNT/4); TIM2 -> CNT=0;/* 計(jì)數(shù)得到增量式PID的增量數(shù)值 */PWM_Duty=LocPIDCalc(count); //將計(jì)算的PWM送入寄存器TIM_SetCompare1(TIM3,PWM_Duty);
完事了,是不是很簡(jiǎn)單。
位置式PID調(diào)參
位置式PID和增量式PID調(diào)參還是有點(diǎn)區(qū)別的。下面說下具體調(diào)參過程和思路。
思路還是將ID系數(shù)設(shè)為0,先調(diào)節(jié)單獨(dú)的P。
當(dāng)P = 2時(shí),如下圖:
是不是有點(diǎn)懵逼,怎么趨近一條直線了?不應(yīng)該是越來越靠近目標(biāo)值嗎?如果你這樣想的,那真是還沒理解公式呀。仔細(xì)看看公式,當(dāng)ID為0,只有一個(gè)P時(shí),是不是應(yīng)該就是一條直線?下面說下為啥是直線。第一次采樣:假設(shè)初始化目標(biāo)值為100個(gè)脈沖,第一次采樣測(cè)得脈沖為0個(gè),此時(shí)誤差為100,在乘上系數(shù)2,最終占空比為200。第二次采樣:假設(shè)采樣50個(gè)脈沖,誤差為50,乘上系數(shù),2,最終得占空比為100.第三次采樣:假設(shè)采樣脈沖為25,誤差為75,乘上系數(shù)2,最終占空比為150
以此循環(huán)得出結(jié)果:誤差越大,占空比越大,誤差越小,占空比越小,也就是說誤差越大輸出越大,誤差越小,輸出越小。在經(jīng)過N次采樣后,會(huì)得到一個(gè)平衡值、平衡的條件是計(jì)算出來的占空比1所對(duì)應(yīng)的編碼器輸出值被目標(biāo)值減去之后再乘上P,得出來的占空比2和占空比相同。本例程實(shí)際測(cè)得當(dāng)占空比為146,使得編碼器輸出28個(gè)脈沖, 目標(biāo)值100-28=72,72乘上P系數(shù)2=144,144和146非常接近,也就相當(dāng)于平衡了。因此只有P項(xiàng)時(shí),會(huì)輸出一條直線。
當(dāng)P = 5時(shí),如下圖:
此時(shí)抖動(dòng)比較大,不過最終還會(huì)趨近直線。這里抖動(dòng)大,也說明響應(yīng)速度快,對(duì)比增量式PID調(diào)節(jié)方法,增量式PID調(diào)節(jié)P時(shí),是將系統(tǒng)在目標(biāo)值附近抖動(dòng)兩三下之后迅速穩(wěn)定下來為最佳,我們這里也可以這樣來調(diào)節(jié),只不過增量式是趨近于目標(biāo)值,而位置式是趨近于一條直線。
這里我們選擇P=3,如下圖:
我們看上圖抖動(dòng)兩三下就可以趨近于一條直線,說明這個(gè)P差不多可以了。
當(dāng)P = 3時(shí),調(diào)節(jié)I,當(dāng)P = 3 ,I = 1時(shí)如下圖:
你會(huì)發(fā)現(xiàn)曲線會(huì)越過目標(biāo)值,因?yàn)榧尤肓藲v史誤差,在第一次未達(dá)到目標(biāo)值期間,累積誤差都是為正的,再加上P,使得系統(tǒng)超過目標(biāo)值。當(dāng)采樣值超過目標(biāo)之后,累積誤差就會(huì)出現(xiàn)負(fù)值,將會(huì)抵消一部分前面的正值誤差,因此會(huì)出現(xiàn)不對(duì)稱的情況。之前只有P時(shí),直線上下震動(dòng)的賦值是對(duì)稱的,加入累積誤差之后,圖中橫線是目標(biāo)值,在目標(biāo)值上方的誤差值都為正(因?yàn)槎际切∮谀繕?biāo)值,誤差=目標(biāo)值-當(dāng)前值>0),說明大多數(shù)情況都是未能達(dá)到目標(biāo)值。因此系統(tǒng)會(huì)慢慢將這些正的誤差值加起來代入到系統(tǒng),會(huì)使得系統(tǒng)慢慢趨近于目標(biāo)值,而不是像上面一樣形成一條直線。
當(dāng)P = 3 ,I = 2時(shí)如下圖:
你會(huì)發(fā)現(xiàn),斜線更抖了,因?yàn)镮的作用增強(qiáng)了,響應(yīng)更快了。
加入D,當(dāng)P = 3 ,I = 2,D = -0.1時(shí)如下圖:曲線變得很平順了,沒有上一張圖中的抖動(dòng)了,這個(gè)效果還是不錯(cuò)的。
加入D,當(dāng)P = 3 ,I = 2,D = -2時(shí)如下圖:D大了會(huì)出現(xiàn)回彈,說明D抑制的太過了。
因此當(dāng)P = 3 ,I = 2,D = -0.1使得整體效果最佳。至此,PID完結(jié)。
|
|