2013年11月30日 星期六

PID Control 精彩討論 (2) ─ 微分項與負載

http://4rdp.blogspot.com/2013/11/pid-control-2.html

Kp = 1, Ki = 1, Kd = 1, T = 3
續前文,與車輛中心的鄭守益先生討論第二個重要議題 ─ 如何使用微分項以及負載對控制的影響,Q 為鄭先生的發問,A 為我的回覆,

Q1:
想請教一般會用Kd(PD或PID)的場合(條件)在哪?

A1:
P 控制或 PD 控制因為缺積分項有偏差問題,速度控制確定是不適用,但可用於位置控制。PID 一般是用來解決負載變動問題,
例如無 PID 控制,空載時馬達可以一秒鐘內由靜止達到 100 rpm,
但是加載後須兩秒才能到達 100 rpm,這需要試算表才能清楚解析,當作你的 HOMEWORK,以  Kp = Ki = Kd = 1 比較不同負載狀況,分析它們的轉速變化。


Q2:
你給我的 homework是否可以在敘述詳細一點,因為我把 Kp=Ki=Kp=1 直接帶入速度回授的時候他波形是發散的,再麻煩你了,感謝你。

A2:
是的,加入Kd 後很容易發散,因此需要適度調整,我修改你的 EXCEL 表,請比較下列數值:
1. T=1, Kp=1, Ki=1, Kd=1
2. T=10, Kp=1, Ki=1, Kd=1
3. T=10, Kp=1, Ki=1, Kd=2
4. T=10, Kp=1, Ki=1, Kd=0
5. T=1, Kp=0.4, Ki=0.4, Kd=0
6. T=10, Kp=0.4, Ki=0.4, Kd=0
7. T=10, Kp=1, Ki=1, Kd= -1
或其它你想實驗的數值,把你的心得告訴我,再來討論。透過研討,可將知識更加淬鍊,
因為有些東西以前並未更一步深思,像現在討論的 Kd,多數控制都是令 Kd = 0。


Q3:
你好,我有一個問題想要先問一下,你把 Power = U(t)/8/的目的是要將輸出的功率變小,來避免控制發散與製造負載嗎?如果是的話,以我的思考角度來看,我會以等比例的將PID參數(Kp,Ki,Kd)縮小,因負載變大也可思考為參數效果變小,這樣會有一樣的效果的。
例如:
T=10, Kp=1, Ki=1, Kd=1
我會直接將改PID參數
T=1,Kp=0.1, Ki=0.1, Kd=0.1

以下我針對7個項目作說明。
1. T=1, Kp=1, Ki=1, Kd=1 : 因PID參數值過大造成系統補償過頭(無法補償)而發散。
2. T=10, Kp=1, Ki=1, Kd=1 : 負載進入系統後可抑制(輸出響應變慢)PID參數,使系統慢慢達到設定目標。
3. T=10, Kp=1, Ki=1, Kd=2 : 增加D(t)的補償量,但會出現第一個震盪點(Step 4)。要怎樣消除此現象?(週期出現,但後續因I(t)變大而使D(t)影響變小)
4. T=10, Kp=1, Ki=1, Kd=0 : 靠I(t)將系統穩態誤差縮小(達到目標)。
5. T=1, Kp=0.4, Ki=0.4, Kd=0 : 負載移除並縮小PI參數,避免補償過大造成系統發散。
6. T=10, Kp=0.4, Ki=0.4, Kd=0 : 增加負載時系統更緩慢(因PI參數值小)到達目標值。
7. T=10, Kp=1, Ki=1, Kd= -1 : Kd為負值時可抑制Kp與Ki得效果,但Kd最小不可為負的Kp+Ki(例:Kp=1,Ki=1,Kd=-2),否則系統一開始會有U(t)為負數值得風險。

結論:
        當系統負載進入系統後會使響應變慢(出力變小,緩慢到達目標值)。增加Kp值可使得U(t)的初始(前幾個Step)補償值增加,後續因誤差值E(t)變小使P(t)對於U(t)貢獻度變小。增加Ki可以系統快速累積I(t)而達到R(t),但Ki如果過大時會造成系統Overshoot。增加Kd可使得U(t)的初始(前幾個Step)補償值減少(抑制正速度變化),誤差變化率(加速度)越小則代表越接近R(t),D(t)對U(t)的影響也就越小。

        Kp與Kd都是屬於暫態響應的變數,只在系統一開始(前幾個Step)會有影響,後續則因為I(t)的累加使數值變大而由Ki的參數去主導U(t)的趨勢,所以Ki屬於穩態變數。一般的設計用PI設計就夠了。如有考慮速度變化時才需使用Kd。當負載進入時是可以使原本會發散的系統變成穩定。

