Tercera parte de la serie dedicada al control de motores.
En el tutorial 9.1 vimos una introducción al control de motores de CC mediante diversas técnicas. Continuamos con el proyecto 9.2 donde se explica cómo usar el driver KEYES L298 para motores de mediana potencia.
A continuación vamos a ver cómo controlar motores de CC de elevada potencia. El que voy a utilizar para ilustrar este proyecto, es un motor de 90V y 3,3A.
Este tipo de motores se emplea en aplicaciones que necesitan movimientos de vaiven, es decir, frecuentes cambios de sentido de giro, pero que no requieren alta velocidad de conmutación. Por ejemplo: elevadores, camillas, persianas, puertas automáticas…
En tutoriales anteriores empleados puentes en H para controlar motores. Aquí vamos a cambiar el sentido de giro con un relé de contactos dobles, polarizando el motor en un sentido o en otro.
El MOSFET de potencia será el encargado de cerrar el circuito a masa. La velocidad se controla mediante pulsos PWM aplicados al MOSFET. Para ello se pueden emplear los MOSFET driver IC´s como vimos en el Proyecto 31.2
Sin embargo, para ver las diferentes opciones a la hora de controlar un MOSFET, aquí voy a usar un optoacoplador TLP250 de TOSHIBA. En el blog de Tahmid hay una explicación muy detallada de cómo usar este circuito integrado.
Con los pulsadores SW1 y SW2 hacemos que el motor gire en un sentido o en otro, alimentando o no, la bobina del relé K1. Mediante el potenciómetro P1 seleccionamos la velocidad. Las resistencias R5 y R6 de tipo pull-down son de uso obligado, ya que mejoran la respuesta de los switches SW1 y SW2.
La alimentación del motor se hace a través del transformador TR1 y el puente rectificador BR1. Las bobinas L1, L2 y L3 junto con los condensadores C1 y C2 forman un filtro de línea para minimizar el ruido y los picos de tensión producidos por el motor.
La configuración empleada en este driver es del tipo Aislado, No-Inversor.
Aislado quiere decir que la parte de control (Arduino y el relé K1) está separada de la parte de potencia (el MOSFET). Para ello he empleado dos fuentes de alimentación de 12V llamadas +12V1 y +12V2, cada una con su correspondiente masa GND1 y GND2. La masa del optoacoplador se debe unir con la masa de la alimentación del motor GND-M. Al estar Arduino eléctricamente aislado del MOSFET, conseguimos que en caso de cortocircuito no se vea afectado. Esta configuración necesita de dos fuentes de alimentación, pero a cambio ofrece más seguridad.
Por otro lado, No-Inversor significa que los pulsos PWM generados por Arduino para controlar la velocidad de giro, son transmitidos tal cual, a la puerta del MOSFET mediante el optoacoplador TLP250.
Otra configuración más sencilla es No Aislado, No-Inversor. En este caso, se usa una única fuente de 12V para Arduino, el relé K1 y el optoacoplador. Hay que unir la masa de los 12V con la masa de la alimentación del motor. En caso de cortocircuito en el lado de potencia, esta opción sigue siendo segura para Arduino, ya que el optoacoplador se encarga de aislar ambos lados, aunque la masa sea común.
De nuevo recomiendo visitar el blog de Tahmid donde se pueden ver ejemplos de circuitos de control Aislado, No Aislado e Inversor y No-Inversor.
El sketch es muy sencillo. Mediante los pulsadores SW1 y SW2 conectados en D3 y D4, alimentamos o no la bobina del relé K1 (pin D12), haciendo que el motor gire en un sentido o en otro.
Actuando sobre el potenciómetro P1, modificamos el ancho de los pulsos PWM (pin D11) aplicados a la entrada del optoacoplador y variaremos la velocidad de giro del motor.
/*
Proyecto 9.3 - High Power DC Motor Driver
Angel M. https://sites.google.com/site/angmuz
*/
#define CW 3 // Clockwise Switch 1
#define CCW 4 // Counterclockwise Switch 2
#define PWM 11 // PWM output for optocoupler
#define DIR 12 // Output pin for direction relay
int motorSpeed = 0;
int pot = 0;
void setup()
{
pinMode(CW, INPUT);
pinMode(CCW, INPUT);
pinMode(PWM, OUTPUT);
pinMode(DIR, OUTPUT);
}
void loop()
{
pot = analogRead(A0);
motorSpeed = pot/4;
if (digitalRead(CW)==HIGH)
{
Motor_Direction_CW(motorSpeed); // CW
}
if (digitalRead(CCW)==HIGH)
{
Motor_Direction_CCW(motorSpeed); // CCW
}
if (digitalRead(CW)==LOW && digitalRead(CCW)==LOW)
{
Motor_Stop();
}
if (digitalRead(CW)==HIGH && digitalRead(CCW)==HIGH)
{
Motor_Stop();
}
}
void Motor_Direction_CW(int motorSpeed)
{
analogWrite(PWM, motorSpeed);
digitalWrite(DIR, HIGH);
}
void Motor_Direction_CCW(int motorSpeed)
{
analogWrite(PWM, motorSpeed);
digitalWrite(DIR, LOW);
}
void Motor_Stop()
{
digitalWrite(PWM, LOW);
}
Una imagen del driver en el banco de pruebas.
Este sencillo circuito puede servir como punto de partida para proyectos más complejos.
Añadiendo dos finales de carrera y un control remoto por RF con los vistos en los Proyectos 32.1 y 32.2 se puede automatizar una puerta de garaje, una persiana metálica, etc...
Espero que os haya gustado.
¡Hasta pronto!