Control de un motor de CC mediante un puente H

Utilizaremos nuestra versión económica de Arduino, con un Atmega8 montado en un protoboard, sin otros elementos adiconales, salvo el puente H y un LED indicador. La programación se hara con el entorno de Arduino, quemando el micro luego mediante el programador USBASP constuido en clase.Obviamente todos los programas y conexiones son válidas para las versiones de Arduino compatibles.

From AArtes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H

Utilizaremos el circuito  integrado L293D que dispone de 4 medios puente H en un encapsulado DIL de 16 pines (l293(4Half_H_Bridges).pdf). La principal comodidad que brinda el integrado designado con la D final es la de tener incluidos ya en su interior los diodos de protección, de modo que podemos utilizar cargas inductivas (motores, relays, etc.) sin temor a picos inversos de tensión y sin necesidad de diodos externos. 

Obviamente, puede utilizarse la versión sin la letra D final, más económica, pero habrá que agregar en forma externa los 4 diodos por motor necesarios para proteger el integrado.

 

Las características principales de este integrado son:

L293

En este caso utilizaremos sólo la mitad izquierda del integrado (dos medios puentes, es decir configuraremos un puente H completo) como se ve en el gráfico,

Con esta configuración realizaremos cuatro ejercicios distintos:

 En cuanto al micro, debe tenerse en cuenta que la denominción adoptada para los pines es  la correspondiente al Arduino, de modo que para cablear, es necesario utilizar la siguiente equivalencia entre pines del Arduino y Atmega8:

Pinout ARduino-ATmega8

Ejercicio 1- Control de sentido de giro y detención con solo dos pines usando "Fast Stop"

En este caso, el pin Enable del integrado LD293D  se conectará directamente a +Vcc1 (alimentación de 5V del micro y la lógica), de modo que el puente permanecerá constantemente habilitado. La alimentación del motor Vcc2 (12 V en nuestro motor) se ingresará por el pin8 del puente H. Los pines de entrada 2 y 7 del puente H serán controlados por los pines 7 y 8 del Arduino respectivamente.

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H

El programa que se utilizará para el control, es el siguiente:

/*
Motor_F_R
 Hace girar un motor de CC hacia un lado y el otro alternativamente
 mediante un Puenta H conectado a los pines digitales 7 y 8 (FAST STOP)
 El pin Enable del puente H está directamente conectado a +V (no es controlado)
 
 Agosto 2009 - Miguel Grassi
 Ultima actualizacion, Junio 2010
 www.miguelgrassi.com.ar
 */
int ledPin =  13;    // LED conectado al pin digital 13

int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B

void setup()
{// Inicializa los pines de salida
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
}

void loop(){
  digitalWrite(ledPin, HIGH);  // enciende el led
  digitalWrite( M1_A, HIGH);   // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M1_B, LOW);    // hacen girar el motor 1 hacia ADELANTE

  delay(3000);                 // Espera unos segundos
  digitalWrite(ledPin, LOW);   // apaga el led

  digitalWrite( M1_A, LOW);    // Un valor IGUAL en A y en B simultáneamente
  digitalWrite( M1_B, LOW);    // DETIENEN con fuerza el el motor 1 (FAST STOP)

  delay(1000);                 // Espera un segundo

  digitalWrite(ledPin, HIGH);  // enciende el led
  digitalWrite( M1_A, LOW);    // Valores BAJO en A y ALTO en B simultáneamente
  digitalWrite( M1_B, HIGH);   // hacen girar el motor 1 hacia ATRAS

  delay(3000);                 // Espera unos segundos
  
  digitalWrite( M1_A, LOW);    // Un valor IGUAL en A y en B simultáneamente
  digitalWrite( M1_B, LOW);    // DETIENEN con fuerza el el motor 1 (FAST STOP)
  delay(1000);                 // Espera un segundo

  digitalWrite(ledPin, LOW);   // apaga el led

}

En el siguiente video del motor controlado con el ejemplo anterior puede observarse el "Fast Stop":

 

 Ejercicio 2- Control de sentido de giro y detención con tres pines del micro, mediante el pin Enable del Puente H ("Free Wheel")

Se quitará la conecxión directa del pin Enable del puente H a =V y se la reemplazará con una conxión al pin digital 9 del Arduino, como se ve en la siguiente imagen:

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H
 

El programa correspondiente, es el siguiente:

