冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 576|回覆: 0
打印 上一主題 下一主題

[討論] Arduino平台製作PID控制器

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7413
主題
2609
精華
0
積分
945
楓幣
1047
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
406 小時
註冊時間
2023-1-12
最後登入
2024-4-30

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-12 23:22:30 |只看該作者 |倒序瀏覽
所需零件:

Arduino UNO開發板
5V直流電源
16x2液晶顯示屏
蜂鳴器
L293D馬達驅動模組
直流電機
紅色、藍色、綠色LED
電位器
電阻器
杜邦線
連接腳位:

Arduino UNO的5V引腳連接到L293D馬達驅動模組的5V腳。
Arduino UNO的GND引腳連接到L293D馬達驅動模組的GND腳。
Arduino UNO的9號引腳連接到L293D馬達驅動模組的ENA腳。
Arduino UNO的10號引腳連接到L293D馬達驅動模組的IN1腳。
Arduino UNO的11號引腳連接到L293D馬達驅動模組的IN2腳。
Arduino UNO的A0引腳連接到電位器。
Arduino UNO的2號引腳連接到蜂鳴器。
Arduino UNO的3號引腳連接到紅色LED。
Arduino UNO的4號引腳連接到藍色LED。
Arduino UNO的5號引腳連接到綠色LED。
程式碼:

arduino

#include <LiquidCrystal.h>

#define KP 2
#define KI 5
#define KD 1
#define setpoint 500
#define motorPin1 10
#define motorPin2 11
#define enaPin 9
#define buzzerPin 2
#define redPin 3
#define bluePin 4
#define greenPin 5

int sensorPin = A0;
float error = 0;
float previous_error = 0;
float integral = 0;
float derivative = 0
float output = 0;

LiquidCrystal lcd(7, 6, 13, 12, 8, 9);

void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(enaPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
analogWrite(enaPin, 255);
lcd.begin(16, 2);
lcd.print("PID Controller");
delay(1000);
}

void loop() {
int sensorValue = analogRead(sensorPin);
error = setpoint - sensorValue;
integral = integral + error;
derivative = error - previous_error;
output = (KP * error) + (KI * integral) + (KD * derivative);
previous_error = error;

if(output > 0) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}
else {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
}

analogWrite(enaPin, abs(output));

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setpoint: ");
lcd.print(setpoint);
lcd.setCursor(0, 1);
lcd.print("Sensor: ");
lcd.print(sensorValue);

if(error < 0) {
digitalWrite(redPin, HIGH);
digitalWrite(bluePin, LOW);
}
else {
digitalWrite(redPin, LOW);
digitalWrite(bluePin, HIGH);
}

if(abs(error) < 10) {
digitalWrite(greenPin, HIGH);
tone(buzzerPin, 1000, 500);
}
else {
digitalWrite(greenPin, LOW);
noTone(buzzerPin);
}

delay(50);
}



以上程式碼的作用如下:

1. 宣告所需使用的變數和常數。
2. 設定Arduino UNO的輸出引腳和L293D馬達驅動模組的控制引腳。
3. 初始化LCD顯示屏。
4. 在`loop()`函數中,讀取感測器的數值,計算誤差、積分和微分,根據PID控制器的計算結果調整電機的輸出。
5. 更新LCD顯示屏的內容。
6. 根據誤差的正負和大小,控制紅色、藍色和綠色LED的亮滅。
7. 根據誤差的大小,控制蜂鳴器的鳴叫。

您可以根據您的需求調整PID控制器的參數,例如`KP`、`KI`和`KD`的值,以獲得更好的控制效果。
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-4-30 09:32

回頂部