PID 控制器

PID 控制器（比例 - 積分 - 微分控制器），由比例單元（Proportional）、積分單元（Integral）和微分單元（Derivative）組成。可以透過調整這三個單元的增益，和來調定其特性。PID 控制器主要適用於基本上線性，且動態特性不隨時間變化的系統。

PID 控制器是一個在工業控制應用中常見的回授迴路部件。這個控制器把收集到的資料和一個參考值進行比較，然後把這個差別用於計算新的輸入值，這個新的輸入值的目的是可以讓系統的資料達到或者保持在參考值。PID 控制器可以根據歷史資料和差別的出現率來調整輸入值，使系統更加準確而穩定。

PID 控制器的比例單元（P）、積分單元（I）和微分單元（D）分別對應目前誤差、過去累計誤差及未來誤差。若是不知道受控系統的特性，一般認為 PID 控制器是最適用的控制器。藉由調整 PID 控制器的三個引數，可以調整控制系統，設法滿足設計需求。控制器的響應可以用控制器對誤差的反應快慢、控制器過衝的程度及系統震盪的程度來表示。不過使用 PID 控制器不一定保證可達到系統的最佳控制，也不保證系統穩定性。

有些應用只需要 PID 控制器的部份單元，可以將不需要單元的引數設為零即可。因此 PID 控制器可以變成 PI 控制器、PD 控制器、P 控制器或 I 控制器。其中又以 PI 控制器比較常用，因為 D 控制器對回授雜訊十分敏感，而若沒有 I 控制器的話，系統不會回到參考值，會存在一個誤差量。

反饋迴路基礎

PID 迴路是要自動實現一個操作人員用量具和控制旋鈕進行的工作，這個操作人員會用量具測系統輸出的結果，然後用控制旋鈕來調整這個系統的輸入，直到系統的輸出在量具上顯示穩定的需求的結果，在舊的控制文件裡，這個過程叫做 “復位” 行為，量具被稱為 “測量”，需要的結果被稱為 “設定值” 而設定值和測量之間的差別被稱為 “誤差”。

一個控制迴路包括三個部分：

系統的感測器得到的測量結果
控制器作出決定
透過一個輸出裝置來作出反應

控制器從感測器得到測量結果，然後用需求結果減去測量結果來得到誤差。然後用誤差來計算出一個對系統的糾正值來作為輸入結果，這樣系統就可以從它的輸出結果中消除誤差。

在一個 PID 迴路中，這個糾正值有三種演算法，消除目前的誤差，平均過去的誤差，和透過誤差的改變來預測將來的誤差。

比如說，假如利用水箱在為植物提供水，水箱的水需要保持在一定的高度。可以用感測器來檢查水箱裡水的高度，這樣就得到了測量結果。控制器會有一個固定的使用者輸入值來表示水箱需要的水面高度，假設這個值是保持 65％的水量。控制器的輸出裝置會連在由馬達控制的水閥門上。開啟閥門就會給水箱注水，關上閥門就會讓水箱裡的水量下降。這個閥門的控制訊號就是控制變數。

PID 控制器可以用來控制任何可被測量及可被控制變數。比如，它可以用來控制溫度、壓強、流量、化學成分、速度等等。汽車上的巡航定速功能就是一個例子。

一些控制系統把數個 PID 控制器串聯起來，或是連成網路。這樣的話，一個主控制器可能會為其他控制輸出結果。一個常見的例子是馬達的控制。控制系統會需要馬達有一個受控的速度，最後停在一個確定的位置。可由一個子控制器用來管理速度，但是這個子控制器的速度是由控制馬達位置的主控制器來管理的。

連合和串聯控制在化學過程控制系統中相當常見。

歷史及應用

