Brush-less DC motor speed control using PI & Fuzzy logic
Code
#include <PID_v1.h>
#include <Servo.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 13, 12, 11, 10, 9);
Servo myservo; // create servo object to control a servo
int val = 0 ; // variable to read the value from the analog pin
int sensorValue = 0;
int speed1 = 0;
int buttonState = 0;
int respon=0;
int kp=22;
int ki=27;
int kd=o;
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,19,9, DIRECT);
void setup()
{
pinMode(14, INPUT);
lcd.begin(16, 2);
lcd.print(" Brushless DC ");
lcd.setCursor(0, 1);
lcd.print(" Motor Control ");
myservo.attach(8); // attaches the servo on pin 9 to the servo object
Setpoint = 1500;
for( val = 180; val > 150; val-- )
{
myservo.write(val); // sets the servo position according to the scaled value
delay(150); // waits for the servo to get there
}
delay(3000);
val=150;
myservo.write(val);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set point: 1500 ");
myPID.SetMode(AUTOMATIC);
}
void loop()
{
buttonState = digitalRead(14);
if (buttonState == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Fuzzy mode ");
delay(500);
respon=0;
sensorValue = analogRead(A5);
if(sensorValue<390)
{
if(sensorValue>350)
{
val=155;
myservo.write(val);
}
}
if(sensorValue<350)
{
if(sensorValue>300)
{
val=165;
myservo.write(val);
}
}
if(sensorValue<300)
{
if(sensorValue>250)
{
val=179;
myservo.write(val);
}
}
if(sensorValue<450)
{
if(sensorValue>410)
{
val=145;
myservo.write(val);
}
}
if(sensorValue<500)
{
if(sensorValue>450)
{
val=135;
myservo.write(val);
}
}
if(sensorValue<800)
{
if(sensorValue>500)
{
val=125;
myservo.write(val);
}
}
if(sensorValue<250)
{
if(sensorValue>200)
{
val=180;
myservo.write(val);
lcd.setCursor(0, 1);
lcd.print("Motor overloaded");
}
}
}
else {
lcd.setCursor(0, 1);
sensorValue = analogRead(A5);
myPID.Compute(val);
analogWrite(9,Output);
lcd.print("Kp=");
lcd.print(kp);
lcd.print("and Ki=");
lcd.print(ki);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 1);
lcd.print("PI control mode ");
delay(500);
respon=1;
if(val>180)
{lcd.setCursor(0, 1);
lcd.print("Motor overloaded");
val=180;
myservo.write(val);
}
}
}
lcd.setCursor(0, 1);
speed1=(sensorValue*3.75);
lcd.print("Motor speed:");
lcd.print(speed1);
lcd.print(" ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Servo:");
lcd.print(val);
lcd.print(" ");
delay(500);}
}
#include <Servo.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 13, 12, 11, 10, 9);
Servo myservo; // create servo object to control a servo
int val = 0 ; // variable to read the value from the analog pin
int sensorValue = 0;
int speed1 = 0;
int buttonState = 0;
int respon=0;
int kp=22;
int ki=27;
int kd=o;
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,19,9, DIRECT);
void setup()
{
pinMode(14, INPUT);
lcd.begin(16, 2);
lcd.print(" Brushless DC ");
lcd.setCursor(0, 1);
lcd.print(" Motor Control ");
myservo.attach(8); // attaches the servo on pin 9 to the servo object
Setpoint = 1500;
for( val = 180; val > 150; val-- )
{
myservo.write(val); // sets the servo position according to the scaled value
delay(150); // waits for the servo to get there
}
delay(3000);
val=150;
myservo.write(val);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set point: 1500 ");
myPID.SetMode(AUTOMATIC);
}
void loop()
{
buttonState = digitalRead(14);
if (buttonState == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Fuzzy mode ");
delay(500);
respon=0;
sensorValue = analogRead(A5);
if(sensorValue<390)
{
if(sensorValue>350)
{
val=155;
myservo.write(val);
}
}
if(sensorValue<350)
{
if(sensorValue>300)
{
val=165;
myservo.write(val);
}
}
if(sensorValue<300)
{
if(sensorValue>250)
{
val=179;
myservo.write(val);
}
}
if(sensorValue<450)
{
if(sensorValue>410)
{
val=145;
myservo.write(val);
}
}
if(sensorValue<500)
{
if(sensorValue>450)
{
val=135;
myservo.write(val);
}
}
if(sensorValue<800)
{
if(sensorValue>500)
{
val=125;
myservo.write(val);
}
}
if(sensorValue<250)
{
if(sensorValue>200)
{
val=180;
myservo.write(val);
lcd.setCursor(0, 1);
lcd.print("Motor overloaded");
}
}
}
else {
lcd.setCursor(0, 1);
sensorValue = analogRead(A5);
myPID.Compute(val);
analogWrite(9,Output);
lcd.print("Kp=");
lcd.print(kp);
lcd.print("and Ki=");
lcd.print(ki);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 1);
lcd.print("PI control mode ");
delay(500);
respon=1;
if(val>180)
{lcd.setCursor(0, 1);
lcd.print("Motor overloaded");
val=180;
myservo.write(val);
}
}
}
lcd.setCursor(0, 1);
speed1=(sensorValue*3.75);
lcd.print("Motor speed:");
lcd.print(speed1);
lcd.print(" ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Servo:");
lcd.print(val);
lcd.print(" ");
delay(500);}
}