洪嵐峰 發表於 2023-4-12 23:22:30

Arduino平台製作PID控制器

所需零件:

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`的值,以獲得更好的控制效果。
頁: [1]
查看完整版本: Arduino平台製作PID控制器