2013年11月23日 星期六

PID Control 精彩討論 (1)

http://4rdp.blogspot.com/2013/11/pid-control-1.html?m=0

車輛中心工作的鄭守益先生為了 AC 交流馬達控制,最近閱覽研發養成所部落格文章並與我討論 PID 控制,內容相當深入,今天節錄要點與大家分享,Q 為鄭先生的發問,A 為我的回覆。

Q1:
你好,我有看"Apply PID to control speed and angle"文章,對於內文的敘述內容有些了解,想要先麻煩你幫我確認一下我的理解。


1. 速度控制 : 使速度誤差E(t)為零,也就是實際轉速等於目標轉速,而U(t)的值是由Ki*I(t)去維持(累積)其實際轉速,所以U(t)I(t)與Power都不為零(無負載變動時為定值)。速度迴授是看Ki*I(t)。
2. 位置控制 : 使位置誤差E(t)為零,也就是實際位置等於目標位置,而U(t)則是由I(t)去做遞迴疊代 (0<ki<1) 使其為零,所以 U(t)、I(t)與Power都為零(系統靜止到目標位置)。位置迴授是看I(t)


如果我理解的是對的,我有個疑問就是你在2010/4/6第二個回覆,我有試著去用紙筆去作計算,發覺整個U(t)到後面會事發散的,應該是Kp=1造成的,不知道我的分析對的嗎?
以上,再麻煩你了。

A1:
關於數值發散,是不會發生的,
二、你所提的位置控制,並未指明角度還是速度,我猜想應該是指角度,
基本上 Ki 越小 I(t)收斂越快,達到定位時間越久,先假設角度誤差 10 度,
Kp = 1,Kd = 0,試比較 Ki1 = 0.5 和 Ki2 = 0.1 差異,
Ki1 = 0.5, E(0) = 10, I(0) = 0.5*(10) = 5, D(0) = 0, U(0) = 10 + 5 = 15
Ki2 = 0.1, E(0) = 10, I(0) = 0.1*(10) = 1, D(0) = 0, U(0) = 10 + 1 = 11


雖然 U(0) > 10,看似比 設定角 10 度大,這裡討論使用 NXT 馬達,power = U(t) / 8,
因此馬達出力設定 <= 2,不會有發散問題。


Q2:
你好,我還有一個疑問就是速度迴授的誤差E(t)=R(t)-Y(t)而Y(t)=U(t-2),
當E(t)=0時R(t)=U(t-2)這我懂,但是在位置迴授的時候因為E(t)=0且U(t-2)要為0
("因I(t)要為0"),這樣就會強迫R(t)也要為0,但R(t)一般都會是非0的數值嗎(例"角度10度"),這邊我比較想不通,可以幫我解釋(答)我的問題,感謝你!

A2:
角度 PID,
E(t)=R(t)-Y(t)
I(t)=Ki*(I(t-1)+E(t))
D(t)=E(t)-E(t-1)
U=Kp*E(t)+I(t)+Kd*D(t)

當 U = 0,E(t) = 0,不代表 R(t) = 0,只要 R(t) = Y(t),就可以 E(t) = 0


Q3:
以你範例的疊代(我之前有嘗試了解),當Ki1=0.5,
E(1)=10,I(1)=0.5*(10+5)=7.5,D(0)=0,U(1)=10+7.5=17.5,Power=2。
E(2)=R-U(0)=10-15=-5,I(2)=0.5*(7.5-5)=1.25,U(2)=-5+1.25=-3.75,Power=0。

我用這方法一值疊代,U的值並不會收歛而是發散,我猜是我疊代的方式(法)錯誤,
我猜應該是U跟Y的關係式的問題?是否可提醒告知呢?

我有將位置控制弄成Execl(如附檔),再麻煩你幫我確認,感謝你!

A3:
你寄來的試算表,已經收到內容大致無誤,不過我還是根據你回饋的問題,
確認有數值發散的情形,因此在角度控制部分追加了測量時間間隔 (d),理由如下:

速度控制那一頁每秒鐘檢查轉速一次是OK的,但是角度控制每秒檢查一次就不太好,
NXT 馬達電力 100% 轉速約 800 degree/sec,也就是說供給 1% 電力,
馬達可以每秒轉 8 度,因此每秒調整角度一次容易過衝難以定位,
以本例來說最佳時間間隔為 125 ms,如果改採較小時間間隔控制,那 Kp = 1 也OK。

另外請注意,如果時間間隔不是 125 ms 的倍數,那可能會有角度偏差情形,
參考我的試算表 (請求閱覽權限需付費)。 

很高興透過討論的方式將真理找出來,若沒有你鍥而不捨追查,這個問題還不會被發現,
謝謝。