PID 控制器可以追溯到 1890 年代的設計。PID 控制器是在船舶自動作業系統中漸漸發展。1911 年開發的控制器是最早期 PID 型控制器的其中之一，而第一個發表 PID 控制器理論分析論文的是俄裔美國工程師。米諾爾斯基當時在設計美國海軍的自動作業系統，他的設計是基於對舵手的觀察，控制船舶不只是依目前的誤差，也考慮過去的誤差以及誤差的變化趨勢，後來米諾爾斯基也用數學的方式加以推導。他的目的是在於穩定性，而不是泛用的控制，因此大幅的簡化了問題。比例控制可以在小的擾動下有穩定性，但無法消除穩態誤差，因此加入了積分項，後來也加入了微分項。

當時在新墨西哥號戰艦上進行測試，利用控制器控制舵的角速度，利用 PI 控制器可以角度誤差維持在 ±2° 以內，若加上 D 控制，角度誤差維持在 ±1/6°，比最好的舵手還要好。

不過因為海軍人員的抗拒，海軍那時候未使用這套系統，在 1930 年代也有其他人作出類似的研究。

在自動控制發展的早期，用機械裝置來實現 PID 控制，是由槓桿、彈簧、阻尼及質量組成，多半會用壓縮氣體驅動。氣動控制器還一度是工業上的標準。

電子的類比控制器可以用電晶體、真空管、電容器及電阻器組成。許多複雜的電子系統中常會包括 PID 控制，例如磁碟的讀寫頭定位、電源供應器的電源條件、甚至是現代地震儀的運動偵測線路。現代電子控制器已大幅的被這些利用單晶片或 FPGA 來實現的數位控制器所取代。

現代工業使用的 PID 控制器多半會用 PLC 或有安裝面板的數位控制器來實現。軟體實現的好處是相對低廉，配合 PID 實現方式調整的靈敏度很大。在工業鍋爐、塑膠射出機械、燙金機及包裝行業中都會用到 PID 控制。

變化的電壓輸出可以用 PWM 來實現，也就是固定週期，依要輸出的量去調整週期中輸出高電位的時間。對於數位系統，其時間比例有可能是離散的，例如週期是二秒，高電位時間設定單位為 0.1 秒，表示可以分為 20 格，精度 5%，因此存在一量化誤差，但只要時間解析度夠高，就會有不錯的效果。

理論

PID 是以它的三種糾正演算法而命名。受控變數是三種演算法（比例、積分、微分）相加後的結果，即為其輸出，其輸入為誤差值（設定值減去測量值後的結果）或是由誤差值衍生的訊號。若定義為控制輸出，PID 演演算法可以用下式表示：

其中

 ：比例增益，是調適引數

 ：積分增益，也是調適引數

 ：微分增益，也是調適引數

 ：誤差 = 設定值（SP）- 回授值（PV）

 ：目前時間

 ：積分變數，數值從 0 到目前時間

用更專業的話來講，PID 控制器可以視為是頻域系統的濾波器。在計算控制器最終是否會達到穩定結果時，此性質很有用。如果數值挑選不當，控制系統的輸入值會反覆振盪，這導致系統可能永遠無法達到預設值。

PID 控制器的一般轉移函式是：

,

其中 C 是一個取決於系統頻寬的常數。

3.1 比例控制項

比例控制考慮當前誤差，誤差值和一個正值的常數 Kp（表示比例）相乘。Kp 只是在控制器的輸出和系統的誤差成比例的時候成立。比如說，一個電熱器控制器是在目標溫度和實際溫度差 10°C 時有 100% 的輸出，而其目標值是 25°C。那麼它在 15°C 的時候會輸出 100%，在 20°C 的時候會輸出 50%，在 24°C 的時候輸出 10％，注意在誤差是 0 的時候，控制器的輸出也是 0。

比例控制的輸出如下：

若比例增益大，在相同誤差量下，會有較大的輸出，但若比例增益太大，會使系統不穩定。相反的，若比例增益小，若在相同誤差量下，其輸出較小，因此控制器會較不敏感的。若比例增益太小，當有幹擾出現時，其控制訊號可能不夠大，無法修正幹擾的影響。

3.1.1 穩態誤差

比例控制在誤差為 0 時，其輸出也會為 0。若要讓受控輸出為非零的數值，就需要產生一個穩態誤差或偏移量。

