找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1998|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

零基礎(chǔ)制作平衡小車【連載】11---位置式PID調(diào)參(附源碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:223481 發(fā)表于 2020-12-17 22:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
之前章節(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é)。

基本定時(shí)器: PWM輸出編碼器輸入捕獲檢測(cè)電機(jī)轉(zhuǎn)速 -位置式PID.7z

196.31 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表