- UID
- 373967
- 帖子
- 9008
- 主題
- 2609
- 精華
- 0
- 積分
- 1003
- 楓幣
- 0
- 威望
- 980
- 存款
- 35891
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-22
|
ESP32-D2WD PID 控制器
需要以下零件:
ESP32-D2WD 控制晶片
電源供應器(通常是 USB 電纜)
一個温度感測器(如 DS18B20)
一個加熱器(如電熱線)
一個繼電器模塊(用於控制加熱器)
一個 LCD 模塊(用於顯示溫度和設定參數)
數據線和連接器
以下是 ESP32-D2WD 開發板的連接腳位:
GPIO 26 - 用於控制繼電器
GPIO 27 - 用於讀取温度傳感器
GPIO 14、GPIO 32、GPIO 33 - 用於 LCD 模塊
以下是一個完整的 ESP32-D2WD 的 PID 控制器範例程式碼,包括 PID 類的實現和注釋。
這個程式碼假定您已經安裝了 MicroPython 的庫,例如 onewire、ds18x20、machine、ssd1306 和 pid。
python
import machine
import onewire
import ds18x20
import time
from machine import Pin
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C
class PID:
def __init__(self, kp, ki, kd, set_point, min_output, max_output):
self.kp = kp
self.ki = ki
self.kd = kd
self.set_point = set_point
self.min_output = min_output
self.max_output = max_output
self.last_error = 0
self.integral = 0
def compute(self, input_value):
# 計算偏差
error = self.set_point - input_value
# 計算 P 項
p_term = self.kp * error
# 計算 I 項
self.integral += error
i_term = self.ki * self.integral
# 計算 D 項
d_term = self.kd * (error - self.last_error)
self.last_error = error
# 計算控制量
output = p_term + i_term + d_term
# 限制控制量在最小值和最大值之間
if output < self.min_output:
output = self.min_output
elif output > self.max_output:
output = self.max_output
return output
# 定義 PID 參數
kp = 2
ki = 0.5
kd = 1
# 定義溫度範圍和目標溫度
set_temp = 50
min_temp = 0
max_temp = 100
# 初始化温度傳感器和 LCD 模塊
dat = machine.Pin(27)
ds = ds18x20.DS18X20(onewire.OneWire(dat))
i2c = I2C(0, scl=Pin(14), sda=Pin(32), freq=200000)
oled = SSD1306_I2C(128, 64, i2c)
# 初始化繼電器和 PWM
relay = Pin(26, Pin.OUT)
pwm = PWM(relay, freq=1000, duty=0)
# 初始化 PID 控制器
pid = PID(kp, ki, kd, set_temp, 0, 1023)
# 主循環
while True:
# 讀取温度
ds.convert_temp()
time.sleep_ms(750)
temp = ds.read_temp_async()
# 計算 PID 控制量
control = pid.compute(temp)
# 控制加熱器
if control > 0:
pwm.duty(int(control))
else:
pwm.duty(0)
# 顯示溫度和 PID 控制量
oled.fill(0)
oled.text("Temp: {} C".format(temp),
python
oled.text("Control: {}".format(control), 0, 20)
oled.show()
# 檢查溫度是否超出範圍
if temp < min_temp:
# 溫度過低,關閉加熱器
pwm.duty(0)
elif temp > max_temp:
# 溫度過高,開啟加熱器
pwm.duty(1023)
# 等待一段時間
time.sleep(1) |
|