3.2 積分控制項

積分控制考慮過去誤差，將誤差值過去一段時間和（誤差和）乘以一個正值的常數 Ki。Ki 從過去的平均誤差值來找到系統的輸出結果和預定值的平均誤差。一個簡單的比例系統會震盪，會在預定值的附近來回變化，因為系統無法消除多餘的糾正。透過加上負的平均誤差值，平均系統誤差值就會漸漸減少。所以，最終這個 PID 迴路系統會在設定值穩定下來。

積分控制的輸出如下：

積分控制會加速系統趨近設定值的過程，並且消除純比例控制器會出現的穩態誤差。積分增益越大，趨近設定值的速度越快，不過因為積分控制會累計過去所有的誤差，可能會使回授值出現過衝的情形。

3.3 微分控制項

微分控制考慮將來誤差，計算誤差的一階導，並和一個正值的常數 Kd 相乘。這個導數的控制會對系統的改變作出反應。導數的結果越大，那麼控制系統就對輸出結果作出更快速的反應。這個 Kd 引數也是 PID 被稱為可預測的控制器的原因。Kd 引數對減少控制器短期的改變很有幫助。一些實際中的速度緩慢的系統可以不需要 Kd 引數。

微分控制的輸出如下：

微分控制可以提昇整定時間及系統穩定性。不過因為純微分器不是因果系統，因此在 PID 系統實現時，一般會為微分控制加上一個低通濾波器以限制高頻增益及雜訊。實際上較少用到微分控制，估計 PID 控制器中只有約 20% 有用到微分控制。

引數除錯

PID 的引數除錯是指透過調整控制引數（比例增益、積分增益 / 時間、微分增益 / 時間）讓系統達到最佳的控制效果。穩定性（不會有發散性的震盪）是首要條件，此外，不同系統有不同的行為，不同的應用其需求也不同，而且這些需求還可能會互相衝突。

PID 只有三個引數，在原理上容易說明，但 PID 引數除錯是一個困難的工作，因為要符合一些特別的準則，而且 PID 控制有其限制存在。歷史上有許多不同的 PID 引數除錯方式，包括齊格勒－尼科爾斯方法等，其中也有一些已申請專利。

PID 控制器的設計及除錯在概念上很直覺，但若有多個（且互相衝突）的目標（例如高穩定性及快速的暫態時間）都要達到的話，在實際上很難完成。PID 控制器的引數若仔細的除錯，會有很好的效果，相反的，若調適不當，效果會很差。一般初始設計常需要不斷的電腦模擬，並且修改引數，一直達到理想的效能或是可接受的妥協為止。

有些系統有非線性的特性，若在無載下除錯的引數可能無法在滿載下動作，可以利用增益規劃的方式進行修正（在不同的條件下選用不同的數值）。

4.1 穩定性

若 PID 控制器的引數未挑選妥當，其控制器輸出可能是不穩定的，也就是其輸出發散，過程中可能有震盪，也可能沒有震盪，且其輸出只受飽和或是機械損壞等原因所限制。不穩定一般是因為過大增益造成，特別是針對延遲時間很長的系統。

一般而言，PID 控制器會要求響應的穩定，不論程式條件及設定值如何組合，都不能出現大幅振盪的情形，不過有時可以接受臨界穩定的情形。

4.2 最佳效能

PID 控制器的最佳效能可能和針對過程變化或是設定值變化有關，也會隨應用而不同。

兩個基本的需求是調整能力（regulation，幹擾拒絕，使系統維持在設定值）及命令追隨 （設定值變化下，控制器輸出追隨設定值的反應速度）。有關命令追隨的一些準則包括有上昇時間及整定時間。有些應用可能因為安全考量，不允許輸出超過設定值，也有些應用要求在到達設定值過程中的能量可以最小化。

4.3 各方法的簡介

有許多種除錯 PID 控制器引數的方法，最有效的方式多半是建立某種程式，再依不同引數下的動態特性來除錯引數。相對而言人工除錯其效率較差，若是系統的響應時間到數分鐘以上，更可以看出人工除錯效率的不佳。