Q4:
你好,因為看你給我的關係式(敘述)
雖然 U(0) > 10,看似比 設定角 10 度大,這裡討論使用 NXT 馬達,power = U(t) / 8,
因此馬達出力設定 <= 2,不會有發散問題。

你是將Power設定<=2,目的是將功率設定在一定範圍。
根據U(t)=Kp*E(t)+I(t)+Kd*D(t)跟P=U/M(M=8,轉速與功率因子)來看,
你去限制U的大小(等比例縮小或限制極限值)也會相對的影響Kp、Ki與Kd的值(等比例縮小),其主要目的也可以看來是在調小PID參數值,所以我在位置控制(如Execl)的P跟U的參數
選2(真實值還依系統特性決定,這裡思考為低轉速馬達)去降低Kp的值
(你Kp=1時,我的只剩0.25),也就是你回覆的將取樣時間縮小有異曲同工之處
(你以取樣次數減少單位時間移動距離,我以降低馬達輸出功率減少移動距離),
主要都是將解析度變高。讓馬達在單位時間內移動的距離變小(少),
PID才有辦法收斂(補償)。

A4:
你已經能夠清楚解釋各參數調整關係,我想未來遭遇任何難題,你有足夠的知識可以解決,不然用試算表模擬也可以找出解決方案。


Q5:
還有問題就是一般你們都是怎樣去調整PID(Kp、Ki、Kd)的參數值,
還是看系統要的響應(規格)需求?是否有類似的文章可以研讀?再麻煩你了!

A5:
使用 PID 是為了直流電源供應快速穩定達到輸出設定,類似馬達定速控制,
相關經驗都是做中學的,可惜沒有相關文件參考,
以我的案例,都是從 Kp = Ki = 1,Kd = 0 開始調起。
首先要確認取樣時間,馬達可控轉速範圍、供給電壓範圍、解析度及精確度要求,
考量滿載時保留餘裕 (滿載 + 最大出力可得全速運轉),有無要求滿載/半載變化時,
或是啟動時,需多快時間達到穩定,overshoot 允許範圍多少,這些項目都是要考量的

使用 PID 最大的好處,無須清楚知道整體控制系統的數學模型,但是它可以經由迴授控制,無論負載多寡,都可以穩定平滑控制。


Q6:
就這禮拜來對於PID有以下心得(不確定觀念是否正確)。
速度控制(PI) : 透過積分項維持功率輸出,取樣時間越長(1 s> 50 ms)時
則誤差(+/-)範圍越小,但缺點是系統響應速度慢(1 s一次,50 ms時可以20次)。
目標值與實際值則是絕對於0去讓目標值跟實際值相等。一開始需考慮系統的P=U/M
解晰度(1轉幾個pluse)取樣時間與精準度(穩態誤差),PID參數調整則是看暫態響應
(上升下降時間/overshoot)去作決定。

位置控制(PI) : 透過積分項去減少(縮短)與目標值的差距(誤差),取樣時間越短
(需考慮系統整體運算效能)時系統回授(補償)的越即時(減少移動距離)
或將Power變小(運轉慢=移動慢)也可達到相同效果。目標值與實際值則是相對的,
當目標值等於實際值時相對值為0(誤差為0)。使單位時間內移動距離小
(調整取樣時間或縮小Power)對於位置控制是很重要。

速度控制時Power常因電感性負載
(如馬達線圈或電感)造會延後輸出響應(電感性視為低通濾波會有相位延遲),
你那邊是否有此解決經驗或對策?或是依你Speed control文章內談的,
你是將取樣時間設定為1s來克服此延遲現象?再麻煩你了。

A6:
PI 速度控制,取樣時間長短是根據系統步級響應來決定,取樣時間過短 (已經設定輸出,
但馬達還沒達到穩定速度),會讓積分項目過度累積誤差造成過衝。
取樣時間至少 > 空載系統步級響應,步級響應簡單的說就是,定值輸出後,
系統需要多少時間才能穩定。

因此速度控制採用一秒取樣一次,只是確保達到步級響應的需求,也比較穩定避免過衝,
因此誤差比較小。如果你的系統步級響應可以 50 ms 一次,
並且也有 50 ~ 100 ms 調速的需求,那選擇 50 ms 取樣時間是必須的,
否則每秒調一次就夠了。其餘你的說明是正確的。

位置控制(PI) : 透過比例項及積分項去減少(縮短)與目標值的差距(誤差),
重點在位置解析度及電源控制的解析度,調整取樣時間主要是取得前兩項解析度的
最大公因數。也就是用最小可控電力,讓馬達轉一格位置所需的最短時間。


接續精彩討論 (2) ...

