miércoles, 19 de octubre de 2016

Control de Velocidad de Motor DC aplicando Pulse Width Modulation



HARDWARE

Componentes requeridos:

A) Arduino UNO
B) Transistor NPN 2N2222A
C) Motor DC 6V @400 mA
D) 3 Resistencias de 220 Ohms
E) 1 Resistencia de 1 Kohm
F) 1 Potenciometro de 10 Kohm
G) 1 Piezoelectrico
H) 3 Leds 5 mm


¿Como funciona?

La velocidad del motor estará determinada por el valor de resistencia del potenciometro que es leido desde el pin A5 de arduino, y mediante código se determina la formula matemática para el ancho de pulso (duración del high-low)

Si la velocidad del motor esta en el rango de 100 - 200 el led verde se encenderá (condición normal de operación).

Si la velocidad excede el valor 230 (250 es el máximo valor) el led  rojo se enciende junto con una alarma de advertencia de máxima velocidad del motor.

El led amarillo (señal de advertencia) se encenderá cuando el valor para la velocidad este en el rango de 210-229. El dato de la velocidad sera mostrado en el monitor de puerto serie del IDE


EL SKETCH


/*
Este programa CONTROLA LA VELOCIDAD DE GIRO DE UN MOTOR DC de baja corriente mediante PWM (Pulse Width Modulation), empleando un potenciómetro de 10 Kohm y un transistor 2N2222A de 600mA de corriente máxima de salida.

La base del transistor se conectará al pin 9 de Arduino y el potenciómetro estará enviando sus valores de resistencia al pin analógico 5. Se emplea una resistencia de 1 Kohm en la base del transistor para protección.

Se configura la comunicación con el puerto serie a 9,600 baudios a fin de poder monitorear el valor prefijado en el potenciómetro, que puede ir desde 0 a un valor máximo de 255 (máximo ancho de pulso, máxima velocidad del motor)

Se emplean 3 LED´S (VERDE - AMARILLO - ROJO) que se encenderán de acuerdo a las RPM del motor.

Si la velocidad de giro alcanza los 225 RPM, el LED ROJO se enciende y una alarma así nos lo hará saber.

*/

int MOTOR1 = 9;     //La Señal para la activación del motor en pin digital 9, conectado a la base de Q1
int Potenciometro = 5;    //Potenciómetro a la entrada analógica 5 (Pata central del pot)

int LED_ROJO = 2;
int LED_AMARILLO = 4;
int LED_VERDE = 6;

int ALARMA = 8;

void setup()
{
 // Se configura el pin digital 9 como salida y el pin analógico 5 como entrada. Los pins 2-4-6 también se   //configuran como salida, así como el pin digital 8 para la alarma:

pinMode(MOTOR1 , OUTPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(ALARMA, OUTPUT);

pinMode(Potenciometro, INPUT);

Serial.begin(9600);  //Se inicia la comunicación con el puerto Serie a una velocidad de 9,600 baudios

}

void loop() {
//Se lee el valor de resistencia en el potenciómetro, que puede ir de 0 a 1023.

int Valor = analogRead(Potenciometro);  
int Velocidad_del_Motor = Valor/4;      //Se declara la variable que alojara la velocidad del motor.

 if(Velocidad_del_Motor >=50 and Velocidad_del_Motor <=125)

     {
     digitalWrite(LED_VERDE, HIGH);
     
     digitalWrite(LED_AMARILLO, LOW);

     digitalWrite(LED_ROJO, LOW);
    
     }
       
   else
   
     {
   digitalWrite(LED_AMARILLO, HIGH);
   digitalWrite(LED_VERDE, LOW);
   digitalWrite(LED_ROJO, LOW);
     }

   if(Velocidad_del_Motor >=220)

      {
     digitalWrite(LED_VERDE, LOW);
     digitalWrite(LED_AMARILLO, LOW);
     digitalWrite(LED_ROJO, HIGH);

     tone(ALARMA,700, 200);
     delay(1000);
     noTone(ALARMA);
     }

//El ancho de pulso enviado a la base de Q1, estará determinado por Valor/4, lo que provoca que el motor gire a más rpm o menos rpm.

analogWrite(MOTOR1, Velocidad_del_Motor);

//Se imprime el dato de la velocidad del motor, en el monitor del puerto serie.

Serial.println(Velocidad_del_Motor);      
 
}


DEMOSTRACIÓN