【2025 ESP32】PID控制完整教學:原理、公式與實際應用案例

在自動控制領域,PID控制器幾乎無所不在,從工業溫控到無人機飛行都能見到它的身影。簡單來說,PID控制器就像一個「智慧調節員」,根據偏差(Error)自動調整輸出,讓系統穩定在目標值。

PID控制的基本概念

PID代表比例(Proportional)、積分(Integral)與微分(Derivative)。三者共同運作,平衡速度與穩定性,讓控制更平滑。

比例(Proportional)、積分(Integral)、微分(Derivative)各自角色

  • 比例控制(P):根據偏差大小立即反應。偏差越大,輸出越大。
  • 積分控制(I):累積過去的偏差,消除長期誤差。
  • 微分控制(D):預測偏差變化,提前減緩震盪。

PID控制公式解析

基本數學公式

PID輸出可寫成:

PID公式
PID公式

其中:

  • 𝑢(𝑡):控制輸出
  • 𝑒(𝑡):誤差(設定值-量測值)
  • 𝐾𝑝,𝐾𝑖,𝐾𝑑:三項增益參數

每個參數對系統影響的說明

  • 𝐾𝑝:提高反應速度,但過大會震盪
  • 𝐾𝑖:消除穩態誤差,但過大會超調
  • 𝐾𝑑:抑制震盪,增加穩定性

設定點(Setpoint)與回授(Feedback)的關係

設定點就像「期望溫度」,回授是「實際溫度」,PID根據兩者誤差動態調整加熱功率。

PID控制的優點與限制

為何PID廣泛應用於工控

簡單、穩定、易於實作。只需三個參數即可控制大多數線性系統。

常見問題與挑戰

參數不好調時可能導致震盪或延遲;對強非線性系統需要額外補償。

水簇箱水溫控制案例說明

案例背景與需求

假設我們有一個魚類實驗室的水簇箱,需保持水溫在25°C ±0.5°C,使用加熱棒與DS18B20溫度感測器,透過ESP32實現PID控制。

系統架構:感測器、加熱器與控制板

  • 感測器:DS18B20量測水溫
  • 加熱器:電阻加熱棒
  • 控制板:ESP32執行PID演算法並控制繼電器

優良店家推薦:

PID控制在水溫調節中的運作

每秒讀取水溫 → 計算誤差 → PID輸出 → 調整加熱器功率(或繼電器開關週期)。

PID參數調校方法

經驗法則(Ziegler–Nichols)

先關閉I與D,只用P調至系統邊緣震盪,再依公式計算Kp, Ki, Kd。

手動調整技巧

從小到大逐步增加,觀察系統響應曲線,不斷微調。

PID Compensation Animated
PID調整參數變化

我使用Excel設計了一個手調Kp, Ki & Kd,模擬PID的試算表(如下圖),這便於你練習如何調整三個數值的變化,如有需要請在底下留言告訴我。

PID手調試算表
PID手調試算表

控制程式範例(Arduino/ESP32)

硬體接線說明

  • DS18B20資料腳 → ESP32 GPIO 4
  • 繼電器模組控制腳 → ESP32 GPIO 5
  • 加熱棒 → 市電,經繼電器控制
				
					#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 4
#define RELAY_PIN 5

double Setpoint = 25.0; // 目標溫度
double Input, Output;
double Kp = 2.0, Ki = 0.5, Kd = 1.0;

double errSum = 0, lastErr = 0;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  Input = sensors.getTempCByIndex(0);

  double error = Setpoint - Input;
  errSum += error;
  double dErr = error - lastErr;

  Output = Kp*error + Ki*errSum + Kd*dErr;

  // 控制繼電器(加熱器)
  if (Output > 0) {
    digitalWrite(RELAY_PIN, HIGH);
  } else {
    digitalWrite(RELAY_PIN, LOW);
  }

  lastErr = error;

  Serial.print("Temp: "); Serial.print(Input);
  Serial.print(" Output: "); Serial.println(Output);

  delay(1000);
}

				
			

這段程式碼會每秒讀取水溫、計算PID並驅動繼電器。

實際運行結果與觀察

剛開始溫度會略有超調,經過幾次調整Kp、Ki、Kd後能穩定在設定溫度附近。

PID在其他場景的應用

工業溫控

烤箱、鍋爐、冷藏系統。

電機速度控制

直流馬達、泵浦轉速穩定控制。

結論

PID控制是一個歷久不衰且實用的控制策略。透過簡單的三個參數就能在多數應用場景中實現穩定、精準的控制。本篇以水簇箱水溫為例,展示了從原理到程式實作的完整流程,只要搭配適當的感測器與執行元件,就能快速打造自己的溫控系統。

常見問題FAQ

Q1:PID控制一定要同時用P、I、D三項嗎?
A1:不一定,可以只用P或PI,視系統需求而定。

Q2:為何我的系統會震盪?
A2:可能Kp太大或Ki過強,需降低參數或增加Kd。

Q3:ESP32能同時控制多個溫控點嗎?
A3:可以,多讀幾個感測器並分別計算PID即可。

Q4:溫控用PWM好還是繼電器好?
A4:需看加熱器特性,小功率可PWM,大功率建議繼電器或固態繼電器。

Q5:有沒有現成的PID函式庫?
A5:有,Arduino上有PID_v1庫,可簡化程式撰寫。

參考資料

在〈【2025 ESP32】PID控制完整教學:原理、公式與實際應用案例〉中有 2 則留言

    1. 當然可以!

      請email到我的信箱"brian.huang2598@gmail.com",分享可以收到的email address給我。

      謝謝!
      Brian

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端