8 則留言:

  1. PID控制,的確對於受控體(plant)數學模型不是很明確的情況下,非常好用。但每 一個受控體因複雜度不同而PID參數使用不一致,所以考驗著操作者的智慧。最佳化控制,說起來是很綺麗的名詞,其實也是有點精益求精、吹毛求疵的境界,好還要更好。這就是人追求完美的階段不可停止的行動力。目前我這個笨笨的頭腦還記得的大概只剩下Simplex法、牛頓法這些計算local minimum performance 方法。

    回覆刪除
    回覆
    1. 薛老師客氣了,

      你所提的數值方法,很多在學時期我不懂,是直到實際使用才會的。科技將會永無止境的進步,我們的任務之ㄧ就是把這些知識傳承給繼承工程師,發揮智能創造更好的商品服務大眾。

      刪除
  2. 請問 我po 的文 是不是 被吃掉了 ?

    回覆刪除
    回覆
    1. 蠻奇怪,文章確實不見,我先幫你貼文,隨後再補上說明

      老師 您好 !! 想像您請教一些問題
      我看了您提供的PID的試算表 有看懂並瞭解很多 真的非常謝謝您
      但有一點不太瞭解 想在請在您一下我這樣的說法是否正確 !! 不知我有沒有會錯意
      就是 我從試算表中看出 Y(t) = U(t-2)
      但以NXT機器人來說 我算出 我的
      U(t) = Kp*P(t)+ki*I(t)=kd*D(t) 後 ,
      除以 8 做為我的 power 就輸入給我的馬達
      那因為 不會一輸出 就馬上讓馬達 達到我要的速度 所以 真正當下的速度 才是 U(t-2) 不知道我這樣 是否正確 ?

      另外想請教幾個問題
      問題一 : 試算表中的 指定速度為500
      跟NXT 有關嗎 ? 還是只是因為說明 所以用
      500 ?

      問題二 : 從維基百科中看到說積分項是通過
      加一個負的平均誤差比例值,平均系統的誤差就會減少以達到穩定不知道這句話的含意是什麼? 因從試算表中清楚看到
      I(t)=I(t-1)+E(t) 好像沒什麼平均問題或是負的問題,所以我程式中我照試算表中的方式去做是可以的嗎? 之前誤差的累加在加上這次誤差就好 ?

      問題三 : 書中讀到積分項都有什麼時間的問題,例如什麼誤差對時間的積分,那之前讀到的文章說NXT PID 取樣時間設一秒
      是指說 我在程式的一個迴圈中 設定時間為1秒就可以 還是需要 做一些積分 才可以使用 ?

      刪除
    2. 同學你好,

      是的,你的理解是對的,多數系統都有延遲問題,也就是檢知速度快於系統反應速度,除非你的系統,一輸出就可以達到設定狀況,才沒有延遲問題,或是故意調慢檢測週期,以這裡為例,改成兩秒為一週期,每週期第零秒時設定,第一秒內的馬達轉速不計算,轉速從第一秒數到第二秒,這樣也可以消除延遲。

      指定轉速500度/秒只是舉例,可以依你的需求調整,只是不能超過系統的極限,假如NXT馬達,空載最高轉數800度/秒,滿載600度/秒,那應用上應在600度/秒內。

      上午有事,先回答到此。

      刪除
    3. 關於問題二,說真的,維基百科的說明,我開始也看不懂,不知是從哪裡抄來的翻譯。不過可以確定誤差的積分式就是 I(t)=I(t-1)+E(t) ,至於第二句「I從過去的平均誤差值來找到系統的輸出結果和預定值的平均誤差」,這是在說明 Ki ,在轉速控制已經穩定平衡時,U(t) = Ki*I(t),無誤差 P(t) = D(t) = 0,Ki = U(t)/I(t)。只能說中文維基百科的說明,令人不知其意,當比對英文維基百科說明,http://en.wikipedia.org/wiki/PID_controller,才明瞭它指的平均的意義,參見 Ideal versus standard PID form ,有另一種 PID 表示式, Ki = Kp / Ti。

      關於問題三,先看誤差對時間積分的意義,以馬達轉速控制為例,你設定要每秒500度,但是馬達只轉了300度,是不是還差了200度,假設下一秒又落後100度,積分項就是累計這些誤差,希望PID控制把誤差累積維持住,就算不能追回,但也不要再繼續擴大。至於積分要如何積,當然與取樣時間有關聯,如果你將程式改為0.1秒取樣一次,那積分就是每0.1秒誤差加總。

      關於馬達轉速偵測,再仔細參考前文的程式碼,NXT馬達無法直接告訴你當時轉速,必須透過間接計算方法得知:先記下當時馬達旋轉位置X0 (MotorRotationCount) ,經過一秒後,再比較新的馬達旋轉位置到何處,speed = X1 - X0,這就是每秒轉速。

      刪除
    4. 恩恩 謝謝您 我瞭解了 !! 謝謝你唷

      刪除
    5. 不客氣,歡迎常來瀏覽文章。

      刪除