一、總體原則
PID調(diào)試一般原則
a.在輸出不振蕩時,增大比例增益P。
b.在輸出不振蕩時,減小積分時間常數(shù)Ti。
c.在輸出不振蕩時,增大微分時間常數(shù)Td。
二、各環(huán)節(jié)作用
[P]比例調(diào)節(jié)作用:是按比例反應(yīng)系統(tǒng)的偏差,系統(tǒng)一旦出現(xiàn)了偏差,比例調(diào)節(jié)立即產(chǎn)生調(diào)節(jié)作用用以減少偏差。比例作用大,可以加快調(diào)節(jié),減少誤差,但是過大的比例,使系統(tǒng)的穩(wěn)定性下降,甚至造成系統(tǒng)的不穩(wěn)定。反之,過小,更不上系統(tǒng)需求。
[I]積分調(diào)節(jié)作用:是使系統(tǒng)消除穩(wěn)態(tài)誤差,提高無差度。因為有誤差,積分調(diào)節(jié)就進行,直至無差,積分調(diào)節(jié)停止,積分調(diào)節(jié)輸出一常值。積分作用的強弱取決與積分時間常數(shù)Ti,Ti越小,積分作用就越強。反之Ti大則積分作用弱,加入積分調(diào)節(jié)可使系統(tǒng)穩(wěn)定性下降,動態(tài)響應(yīng)變慢。一般情況是將時間常數(shù)設(shè)置很小。積分作用常與另兩種調(diào)節(jié)規(guī)律結(jié)合,組成PI調(diào)節(jié)器或PID調(diào)節(jié)器。
[D]微分調(diào)節(jié)作用:微分作用反映系統(tǒng)偏差信號的變化率,具有預(yù)見性,能預(yù)見偏差變化的趨勢,因此能產(chǎn)生超前的控制作用,在偏差還沒有形成之前,已被微分調(diào)節(jié)作用消除。因此,可以改善系統(tǒng)的動態(tài)性能。在微分時間選擇合適情況下,可以減少超調(diào),減少調(diào)節(jié)時間。微分作用對噪聲干擾有放大作用,因此過強 的加微分調(diào)節(jié),對系統(tǒng)抗干擾不利。此外,微分反應(yīng)的是變化率,而當(dāng)輸入沒有變化時,微分作用輸出為 零。微分作用不能單獨使用,需要與另外兩種調(diào)節(jié)規(guī)律相結(jié)合,組成PD或PID控制器。
三、細說[分為PID、PI、PD]
1、確定比例增益P
確定比例增益P 時,首先去掉PID的積分項和微分項,一般是令Ti=0、Td=0(具體見PID的參數(shù)設(shè)定說明),使PID為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許的最大值的60%~70%,由0逐漸加大比例增益P,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時的比例增益P逐漸減小,直至系統(tǒng)振蕩消失,記錄此時的比例增益P,設(shè)定PID的比例增益P為當(dāng)前值的60%~70%。比例增益P調(diào)試完成。
【解說】我們知道P是調(diào)節(jié)與預(yù)設(shè)值(即輸入值)的偏差的作用的,因此P很大時,當(dāng)反饋值很小時也會造成很大的波動,最終是震蕩狀態(tài),這個可以試出來的,這時的P是Pmax。反之P太小時,根本不可能靠近預(yù)設(shè)值,當(dāng)剛好能靠近預(yù)設(shè)值時,這時的P就是Pmin。一般取P = Pmax(*60~70%)。
2、確定積分時間常數(shù)Ti
比例增益P確定后,設(shè)定一個較大的積分時間常數(shù)Ti的初值,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,之后在反過來,逐漸加大Ti,直至系統(tǒng)振蕩消失。記錄
此時的Ti,設(shè)定PID的積分時間常數(shù)Ti為當(dāng)前值的150%~180%。積分時間常數(shù)Ti調(diào)試完成。
【解說】
3、確定積分時間常數(shù)Td積分時間常數(shù)Td一般不用設(shè)定,為0即可。若要設(shè)定,與確定 P和Ti 的方法相同,取不振蕩時的30%。
【解說】
【PID算法演示小軟件(綠色版)】
四、具體實踐
上面的程序代碼是整個PID控制的模板。具體的看你的系統(tǒng)需求。下面我講講倒立擺(還不知道倒立擺是什么的可以去網(wǎng)上了解下)的PID控制:
【單個傳感器實現(xiàn)倒立擺】
角度傳感器(精密電位器):我們知道一般的精密電位器就可以當(dāng)作傳感器來使用,電位器三個腳,其中一端接GND,一端接VCC,那么中間端作為電壓輸出,通過AD采樣既可以獲取擺轉(zhuǎn)過的角度位置。自然在擺的最高點就有一個角度值。為了獲得較好的控制周期,我們采用定時器中斷的方式,即在定時器中斷中進行采樣和數(shù)據(jù)處理,并進行電機控制(放心,STM32運行速度足夠了)。這里取定時器三毫米中斷一次,注意,AD采樣的時間一定要小于定時器中斷時間,否則會出現(xiàn)時序錯亂,可以在AD初始化中設(shè)定采樣周期,或者在中斷函數(shù)里面進行適當(dāng)?shù)奶幚恚热绶秩尾蓸尤∑骄担ㄟ@個需要設(shè)定更小的中斷時間,如一毫秒中斷一次,我就是這樣的做的)。定時器初始化和一些變量的定義我就沒貼代碼了,具體的代碼如下:
05if(TIM3->SR&0X0001){//溢出中斷06LED1 = ~LED1;07timercount++;08}09TIM3->SR &= ~(1<<0);//清除中斷標(biāo)志位10
11if(timercount == 1){12ang[0] = Get_Adc(ADC_CH1);13}14if(timercount == 2){15ang[1] = Get_Adc(ADC_CH1);16}17if(timercount == 3){18////////////angle PID///////////19ang[2] = Get_Adc(ADC_CH1);//采集AD值20angleLast = angle;//保存上一次的采樣角度值21angle = (ang[0]+ang[1]+ang[2])/3;//取三次采集的平均值22degreeLast = degree;//保存上一次的計算角度值23degree = calcAngle(angle);//獲取新的計算角度值24
25velocity = (angle - angleLast);//得到采樣角速度差值(微分值)26if(abs(angle-setPoint)<=4)//輸入值與反饋值差的絕對值 < 427error_p = 0;//p = 0