PID Control(Proportional Integrative Derivative),屬於系統控制的領域,這方法可消弭一些外界變異或干擾影響,讓系統控制可預測,參數設定得好,就可以又快又穩又準。(引自:http://4rdp.blogspot.com/2008/05/pid-speed-control.html)

PID是以它的三種糾正演算法而命名的。這三種演算法都是用加法調整被控制的數值。而實際上這些加法運算大部分變成了減法運算因為被加數總是負值。這三種演算法是:
1. 比例- 來控制當前,誤差值和一個負常數P(表示比例)相乘,然後和預定的值相加。P只是在控制器的輸出和系統的誤差成比例的時候成立。比如說,一個電熱器的控制器的比例尺範圍是10°C,它的預定值是20°C。那麼它在10°C的時候會輸出100%,在15°C的時候會輸出50%,在19°C的時候輸出10%,注意在誤差是0的時候,控制器的輸出也是0。

2. 積分 - 來控制過去,誤差值是過去一段時間的誤差和,然後乘以一個負常數I,然後和預定值相加。I從過去的平均誤差值來找到系統的輸出結果和預定值的平均誤差。一個簡單的比例系統會振蕩,會在預定值的附近來回變化,因為系統無法消除多餘的糾正。通過加上一個負的平均誤差比例值,平均的系統誤差值就會總是減少。所以,最終這個PID迴路系統會在預定值定下來。

3. 導數 - 來控制將來,計算誤差的一階導,並和一個負常數D相乘,最後和預定值相加。這個導數的控制會對系統的改變作出反應。導數的結果越大,那麼控制系統就對輸出結果作出更快速的反應。這個D參數也是PID被稱為可預測的控制器的原因。D參數對減少控制器短期的改變很有幫助。一些實際中的速度緩慢的系統可以不需要D參數。

(引自:維基百科)

以下為PID一般方程式,適用於任何可控制回授系統,
E(t) = R(t) – Y(t)
// R(t) is a set point to reach
// Y(t) is a measuring value
// E(t) is error
P(t) = E(t) // P(t) is Proportional function
I(t) = I(t-1) + E(t) // I(t) is Integrative function
D(t) = E(t) – E(t-1) // D(t) is Derivative function


U(t) = Kp*P(t) + Ki*I(t) + Kd*D(t)
// U(t) is control vaule
// Kp,Ki,Kd are the Proportional Integrative Derivative gains


以下以樂高NXT 馬達為控制範例(引自:http://4rdp.blogspot.com/2008/05/pid-speed-control.html),下列兩式為 NXT 馬達特有方程式。
Power = U(t) / 8 => Power為真實輸出的命令
Y(t) = U(t-2)


U(t) 為系統估算出的轉速,依據實驗數據所知,Power = 100 時,全速轉速約為 800° / second,因此 Power = U(t) / 8。
而 Y(t) = U(t-2),是因為 NXT馬達轉速回應有一秒延遲的現象 (1 second deadtime)。


系統需求為:目標速度R(t) = 500
在此設定Kp = 0.4, Ki = 0.4, Kd = 0

  目前速度 速度誤差 P 係數 I 係數 D 係數    
  Y(t) = E(t) = Error P(t) = I(t) = D(t) = U(t) = Power =
  U(t-2) R(t) - Y(t) E(t) I(t-1) + E(t) E(t) - E(t-1) Kp*P(t) + Ki*I(t) + Kd*D(t) U(t) / 8
Step Measuring Speed            
               
0 0 500 500 500 500 400 50
1 0 500 500 1000 0 600 75
2 400 100 100 1100 -400 480 60
3 600 -100 -100 1000 -200 360 45
4 480 20 20 1020 120 416 52
5 360 140 140 1160 120 520 65
6 416 84 84 1244 -56 531.2 66
7 520 -20 -20 1224 -104 481.6 60
8 531.2 -31.2 -31.2 1192.8 -11.2 464.64 58
9 481.6 18.4 18.4 1211.2 49.6 491.84 61
10 464.64 35.36 35.36 1246.56 16.96 512.77 64
11 491.84 8.16 8.16 1254.72 -27.2 505.15 63
12 512.77 -12.77 -12.77 1241.95 -20.93 491.67 61
13 505.15 -5.15 -5.15 1236.8 7.62 492.66 62
14 491.67 8.33 8.33 1245.13 13.48 501.38 63
15 492.66 7.34 7.34 1252.47 -0.99 503.92 63
16 501.38 -1.38 -1.38 1251.09 -8.72 499.88 62
17 503.92 -3.92 -3.92 1247.16 -2.54 497.3 62
18 499.88 0.12 0.12 1247.28 4.04 498.96 62
19 497.3 2.7 2.7 1249.99 2.59 501.08 63
20 498.96 1.04 1.04 1251.03 -1.66 500.83 63
21 501.08 -1.08 -1.08 1249.95 -2.12 499.55 62
22 500.83 -0.83 -0.83 1249.12 0.25 499.32 62
23 499.55 0.45 0.45 1249.57 1.28 500.01 63
24 499.32 0.68 0.68 1250.25 0.23 500.37 63
25 500.01 -0.01 -0.01 1250.25 -0.69 500.09 63
26 500.37 -0.37 -0.37 1249.87 -0.36 499.8 62
27 500.09 -0.09 -0.09 1249.78 0.28 499.87 62
28 499.8 0.2 0.2 1249.98 0.3 500.07 63
29 499.87 0.13 0.13 1250.11 -0.07 500.09 63
30 500.07 -0.07 -0.07 1250.03 -0.2 499.98 62
31 500.09 -0.09 -0.09 1249.94 -0.02 499.94 62
32 499.98 0.02 0.02 1249.96 0.11 499.99 62
33 499.94 0.06 0.06 1250.02 0.05 500.03 63
34 499.99 0.01 0.01 1250.03 -0.05 500.02 63
35 500.03 -0.03 -0.03 1250 -0.04 499.99 62
36 500.02 -0.02 -0.02 1249.98 0.02 499.99 62
37 499.99 0.01 0.01 1249.99 0.03 500 63
38 499.99 0.01 0.01 1250.01 0 500.01 63
39 500 0 0 1250.01 -0.02 500 63
40 500.01 -0.01 -0.01 1250 -0.01 499.99 62
41 500 0 0 1250 0.01 500 62
42 499.99 0.01 0.01 1250 0.01 500 63
43 500 0 0 1250 0 500 63
44 500 0 0 1250 0 500 62
45 500 0 0 1250 0 500 62
46 500 0 0 1250 0 500 62
47 500 0 0 1250 0 500 63
48 500 0 0 1250 0 500 63
49 500 0 0 1250 0 500 62
50 500 0 0 1250 0 500 62
51 500 0 0 1250 0 500 63
52 500 0 0 1250 0 500 63
53 500 0 0 1250 0 500 62
54 500 0 0 1250 0 500 62
55 500 0 0 1250 0 500 62
56 500 0 0 1250 0 500 63
57 500 0 0 1250 0 500 63
58 500 0 0 1250 0 500 62
59 500 0 0 1250 0 500 62


由上例可知馬達約在Step 50時進入轉速穩定。
通常使用 0 <= K <= 2。 由於NXT 馬達反應速度並不快,因此 Kd = 0 就可以了。本例的 K值很大,是因為 NXC 無法使用小數,所以 K = 40,代表 K = 40 / 100 = 0.4。
創作者介紹

Mamason Blog

Mamason 發表在 痞客邦 PIXNET 留言(0) 人氣()