當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]很多同學(xué)都不清楚PID是個(gè)什么東西,因?yàn)楹芏嗖皇亲詣?dòng)化的學(xué)生。他們開口就要資料,要程序。這是明顯的學(xué)習(xí)方法不對(duì),起碼,首先,你要理解PID是個(gè)什么東西。本文以通俗的理解,以小車縱向控制舉例說(shuō)明PID的一些理解。首先,為什么要做PID?由于外界原因,小車的實(shí)際速度有時(shí)不穩(wěn)定,這是其...

很多同學(xué)都不清楚 PID 是個(gè)什么東西,因?yàn)楹芏嗖皇亲詣?dòng)化的學(xué)生。他們開口就要資料,要程序。這是明顯的學(xué)習(xí)方法不對(duì),起碼,首先,你要理解 PID 是個(gè)什么東西。

本文以通俗的理解,以小車縱向控制舉例說(shuō)明 PID 的一些理解。首先,為什么要做 PID?由于外界原因,小車的實(shí)際速度有時(shí)不穩(wěn)定,這是其一,要讓小車以最快的時(shí)間達(dá)到既定的目標(biāo)速度,這是其二。速度控制系統(tǒng)是閉環(huán),才能滿足整個(gè)系統(tǒng) 的穩(wěn)定要求,畢竟速度是系統(tǒng)參數(shù)之一,這是其三.小車調(diào)速肯定不是線性的,外界因素那么多,沒(méi)人能證明是線性的。如果是線性的,直接用P就可以了。比如在PWM=60%時(shí),速度是2M/S,那么你要它3M/S,就把 PWM 提高到90%。因?yàn)?/span>90/60=3/2,這樣一來(lái)太完美了。完美是不可能的。那么不是線性的,要怎么怎么控制 PWM 使速度達(dá)到定的速度呢?即要快,又要準(zhǔn),又要狠。(即快準(zhǔn)狠)系統(tǒng)這個(gè)速度的調(diào)整過(guò)程就必須通過(guò)某個(gè)算法調(diào)整,一般PID就是這個(gè)所用的算法。

可能你會(huì)想到,如果通過(guò)編碼器測(cè)得現(xiàn)在的速度是2.0m/s,要達(dá)到2.3m/s 的速度,那么我把 pwm 增大一點(diǎn)不就行了嗎?是的,增大 pwm 多少呢?必須要通過(guò)算法,因?yàn)?PWM和速度是個(gè)什么關(guān)系,對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō),誰(shuí)也不知道。要一點(diǎn)一點(diǎn)的試,加個(gè)1%,不夠,再加1%還是不夠,那么第三次你還會(huì)加1%嗎?很有可能就加2%了。通過(guò) PID 三個(gè)參數(shù)得到一個(gè)表達(dá)式:△ PWM=a *△ V1 b *△ V2 c *△ V3,a b c 是通過(guò)PID的那個(gè)長(zhǎng)長(zhǎng)的公式展開,然后化簡(jiǎn)后的數(shù)字,△V1,△V2,△V3此前第一次調(diào)整后的速度差 ,第二次調(diào)整后的速度差,第三次。。。。。一句話,PID 要使當(dāng)前速度達(dá)到目標(biāo)速度最快,需要建立如何調(diào)整 pwm 和速度之間的關(guān)系。

輸入輸出是什么:輸入就是前次速度,前前次速度,前前前次速度。輸出就是你的 PWM 應(yīng)該增加或減小多少。

為了避免教科書公式化的說(shuō)明,本文用口語(yǔ)化和通俗的語(yǔ)言描述。雖然不一定恰當(dāng),但意思差不多,就是那個(gè)事。如果要徹頭徹尾地弄 PID,建議多調(diào)試,寫幾個(gè)仿真程序。

PID 一般有兩種:位置式 PID 和增量式 PID。在小車?yán)镆话阌迷隽渴剑瑸槭裁茨??位置?PID 的輸出與過(guò)去的所有狀態(tài)有關(guān),計(jì)算時(shí)要對(duì) e(每一次的控制誤差)進(jìn)行累加,這個(gè)計(jì)算量非常大,而且沒(méi)有必要。而且小車的 PID 控制器的輸出并不是絕對(duì)數(shù)值,而是一個(gè)△,代表增多少,減多少。換句話說(shuō),通過(guò)增量 PID 算法,每次輸出是 PWM 要增加多少或者減小多少,而不是 PWM 的實(shí)際值。