除錯方法的選擇和是否可以暫時將控制迴路「離線」有關，也和系統的響應時間有關。離線是指一個和實際使用有些不同的條件（例如不加負載），而且控制器的輸出只需考慮理論情況，不需考慮實際應用。線上除錯是在實際應用的條件，控制器的輸出需考慮實際的系統。

若控制迴路可以離線，最好的除錯方法是對系統給一個步階輸入，量測其輸出對時間的關係，再用其響應來決定引數。

4.4 人工調整

若需在系統仍有負載的情形進行除錯（線上除錯），有一種作法是先將及設為零，增加一直到迴路輸出震盪為止，之後再將設定為「1/4 振幅衰減」（使系統第二次過衝量是第一次的 1/4）增益的一半，然後增加直到一定時間後的穩態誤差可被修正為止。不過若可能會造成不穩定，最後若有需要，可以增加，並確認在負載變動後迴路可以夠快的回到其設定值，不過若太大會造成響應太快及過衝。一般而言快速反應的 PID 應該會有輕微的過衝，只是有些系統不允許過衝。因此需要將回授系統調整為過阻尼系統，而比造成震盪的一半還要小很多。

調整 PID 引數對系統的影響如下

4.5 齊格勒－尼科爾斯方法

齊格勒－尼科爾斯方法是另一種啟發式的除錯方式，由 John G. Ziegler 和 Nathaniel B. Nichols 在 1940 年代匯入，一開始也是將及設定為零，增加比例增益直到系統開始等振幅振盪為止，當時的增益稱為，而振盪週期為，即可用以下的方式計算增益：

4.6 PID 除錯軟體

大部份現代的工業裝置不再用上述人工計算的方式除錯，而是用 PID 除錯及最佳化軟體來達到一致的效果。軟體會收集資料，建立模型，並提供最佳的除錯結果，有些軟體甚至可以用參考命令的變化來進行除錯。

數學的 PID 除錯會將脈衝加入系統，再用受控系統的頻率響應來設計 PID 的引數。若是響應時間要數分鐘的系統，建議用數學 PID 除錯，因為用試誤法可能要花上幾天才能找到可讓系統穩定的引數。最佳解不太容易找到，有些數位的迴路控制器有自我除錯的程式，利用微小的參考命令來計算最佳的除錯值。

也有其他除錯的公式，是依不同的效能準則所產生。許多有專利的公式已嵌入在 PID 除錯軟體及硬體模組中。

一些先進的 PID 除錯軟體也可以在動態的情況下用演演算法調整 PID 迴路，這類軟體會先將程式建模，給微擾量，再根據響應計算引數。

PID 控制的限制

PID 控制可以應用在許多控制問題，多半在大略調整引數後就有不錯的效果，不過有些應用下可能反而會有差的效果，而且一般無法提供最佳控制。PID 控制的主要問題是在於其為回授控制，係數為定值，不知道受控系統的資訊，因此其整體效能常常是妥協下的結果。在沒有受控系統模型的條件下，PID 控制最佳的控制器，但若配合系統模型，可以有進一步的提昇。

當 PID 控制器單獨使用時，若因應用需求，需調整 PID 迴路增益使控制系統不會過衝，其效果有可能很差。PID 控制器的缺點還包括無法處理受控系統的非線性、需在反應時間及調整率之間妥協、無法針對引數的變動而反應（例如系統在暖機後特性會改變）、以及大擾動下的波形落後。

PID 控制器最顯著的提昇是配合前饋控制，加入有關系統的資訊，只用 PID 控制器來控制誤差。另外，PID 控制器也有一些小幅的改善方式，例如調整引數（增益規劃或是依效能進行適應性的調整）、提昇效能（提高取樣率、精度及準度，若有需要加入低波濾波器），或是用多個串接的 PID 控制器。

5.1 線性

