天天看點

PID控制原理

經常有人問有關PID的用法,看一些有關單片及應用的書上都有關于PID的應用原理,但是面對具體的問題就不知道如何應用了,主要的問題是裡面所用到的參數以及計算結果需要進行什麼處理,通過什麼樣的換算才能具體的應用于實際,另外在計算方法上也存在着數值計算的算法問題,今天我在這裡例舉溫度控中的PID部分,希望能夠把PID的具體應用說明白。 

一般書上提供的計算公式中的幾個名詞:

1. 直接計算法和增量算法,這裡的所謂增量算法就是相對于标準算法的相鄰兩次運算之差,得到的結果是增量,也就是說,在上一次的控制量的基礎上需要增加(負值意味着減少)控制量,例如對于可控矽電機調速系統,就是可控矽的觸發相位還需要提前(或遲後)的量,對于溫度控制就是需要增加(或減少)加熱比例,根據具體的應用适當選擇采用哪一種算法,但基本的控制方法、原理是完全一樣的,直接計算得到的是目前需要的控制量,相鄰兩次控制量的差就是增量;

2. 基本偏差e(t),表示目前測量值與設定目标間的差,設定目标是被減數,結果可以是正或負,正數表示還沒有達到,負數表示已經超過了設定值。這是面向比例項用的變動資料。

3. 累計偏差Σ(e)= e(t)+e(t-1)+e(t-2)+…e(1),這是我們每一次測量到的偏內插補點的總和,這是代數和,考慮到他的正負符号的運算的,這是面向積分項用的一個變動資料。

4. 基本偏差的相對偏差e(t)-e(t-1),用本次的基本偏差減去上一次的基本偏差,用于考察目前控制的對象的趨勢,作為快速反應的重要依據,這是面向微分項的一個變動資料。

5. 三個基本參數:Kp,Ki,Kd.這是做好一個控制器的關鍵常數,分别稱為比例常數、積分常數和微分常數,不同的控制對象他們需要選擇不同的數值,還需要經過現場調試才能獲得較好的效果。

6. 标準的直接計算法公式:

Pout(t)=Kp*e(t)+Ki*Σe(t)+Kd*(e(t)-e(t-1));

上一次的計算值:

Pout(t-1)=Kp*e(t-1)+Ki*Σe(t-1)+Kd*(e(t-1)-e(t-2));

兩式相減得到增量法計算公式:

Pdlt=Kp*(e(t)-e(t-1)+Ki*Σe(t)+Kd*(e(t)-2*e(t-1)+e(t-2));

*這裡我們對Σ項的表示應該是對e(i)從1到t全部總和,但為了打字的簡便就記作Σe(t).

三個基本參數Kp,Ki,Kd.在實際控制中的作用:     

比例調節作用:是按比例反應系統的偏差,系統一旦出現了偏差,比例調節立即産生調節作用用以減少偏差。比例作用大,可以加快調節,減少誤差,但是過大的比例,使系統的穩定性下降,甚至造成系統的不穩定。

積分調節作用:是使系統消除穩态誤差,提高無差度。因為有誤差,積分調節就進行,甚至無差,積分調節停止,積分調節輸出一常值。積分作用的強弱取決于積分時間常數Ti,Ti越小,積分作用就越強。反之Ti大則積分作用弱,加入積分調節可使系統穩定性下降,動态響應變慢。積分作用常與另兩種調節規律結合,組成PI調節器或PID調節器。 

微分調節作用:微分作用反映系統偏差信号的變化率,具有預見性,能遇見偏差變化的趨勢,是以能産生超前的控制作用,在偏差還沒有形成之前,已被微分調節作用消除。是以,可以改善系統的動态性能。在微分時間選擇合适情況下。可以減少超調,減少調節時間。微分作用對噪聲幹擾有放大作用,是以過強的加微分調節,對系統抗幹擾不利。此外,微分反應是變化率,而當輸入沒有變化時,微分作用輸出為零。微分作用不能單獨使用,需要與另外兩種調節規律相結合,組成PD或PID控制器。

具體應用中的數值量化處理:      

上面隻是控制算法的數學方法,似乎有點抽象,在具體的控制項目中怎樣對應呢?也就是具體的量化問題。下面舉一個在溫度控制中的處理方法。

對于加溫的溫度控制可以采用調節供電電壓或在一定的時間循環周期内的供電時間比例來調節加溫控制溫度,一般以調節加溫時間比例比較簡單,也是控制上比較常用的方法。調壓法控制的原理是通過可控矽的處罰相位角達到對電壓的調節,這個電壓是指有效電壓,直覺上就是對一個正弦波形的前邊切掉一塊,用不同的切割位置以保留剩餘的面積。為了叙述友善,我們還是采用控制時間比例的辦法:我們設定一個标準的加溫周期,例如2分鐘,我們就在這個兩分鐘周期内對輸出進行控制,也就是說在這個2分鐘内加溫多少時間,全速加溫就是連續整個周期(2分鐘)都加溫,當然停止加溫就是完全不輸出,根據我們的計算可以讓加溫時間在0-2分鐘内變化,比如計算所得我們在這一個周期内應該加溫1分30秒,經過兩分鐘以後再測量被加溫物體的溫度,通過計算我們應該加溫1分28秒,等等等等,這裡除了加溫以外的時間就是不加溫,等等下一個周期到來,再進行實際測量計算下一周期我們的輸出量,周而複始,不斷地修正我們的輸出量,以達到對溫度有效控制。

為了對應我們的程式處理上的友善,我們在程式内部一般并不是用時分秒來計算的,通常我們會使用系統的一個定時器用于系統全部時鐘,例如顯示重新整理、鍵盤掃描等,相對于計算來說,我們的控制周期比較長,是以我們可以對2分鐘進行細分,例如我們用每分鐘進行100等分,則兩分鐘就是200等分,用于我們的溫度控制,這樣的輸出比例的變化已經足夠了,我們可以有200個輸出等級了。取200的另一個好處是,對應于我們的8位單片機剛好可以在一個位元組内進行運算,程式簡單運算速度快。當需要改變我們的定時周期時,有些不同的加熱對象,例如較大熱慣性的加熱對象時,可能2分鐘周期太短了,我們可以通過修改基本定時常數的辦法來實作,而保持我們的200等分不變。我們對2分鐘進行200等分,算一下他的每一個基本機關的具體時間?

To=60*2/200=0.6s=600ms

這對于單片機來說太長了,因為如果我讓我的定時器做到這麼慢的定時周期就幹不了别的事了,為了顯示、鍵盤等的處理一般我們定時在5-10ms,是以就需要另外設定一個變量tTempl在每一個定時中斷發生時對tTempl 計數。例如我的系統定時器的定時常數對應于10ms,則設定tTempl在達到60的時候才确認是達到600ms了,才作為一個基本的輸出時間機關。對應于總周期的修改,我們的200等分可以不用修改,而隻要修改我們的變量tTempl的判斷邊界就可以了,例如對應于2分鐘時是60,則在3分鐘為周期時邊界改為90就行了,定下了我們的基本控制時間分辨率以後,我們的計算就可以不用改變了。當然,根據您的具體對象也可以修改這個等分數,我這裡隻是作為一個舉例:例如200等分。

溫控儀器不離開測溫器件,無論用什麼測溫器件(傳感器),對于控制上來說,首先需要将測到的值換算為溫度資料,一般我們國内都采用攝氏度℃,工業上使用的測溫器件一般都是非線性的器件,經過放大、A/D轉換所得到的電壓資料與溫度呈非線性關系,存在着微小的差異,一般采用電壓值表的辦法獲得實際溫度,這個表格是以每一個溫度點上的電壓值來表述的,由于我們的單片機rom的大小限制,這個表格也不可能做得很細,基本上以度作為間隔,也就是說直接查表隻能獲得度為機關的溫度值,而實際測量的溫度可能是介于T與T+1度之間,在PID控制計算上,這樣的分辨率是不夠的,是以我們還需要進一步獲得具體的溫度精确資料,一般采用将T與T+1之間的電壓差和AD實際值(mv)進行定分比分點的辦法(更精确的是采用二次插值計算法)獲得溫度的精确數值,也就是獲得小數部分。如果能夠做到1/10度的溫度分辨率精度就可以基本滿足控制運算要求了,是以我們可以用定點數的辦法處理。不采用浮點數是因為單片機的運算速度不适合用浮點數,定點數處理,就是将溫度的内部運算機關放大10倍,在用于顯示的時候再除以10也就是固定顯示一個小數點位置。如果想讓我們的控制做的更好,還可以再提高溫度的内部精度,例如精确到1/100度,這也是現在進階溫控儀采用的精度,但在通常情況下這個精度似乎有點過剩。

PID的三個基本參數 Kp,Ki,Kd,一般由試驗确定,根據我們的實際工作對象去初步确定,然後在實際運作過程中進行調節,以達到相對理想的效果,為了達到比較好的控制效果,這三個參數一般不采用整數,但同時為了減輕單片機的運算量,通常采用2的整倍數放大的辦法确定這些參數,在運算結果中再除以2的整倍數,因為單片機運算中可以用移位來完成,速度比較快,常用的是8倍或16倍放大,注意這三個參數采用相同的放大比例。程式設計的過程中自己從頭到尾要清楚我的參數是經過放大了的,就不會忘記對運算結果還原。

通過怎樣的運算來獲得2-200加溫比例資料呢?很簡單,為了說明這個問題,我們先假定隻考慮最簡單的比例控制算法,假定我們的控制範圍是在200度,則設定溫度與實踐溫度的差的最大值就是200(度),我們就用去他去輸出,這時的參數Kp=1,當我們為了提高加熱速度,而使受控制的區域縮小,例如隻控制50度範圍,如目标溫度設定為230,我們控制的範圍就在180-230範圍内,這時的內插補點不夠200,我們就把計算得到的數字乘以4就得到0-200的資料了,假定目前實測溫度為222,則230-222=8再乘以4算得32,這就作為我們的輸出比例資料。當然我們這裡還沒有考慮超溫的情況,計算産生了負數。這一部分将作為我們控制輸出的基本量,上面的計算是對應于Kp=4DE ,再加入微分和積分項,這時我們的Kp可以基本保持不變。Kp在這裡基本确立了我們的起始控制點到目标值之間的控制範圍,微分和積分項在這裡隻是作為附加部分,基本不影響控制範圍。當溫度突然下降一度時,我們希望補上多少比例區進行下一輪的加熱呢?這就是微分系數:早我經過這麼久的控制,目标溫度還是低了一點,我希望用多少的比例去彌補這個長期欠溫呢?這就是積分常數,我想你已經大概已經确定了這些資料了。一句話,比例常數決定我們參與在目标點以前真正控制的範圍,Kp=基本時間總周期/控制範圍。Ki,Kd是您希望的反應對策速度,看你有沒有耐心去逐漸達到穩定點,過激了會起反作用的,過于膽小怕事是達不到預期目标的。

最後,在計算結果傳遞于輸出之前,還需要進行一些修正,例如當計算結果大于200時按200輸出,計算結果小于零時按零輸出。                               

處理上的一些常用方法

為了提高測溫的 準确性,往往需要進行多次測溫。然後剔除測得結果中的最大值和最小值。把剩餘值的數值相加在計算平均值,這樣比較有利于抗幹擾,或者由于其他原因引起的測量值波動,初期的處理是很必要的。測溫工作和PID計算一般安排在上一個輸出周期的最後階段就提前進行的最後階段就提前進行,測溫次數一般在7-13次,去掉最大最下數以後保留5-11次用于運算,均值運算的累加部分将安排在每一次測溫以後逐漸進行,不會過多占用系統時間。隻有系統的時間允許,盡可能的測多幾次,所得到的結果也會相對精确點。

運算将會占用很長的時間,這是相對于我們的一個基本定時周期來講的,一個系統定時周期内我們的系統還要處理很多事情,例如顯示的重新整理、鍵盤的掃描、鍵盤碼的處理執行等等,如果我們的運算占用很多時間的話那麼就會出現一個系統定時周期内完不成的情況。是以如果您的系統僅僅是一台溫控儀的話,就可以将運算部分放到主程式中進行,而正常的重新整理掃描之類的才放在定時中斷裡處理,這樣編制的主程式就非常清晰明了,這是比較理想的情況。如果溫度控制僅僅作為您的系統中的一部分小插曲,那就需要認真考慮程式的布局了,主程式有更重要的任務要處理,溫度控制運算部分就隻能委托系統定時器來承擔了,時間不夠用怎麼辦?假定我們的定時周期是10ms,顯示重新整理部分要用1ms,鍵盤掃描處理要1ms,PID運算要2ms(假定),留給主程式的時間可能不夠了,我們就 需要對我們的PID運算進行任務的分割,把運算分成幾個部分進行,每一次進入運算程式隻計算其中的一小部分,經過N次的調才完成一個完整的PID運算,這樣就不會影響整個系統的運作了,這裡面需要細細的推敲、分割,這是面對一個較大系統的一般處理方法,對其他任務也可以采用分割的辦法進行細化,例如對顯示重新整理,現在液晶屏用得比較多,環境的幹擾,資料的變化都會引起花屏或反應遲鈍,而重新整理需要占用很長的時間,我們也可以采用分片重新整理的辦法處理,把每次重新整理所占用的時間減到最短。

PID的輸出部分可以放到系統定時中斷裡處理,這部分占用的時間不長,可以随帶完成。

前面我們講到将時間作200等分記作Tset,這就是将一個約定時間200級不同的輸出時間比例,通過我們的計算得到一個介于0-200之間的數Tout,然後每次在我們的PID基本定時時間中對這個Tout減1,當等分計數器Tset也達到零時進行下一輪控制循環,重新計算Tout。這樣我們就完成一個控制比例Tout/200,這個Tout是計算獲得的原始資料。

運算中往往出現資料溢出的情況,是以一般在運算中都要求對資料強制轉換成int型,注意需要考慮符号,另外,對有些參數如積分項的累加數過大時會起反作用,使調節失靈,或者引起大幅震蕩,為此我們對這一項引入一個數值最大界限,當結果超出約定界限時,不再增加(或減少)。加溫的整個過程沒有必要全程PID控制,一般可以在設定目标值前一個溫度區域才進行PID控制,例如,設定目标溫度為300度,則我們可以在250度以前全速加溫,當達到250以後才開始計算PID并予以控制,這樣可以加快加溫速度又不影響溫度控制。在不産生過大的過沖的情況下,盡可能把起控點擡高,有利于後面控制部分的進一步細化。在進入控制之前我們的積分項紀錄資料為零。

對于用調壓法控制輸出時,由于正弦波相對于延時導通的相位角輸出的電壓有效值是非線性的,而且三角函數計算也很費時,是以建議用查表法處理,同樣可以采用查表加插值獲得移向資料,其他的計算方法和用繼電器比例輸出法是一樣的。硬體上還需要做一個比較精确的過零負脈沖電路,讓脈沖發生于過零點以前,這樣我們就可以在過零以前先關閉輸出,脈沖寬度越窄越好,至少這個脈沖寬度不能大于1ms,過零脈沖的識别也需要一點小小的處理,防止假脈沖混入,防止電網幹擾,這是軟體上的問題。

參數的設定與調整

這是PID最困難的部分,程式設計時隻設定他們的大概數值,然後通過反複的調試才能找到相對比較理想的參數值。面向不同的控制對象參數都不同,是以我們無法提供參考數值,但是我們可以根據這些參數在整個PID過程中的作用原理,來讨論我們的對策。

1. 加溫很迅速就達到目标值,但是溫度過沖很大: 

1. 比例系數太大,緻使在未達到設定溫度前加溫比例過高; 

2. 微分系數小,緻使對對象反應不敏感; 

2. 加溫經常達不到目标值,小于目标值的時間較多: 

1. 比例系數過小,加溫比例不夠; 

2. 積分系數過小,對恒偏差補償不足; 

3. 基本上能夠在控制目标上,但上下偏差偏大,經常波動: 

1. 微分系數過小,對及時變化反應不夠快,反映措施不力; 

2. 積分系數過大,使微分反應被淹沒鈍化; 

4. 受工作環境影響較大,在稍有變動時就會引起溫度的波動: 

1. 微分系數過小,對及時變化反應不夠快,不能及時反映; 

2. 設定的基本定時周期過長,不能及時得到修正; 

選擇一個合适的時間常數很重要,要根據我們的輸出機關采用什麼器件來确定,如果是采用可控矽的,則可設定時間常數的範圍就很自由,如果采用繼電器的則過于頻繁的開關會影響繼電器的使用壽命,是以就不太适合采用較短周期。一般的周期設定範圍為1-10分鐘較為合适。

為了調試友善,起碼在調試階段您必須編制一個可以對參數進行随時修改和記憶的接口,否則你會很辛苦,老是在現場與辦公室之間來回跑。

關于自整定問題:

下一篇: ulimit -a