下面均以增量式 PID 說(shuō)明。

這里再說(shuō)一下 P、I、D 三個(gè)參數(shù)的作用。P=Proportion,比例的意思,I是Integral,積分,D是Differential微分。

打個(gè)比方,如果現(xiàn)在的輸出是1,目標(biāo)輸出是100,那么 P 的作用是以最快的速度達(dá)到100,把 P 理解為一個(gè)系數(shù)即可;而 I 呢?大家學(xué)過(guò)高數(shù)的,0的積分才能是一個(gè)常數(shù),I 就是使誤差為0而起調(diào)和作用;D 呢?大家都知道微分是求導(dǎo)數(shù),導(dǎo)數(shù)代表切線是吧,切線的方向就是最快到至高點(diǎn)的方向。這樣理解,最快獲得最優(yōu)解,那么微分就是加快調(diào)節(jié)過(guò)程的作用了。

公式本來(lái)需要推導(dǎo)的,我就不來(lái)這一套了。直接貼出來(lái):看看最后的結(jié)果:△Uk=A*e(k) B*e(k-1) C*e(k-2)

這里KP是P的值TD是D的值1/Ti是I的值,都是常數(shù),哦,還有一個(gè) T,T 是采樣周期,也是已知。而 A B C 是由PID換算來(lái)的,按這個(gè)公式,就可以簡(jiǎn)化計(jì)算量了,因?yàn)?P I D 是常數(shù),那么 A B C 可以用一個(gè)宏表示。這樣看來(lái),只需要求e(k)、e(k-1)、e(k-2)就可以知道△Uk的值了,按照△Uk 來(lái)調(diào)節(jié) PWM 的大小就OK 了。PID 三個(gè)參數(shù)的確定有很多方法,不在本文討論范圍內(nèi)。采樣周期也是有據(jù)可依的,不能太大,也不能太小。

PID 實(shí)際編程的過(guò)程的,要注意的東西還是有幾點(diǎn)的。PID 這東西可以做得很深。

1、PID 的診定。湊試法,臨界比例法,經(jīng)驗(yàn)法。

2 、T 的確定,采樣周期應(yīng)遠(yuǎn)小于過(guò)程的擾動(dòng)信號(hào)的周期,在小車程序中一般是 ms 級(jí)別。

3 、目標(biāo)速度何時(shí)賦值問(wèn)題,如何更新新的目標(biāo)速度?這個(gè)問(wèn)題一般的人都忽略了。目標(biāo)速度肯定不是個(gè)恒定的,那么何時(shí)改變目標(biāo)速度呢?

4 、改變了目標(biāo)速度,那么e(k)、e(k-1)、e(k-2)怎么改變呢?是賦0還是要怎么變?

5 、是不是 PID 要一直開著?

6 、error 為多少時(shí)就可以當(dāng)速度已達(dá)到目標(biāo)?

7、 PID 的優(yōu)先級(jí)怎么處理,如果和圖像采集有沖突怎么辦?

8 、PID 的輸入是速度,輸出是 PWM,按理說(shuō) PWM 產(chǎn)生速度,但二者不是同一個(gè)東西,有沒(méi)有問(wèn)題?

9 、PID 計(jì)算如何優(yōu)化其速度?指針,匯編,移位?都可以試!

//*****************************************************
//定義?PID?結(jié)構(gòu)體
//*****************************************************
typedef?struct?PID
{
??int?SetPoint;?//設(shè)定目標(biāo)?Desired?Value
??double?Proportion;?//比例常數(shù)?Proportional?Const
??double?Integral;?//積分常數(shù)?Integral?Const
??double?Derivative;?//微分常數(shù)?Derivative?Const
??int?LastError;?//Error[-1]
??int?PrevError;?//Error[-2]
}?PID;
//*****************************************************
//定義相關(guān)宏
//*****************************************************
#define?P_DATA?100
#define?I_DATA?0.6
#define?D_DATA?1

#define?HAVE_NEW_VELOCITY?0X01
//*****************************************************
//聲明?PID?實(shí)體
//*****************************************************
static?PID?sPID;
static?PID?*sptr?=?
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