PID 控制器常見的問題是在於其線性且對稱的特性，若應用在一些非線性的系統，其效果可能會有變化。以暖通空調中常見的溫度控制，可能是採用主動加熱（用加熱器加熱），但冷卻是使用被動冷卻（不加熱，自然冷卻），其冷卻速度比加熱速度慢很多，輸出若有過衝，下降速度很慢，因此 PID 控制需調整為不會過衝的過阻尼，以減少或避免過衝，但這也延長了整定時間，使效能變差。

5.2 雜訊對微分器的影響

微分器的問題在於對量測或程式產生的高頻雜訊會有放大效果，因此會對輸出造成大幅的變動。因此真實的控制器不會有理想的微分器，只有一個有限頻寬的微分器或高通濾波器。一般為了移除高頻的雜訊，會在量測時加入低通濾波器，若低通濾波器和微分器對消，濾波效果也就受限了，因此低雜訊的量測裝置相當重要。實務上可以使用中值濾波器，調昇濾波效率及實際上的效能。有時可以將微分器關閉，對控制性能的影響不大，此時稱為 PI 控制器。

PID 演演算法的修改

基本的 PID 演演算法在一些控制應用的條件下有些不足，需進行小幅的修改。

6.1 積分飽和

積分飽和是理想 PID 演演算法實現時常見的問題。若設定值有大的變動，其積分量會有大幅的變化，大到輸出值被上下限限制而飽和，因此係統會有過衝，而且即使誤差量符號改變，積分量變小，但輸出值仍被上下限限制，維持在上限（或下限），因此輸出看似沒有變化，系統仍會持續的過衝，一直要到輸出值落在上下限的範圍內，系統的回授量才會開始下降。此問題可以用以下方式處理：

在程式變數離開可控制範圍時，暫停積分。
讓積分值限制在一個較小的上下範圍內。
重新計算積分項，使控制器輸出維持上下限之間的範圍內。

6.2 PI 控制器

PI 控制器（比例 - 積分控制器）是不用微分單元的 PID 控制器。

控制器的輸出為

其中為設定值 SP 和量測值 PV 的誤差：

.

PI 控制器可以用 Simulink 或 Xcos 之類的軟體進行建模，方式是使用「flow chart」圖框，其中用以下的拉氏運運算元：

其中

 = 比例增益

 = 積分增益

值的選擇需在減少過衝以及增加安定時間之間取捨。

微分單元對輸入中的高頻訊號格外敏感，PI 控制器因為沒有微分單元，在訊號雜訊大時，在穩態時會更加穩定。但對狀態快速變化的反應較慢，因此相較於調適到最佳值的 PID 控制器，PI 控制器會較慢到達設定值，受幹擾後也比較慢恢復到正常值。

PDF 控制（pseudo-derivative feedback control）可以視為是 PI 控制器的變體，比例控制器的輸入由誤差值改為回授值。

6.3 不動作區

許多 PID 迴路是控制機械元件（例如閥）。機械保養是一筆可觀的費用，磨損會使得機械在有輸入訊號時出現靜摩擦或是不動作區，都會導致控制性能的下降。機械損耗的速度主要和裝置多常改變其狀態有關。若磨損是主要考量的話，PID 迴路可以有輸出的遲滯現象以減少輸出狀態的改變。若變化小，仍在不動作區內，讓控制器的輸出維持上一次的值。變化要大到超過不動作區，實際的狀態才會隨之變化。

6.4 設定值的步階變化

若系統的設定值有步階變化，比例單元和微分單元也會有對應的變化，特別是微分單元對於步階變化的輸出特別的大，因此有些 PID 演演算法會配合以下的修改來處理設定值的變化。

設定值斜坡變化

此修改方式下，設定值會用線性或是一階濾波的方式，由原始值變到新的值，避免因為步階變化產生的不連續。

只對程式變數（回授量）微分

此修改下，PID 控制器只針對量測的程式變數（PV）微分，不對誤差微分。程式變數是實際的物理量，較不易有瞬間的變化，而誤差可能因為設定值的步階變化而有瞬間變化。這也是一種簡單的設定值加權法。