A3:
你的觀察與結論都非常正確,等比例修改 PID 參數是等效於修改負載係數 T,
不過個人還是喜歡使用負載係數 T,因為
T=10, Kp=1, Ki=1, Kd=1,可以直接從 T 係數看到負載加重,而
T=1,Kp=0.1, Ki=0.1, Kd=0.1,比較難看出,
而且使用 T 係數,原來 PID 參數大小意義不變,容易跟以前參數值比較

因為 U(t) = Kp*P(t) + Ki*I(t) + Kd*D(t),增加 Kd 項,U 整體數值變大,
但是 NXT 馬達的電壓可控範圍 -100 ~ +100 (負值表示反轉),因此修正成
Power = U / 8 / T [1 + (T-1)/15]
除 T 表示加載會產生降速效應,以 T=1 空載 T=10 滿載,
紅字部分是今天追加的,表示空載想達到轉數 500 degree/sec,電力只需供給 62%
但是加載想達到相同轉數 500 degree/sec,電力需供給超過 62%
注意這只是我對 NXT 馬達數學模型的假設,不敢說完全正確,但也不會差太多

T=10, Kp=1, Ki=1, Kd=2,震盪點是消不掉的,Kd 是用來抑制控制初期的變動,
就如你的結論所言,當系統達趨於穩定,它的效應也跟著減少,
因此調 Kd 是看系統負載變化時,想抑制速度控制的變動多少,值越大壓抑也越大,
震盪也因此產生,所以多數人只使用 PI 控制。


Q4:
你好,對於Power = U / 8 / T [1 + (T-1)/15] 這個運算式紅色地方的由來是?

A4:
紅色部分是我概略推算所導出的線性修正出力係數,假設要控制 500 degree/sec
T=1, Kp=Ki=0.4, Kd=0, 穩定時 U 大約為 500, 
power = U / 8 / T * [1 + (T-1)/15] = U / 8 / 1 * 1 = U / 8 與原公式相同
T=10, Kp=Ki=Kd=1, 穩定時 U 大約為 5000 ~= 500 * T, 
power = U / 8 / T * [1 + (T-1)/15] = U / 8 / 10 * 1.6 = 5000 / 80 * 1.6 = 100
簡單的說,滿載想達到轉速 500 degree/sec,需要供給 100% 電力


Q5:
你好,關於紅色部分的推導我了解了,你是以500 degree/sec做系統最高轉速的設定而得到"15"這個數值,但如果將系統最高轉速改成600 degree/sec時則必需要將值更改為"27",否則Power將會超過100%。
Power = 100 = 6000 / 80 * [1 + (10-1)/X] 

X~=27。
將系統最高轉速設定低一點(Power相對低)來保留一些裕度來作負載時補償嗎?

A5:
是的,想提高轉速,需要保留多一些餘裕空間,通常系統硬體已經限制它的範圍,你只要測試滿載 100% 電力,穩定轉數在哪裡,那就是系統極限所在。


Q6:
這有另一個問題想要請教,要怎樣決定空載與全載時的PID參數?如以空載的PID參數去設定時遇到全載時系統穩定時間就會拖長。但以全載的PID參數設計,當空載時系統卻有可能補償不回來造成發散。這中間的取捨是?麻煩你了。

A6:
你也觀察到不同負載最好是搭配不同的 PID 參數,如果被限制只能用一組參數時,
我建議用半載情形來調參數,或是空載及滿載參數取平均值
不然你就要研究一套方法識別負載大小,自動修正 PID 參數,
目前我的應用 Kp=0, Ki=1, Kd=0,定值不調整。


Q7:
你會使用 Kp=0, Ki=1, Kd=0定值不調整的原因是?是以系統較大負載(負載輕震盪大/負載大補償快)的情況下做的取捨?

A7:
採用 Kp=0 , Ki=1, Kd=0, 定值不調整,主要是我的系統這樣設定時仍是穩定的,曲線和 NXT 馬達的 T=4, Kp=0, Ki=1, Kd=0, 很像,因為硬體速度很快,約一個週期就可到達設定速度。
想一步到位的關鍵在校驗,這樣程式就可以知道空載時設定多少電壓,就可以得到多少轉速。


Q8:
你將Kp=Kd=0,Ki=1是可以忽略掉系統的暫態響應,直接透過I(t)的好處去使系統達到目標值,唯一的缺點是當T小的時候系統會有Overshoot問題,但T變大時其到達穩態時間都是差不多的,但一般不是都會搭配Kp作PI控器嗎?你指的"約一個週期就可到達設定速度"的週期是多久?

A8:
這裡的一個週期是指檢知週期 (我的系統 110ms),因為我的硬體系統設計良好動作很快,設定好輸出,經過一個週期檢知回授,已經達到設定值約 99.99%。


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

沒有留言:

張貼留言