Este proyecto se deriva a un control PID con solo la programación, consiste en hacer que el "acuerdo" donde indique la revoluciones de un motor deseada, cuando empieza a disminuir, lo que hará es aumentar el PWM para un optoacoplador, y se mantenga constante los RPM, en está parte, debemos de tener claro la clase de motor y su voltaje, este programa soporta hasta 5000 RPM, posee un botón para activar el relevador antes de que pueda usar el motor, si no sabes sobre las expesificaciones del motor, entra en está página.
El proyecto usa un LCD 16x2, si no sabes las conexiones, ve al siguiente enlace LCD
descargar el archivo.
/* Control de velocidad de un motor CD,
monitoreado por un display 16x2.
Creado por Art Banshee*/
#include <LiquidCrystal.h>
int PWMmotor = 9; //definimos la salida del motor.
int rele = 8; //definimos el Relé de emergencia.
int boton = 7;
LiquidCrystal AMD (12, 11, 5, 4, 3, 2);
void setup(){
pinMode(PWMmotor,OUTPUT);
pinMode(rele,OUTPUT);
pinMode(boton,INPUT);
AMD.begin(16, 2); // tamaño del display.
}
void loop(){
int muestra = analogRead(A0)/204*1428.8; // obtenemos una muestra del motór.
/*Nota: debes de tomar solo una pequeña muestra, que es 3.5V a 1v, recomendado 3.5*/
int rpm = analogRead(A2)/204*1000; // ajustamos los RPM del motor, rango minimo 5000 RPM.
int acuerdo = analogRead(A1)/204*1000; //Los rpm acordados, maximo 5000 RPM.
/*Precaución. Usted debe de considerar los RPM del motor
y no agregar un acuerdo de más que el motor no pueda hacer.
Si no sabe sobre los RPM de un motor DC de 5, 9, 12 y 24 Volts,
consulte con la hoja de datos técnicos del motór.*/
AMD.setCursor(0, 0); //primer fila y columna
AMD.print("RPM = " && rpm);
AMD.setCursor(0, 1);//segunda fila y columna.
AMD.print("Deal= " && acuerdo && " " && muestra);
AMD.print(millis()/1000);
if (muestra < acuerdo ){
int valor = muestra / 1428.8;
int pwm = valor / 72.90;
// si 255 PWM = 5000 RPM, el variador estará al PWM o aumentará.
pwm++;
analogWrite(PWMmotor,pwm);
if (muestra > acuerdo){
pwm--;
analogWrite(PWMmotor,pwm);
}
}
if (boton == HIGH){
digitalWrite(rele,HIGH);
}
else
{
digitalWrite(rele,LOW);
}
}