設定值加權

設定值加權分別調整在比例單元及微分單元中的誤差量，誤差量的設定值乘以一個 0 到 1 之間的加權，積分單元的誤差量需使用真實的設定值，以避免穩態誤差。這兩個引數不影響對負載變化及量測雜訊的響應，可以提昇對設定點變化的響應。

6.5 前饋控制

PID 控制器若再配合前饋控制（開迴路控制），可以再提昇其控制性能。在前饋控制中考慮系統的已知資訊（例如理想加速度或是慣量），再將輸出加到 PID 控制器的控制輸出，以提昇整體的系統效能。前饋量可能是控制輸出主要的部份，而 PID 控制器只用來補償目標值和開迴路控制器輸出之間的誤差。因為前饋輸出不會受到回授的影響，因此也不會造成系統的振盪，可以在不影響穩定性的條件下提昇系統的響應。前饋可以依目標值及其他量測到的幹擾量來產生，目標值加權是一種簡單的前饋控制方式。

例如，在大部份的運動控制系統中，為了要使機械負載加速，致動器要產生更大的力。若用速度環的 PID 控制器來控制負載速度，比較理想的方式是先得到理想的瞬間加速度值，適量調整加權後再加到 PID 的輸出中。因此控制器輸出中有一部份是不隨機械速度而改變的輸出，再用 PID 根據實際輸出和目標的差異去增加或是減少輸出。這類有前饋控制的 PID 控制器可以加快控制系統的反應速度。

6.6 無衝擊運轉

有時 PID 控制器會規劃為無衝擊（bumpless）的特性，在引數變化時重新計算適當的積分累計值，使輸出不會因引數變化有不連續的改變。

串級 PID 控制器

二個 PID 控制器可以組合在一起，得到較佳的效果，這稱為串級 PID 控制。以兩個 PID 控制器組成的串級 PID 控制為例，其中一個 PID 控制器在外迴路，控制像液麵高度或是速度等主要的物理量，另一個 PID 控制器是內迴路，以外迴路 PID 控制器的輸出做為其目標值，一般是控制較快速變化的引數，例如流量或加速度等。若利用串級 PID 控制，可以增加控制器的工作頻率，並降低其時間常數。

例如一個溫控的迴圈水浴裝置有二個串級的 PID 控制器，分別有各自的熱電偶溫度感測器。外迴路的控制器控制水溫，其感測器距加熱器很遠，直接量測整體水溫，其誤差量是理想水溫及整體水溫的差值。外迴路 PID 控制器的輸出即為內迴路控制器的目標值，內迴路控制器控制加熱器，其感測器是在加熱器上，其誤差量是加熱器的理想溫度及量測到溫度的差值，其輸出會使加熱器維持在設定值附近。

內外迴路控制器的引數可能會差很多，外迴路的 PID 控制器有較長的時間常數，對應所有的水加熱或是冷卻需要的時間。內迴路的 PID 控制器反應會比較快。每個控制器可以調整到符合其真正控制的系統，例如水槽中所有的水，或是加熱器本身。

虛擬碼

以下是一段實現 PID 演演算法的虛擬碼：

previous_error = 0

integral = 0

start:

error = setpoint - measured_value

integral = integral + error*dt

derivative = (error - previous_error)/dt

output = Kperror + Kiintegral + Kd*derivative

previous_error = error

wait (dt)

goto start

此例中有兩個變數在迴圈前需初始化為 0，然後開始迴圈。目前的誤差（error）是用目前目標值（setpoint）減去系統反饋值（measured_value）而得，然後再進行積分和微分運算，比例項、積分項及微分項乘以各自引數後得到輸出（output）。在實際系統中，這會透過數位類比轉換器轉換為類比訊號，作為受控系統的控制量。目前的誤差量及積分會儲存，以便下次計算微分及積分時使用，程式會等待 dt 秒後開始，迴圈繼續進行，透過類比數位轉換器讀取新的系統反饋值及目標值，再計算誤差量及輸出。