/*
Motor_Enable
 Hace girar un motor de CC hacia un lado y el otro alternativamente
 mediante un Puenta H conectado a los pines digitales 7 y 8
 controlando el encendido con el pin Enable del puente H conectado
 al pin digital 9
 
 Agosto 2009 - Miguel Grassi
 www.miguelgrassi.com.ar
 */
int ledPin =  13;    // LED conectado al pin digital 13

int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B
int M1_Enable = 9; // Motor 1 Enable

void setup()
{// Inicializa los pines de salida
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
  pinMode(M1_Enable, OUTPUT);     
}

void loop(){
  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, HIGH);     // Valores ALTO en A y BAJO en B simulaneamente
  digitalWrite( M1_B, LOW);      // hacen girar el motor 1 hacia ADELANTE
  digitalWrite(M1_Enable, HIGH); // Solo si el pin Enable del puente H esta habilitado

  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  // deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led

  delay(1000);                   // Espera un segundo

  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M1_B, HIGH);     // hacen girar el motor 1 hacia ATRAS
  digitalWrite(M1_Enable, HIGH); // Solo si el pin Enable del puente H esta habilitado

  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  // deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led

  delay(1000);                   // Espera un segundo

}

En el siguiente video del motor controlado con el código anterior puede observarse como el eje sigue girando libre luego de cortarse la alimentación (después de apagarse el led)

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H

Ejercicio 3 - Control de velocidad por PWM mediante parámetros fijos por programa

Con el mismo Hradware y conexionado del ejemplo anterior, reemplazar el código por el siguiente:

/*
Motor_PWM
 Hace girar un motor de CC hacia un lado y el otro alternativamente
 mediante un Puenta H conectado a los pines digitales 7 y 8
 controlando la velocidad por PWM sobre el pin Enable del puente H 
 
 Agosto 2009 - Miguel Grassi
 www.miguelgrassi.com.ar
 */
int ledPin =  13;    // LED conectado al pin digital 13

int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B
int M1_Enable = 9; // Motor 1 Enable

void setup()
{// Inicializa los pines de salida
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
  pinMode(M1_Enable, OUTPUT);     
}

void loop(){
  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, HIGH);     // Valores ALTO en A y BAJO en B simulaneamente
  digitalWrite( M1_B, LOW);      // hacen girar el motor 1 hacia ADELANTE
  analogWrite(M1_Enable, 20);    // a velocidad muy lenta

  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led

  delay(1000);                   // Espera un segundo

  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M1_B, HIGH);     // hacen girar el motor 1 hacia ATRAS
  analogWrite(M1_Enable, 128);    // a una velocidad moderada (50%)

  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led

  delay(1000);                   // Espera un segundo

}

El video correspondiente es el siguiente:

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H

Ejercicio 4 - Control de velocidad por PWM en base a la lectura analógica de un potenciómetro

En etse caso, se agregará un portenciómetro conectado a la entrada analogica 5 del Arduino, como muestra la foto:

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H

El código correspondiente a este ejemplo es el siguiente:

/*
 Motor_PWM_Pote
 Hace girar un motor de CC mediante un Puenta H conectado a los pines digitales
 7 y 8 controlando la velocidad por PWM sobre el pin Enable del puente H en base
 a la lectura de un potenciometro conectado al pin analogico 5
 
 Agosto 2009 - Miguel Grassi
 Ultima revision: Junio 2010
 www.miguelgrassi.com.ar
 */
int ledPin =  13;    // LED conectado al pin digital 13

int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B
int M1_Enable = 9; // Motor 1 Enable
int Pote = 5;      // Lectura del Potenciometro

void setup()
{// Inicializa los pines de salida
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
  pinMode(M1_Enable, OUTPUT);     
  pinMode(Pote, INPUT);     
}

void loop(){
  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, HIGH);     // Valores ALTO en A y BAJO en B simulaneamente
  digitalWrite( M1_B, LOW);      // hacen girar el motor 1 hacia ADELANTE
  int valorPote = analogRead(Pote); // Lee el valor del potenciometro
  int valorVeloc =  map(valorPote, 0, 1023, 0, 255); //Convierte un valor entre 0 y 1023 al rango 0-255
  analogWrite(M1_Enable,valorVeloc);    // y establece la velocidad del motor con ese valor

}

Por ultimo, el video del funcionamiento:

From Artes Electrónicas-Control de un Motor de CC mediante Arduino y un Puente H