Manejo de motores DC usando PWM

Manejo de motores DC usando PWM

En este tema usaremos nuestros conocimientos del PWM del PIC para guiar un motor de corriente continua (DC). En esta primera entrada simplemente aplicaremos un PWM con un duty variable al motor y observaremos su respuesta (velocidad) usando los codificadores en cuadratura explicados en la entrada anterior.

Obviamente el PIC no puede proporcionar la intensidad necesaria para mover un motor, por lo que necesitaremos algún tipo de driver o interfaz. Para poder manejarlo en las dos direcciones usaremos un driver configurado como un puente en H (H-bridge). Describiremos el popular integrado (aunque no especialmente eficaz) L293D. Otras alternativas basadas en MOSFETs son más eficientes, pero el concepto y la forma de controlar el MOTOR serán comunes.



---------------------------------------------------------------------------------------------------------

Interfaz con el motor: L293 H-bridge

Las dos funciones que nos interesan en nuestro driver son:

  • Capacidad para traducir nuestras señales digitales (del microcontrolador) a corrientes de mayor intensidad y (posiblemente) voltajes mayores.
  • Capacidad de invertir el sentido de la corriente a través del motor para hacerlo girar en ambas direcciones.

La configuración que necesitamos es conocida como un puente en H (H-bridge), reflejada en la figura de la derecha (dicha figura la he sacado de
http://www.mcmanis.com/chuck/robotics/tutorial/h-bridge/index.html, donde también se puede encontrar una buena explicación más detallada sobre como funciona un puente en H.

Vemos como cerrando dos interruptores (arriba-izquierda + abajo-derecha) la corriente fluye en una dirección. Si cerramos (arriba-derecha + abajo-izquierda) se causa un cambio en el sentido de la corriente.  Si se cierran los interruptores de arriba o abajo tenemos un freno del motor. Con todo abierto el motor gira libremente. Obviamente podemos tener un problema gordo (cortocircuito) si cerramos ambos interruptores en un lado. Un puente H encierra una estructura de este estilo pero protegida para evitar las opciones "desafortunadas".


Un integrado muy popular para un H-bridge es el L293 (o su variante L293D). Su esquema está en la figura adjunta (todas las figuras sacadas de su datasheet). El integrado dispone de 2 alimentaciones separadas:





  • Vcc1  (pin 16) --> voltaje lógico  (p.e. 5 o 3.3V)
  • Vcc2  (pin 8)   --> voltaje motor Vm (hasta 36 V)

El resto del integrado está dividido en 2 bloques funcionalmente equivalentes. Cada uno de ellos (situados a cada lado del L293) es un H-bridge completo. Por ejemplo, en la rama de la izquierda disponemos de:
  • Pin ENABLE : interruptor apagado/encendido (pin 1,2 EN)
  • 2 Entradas IN1, IN2 (pines 1A,2A)
  • 2 Salidas:  OUT1, OUT2 (pines 1Y, 2Y).

Un nivel alto/bajo (respecto al voltaje de la lógica) en las entradas IN1, IN2 se traduce en un nivel alto/bajo de las salidas OUT1,OUT2 (pero en voltaje motor Vm y con mucha mayor capacidad de corriente). Cada rama puede dar unos 0.75A de forma continuada y picos de hasta 1A.

Al tener 2 puentes H completos, con un L293 podemos controlar 2 motores DC bidireccionales o 4 motores DC unidireccionales. La figura adjunta (datasheet) refleja el montaje con 1 motor bidireccional en el H-bridge izquierdo y 2 unidireccionales en el derecho:

Es este ejemplo usaremos la configuración de la izquierda para controlar un motor bidireccional. Los diodos son necesarios al manejar cargas inductivas (bobinas o motores) para evitar los picos de corriente inducidas al cortar bruscamente la corriente a la carga. En el L293D pueden ser obviados al disponer de diodos internos (aunque algunos recomiendan no fiarse demasiado de esos diodos internos y usar siempre los diodos externos, por si las moscas). Yo no los he usado en mi montaje (con un L293D) pero tengo que especificar que mis conocimientos de electrónica son casi nulos.

Para el manejo de un motor bidireccional conectaremos los bornes del motor a las salidas OUT1 y OUT2.    Disponemos de 3 entradas digitales para controlar el motor:

              ENABLE (pin 1),  IN1  (pin 2)   e  IN2  (pin 3)

Una configuración típica de control es poner p.e. un 1 lógico en IN1 y un 0 lógico en IN2. Esto provoca un voltaje de Vm en OUT1 (pin3) y 0 en OUT2 (pin6), lo que hace que el motor gire en una dirección. Si invertimos las entradas (IN1=0, IN2=1) tendremos 0V en OUT1 y Vm en OUT2, invirtiendo el sentido del giro. Finalmente, si ambas entradas están al mismo valor  (1/1) o (0/0) tendremos una rápida frenada.

Todo esto con ENABLE (pin1) a un valor alto (1 lógico), es decir, con el puente activado. Si hacemos ENABLE=0 sería como desconectar el puente y estaremos en una configuración de giro libre del motor.

Mientras que la conexión al motor es siempre a través de las dos salidas OUT1 y OUT2, tenemos dos formas posibles de regular la velocidad/sentido del motor usando la señal PWM generada por el microcontrolador, según como conectemos las  tres líneas de control (ENABLE, IN1, IN2):



Opción A) Meter PWM en ENABLE y manejar IN1, IN2 con dos pines digitales para seleccionar la dirección de giro.  El % en ON de la señal PWM establece la fracción de tiempo en la que el puente está dando corriente al motor y por lo tanto determina la velocidad del mismo. Seria equivalente a pedalear un rato y dejarse ir otro. Si estamos pedaleando todo el rato (PWM duty = 100%) iremos al máximo. Si damos 1 pedalada y descansamos 9 (PWM = 10%) iremos mucho más lentos. La dirección (signo) se especifica de forma independiente a través de IN1,IN2.  Puede usarse un solo pin conectado a IN1 y mandar la señal invertida a IN2. Precisaríamos un mínimo de 2 líneas de control.


Opcion B) Una alternativa, para reducir las líneas de control necesarias sería poner ENABLE permanentemente a 1 (puente siempre activo) y mandar la señal PWM a IN1. A IN2 mandamos la señal PWM invertida. En ese caso un PWM con un 50% ON corresponde a mantener el motor en reposo, ya que la mitad del tiempo estamos empujando para un lado y la otra mitad, para el otro.  Un PWM con 0% ON significa máxima velocidad en una dirección y un 100% máxima velocidad en el otro sentido.  


De esta forma lo que estamos haciendo es manejar signo y magnitud en la misma línea. Para conseguir la señal PWM invertida podemos usar un simple inversor (por ejemplo con un transistor).  

En aquellos PICs con un módulo PWM mejorado (EPWM) podríamos configurar el módulo PWM para que además de generar una señal, cree la complementaria en otro pin. Por ejemplo la complementaria de RC2 aparece en RD5. Esta opción tiene la ventaja de no requerir hardware externo y poder ademas programar tiempos muertos entre subidas y bajadas, lo que puede ser una necesidad para ciertos drivers.
Aunque los PIC 4520 disponen de un módulo EPWM, en nuestros ejemplos vamos a usar un inversor externo, para que el código sea aplicable a otros dispositivos que carezcan de un módulo mejorado. Además así solo precisamos 1 línea para controlar un motor bidireccional (el ENABLE correspondiente lo mantendremos fijo a 1, 5V en nuestro caso):

Tal como hemos dibujado el esquema, en la opción B, ENABLE está siempre a 1. También podríamos conectarlo a un pin del PIC y usarlo como un "embrague". Si lo ponemos a 0, el puente estará desconectado y por lo tanto, independientemente de lo que hagamos con el PWM, el motor estará en una posición de giro libre.

Desde el punto de vista del software, en ambos casos debemos activar el módulo PWM. Estoy usando un oscilador de 20 MHz, por lo que usaré  PR2=255 y PRE = 1 para una frecuencia de PWM de unos 19 KHz. Esto nos permite contar con 10 bits para especificar el ciclo de trabajo, un valor entre 0 y 1023.

  1. Si usamos el montaje A) un PWM de 0 indica parado y 1023 máxima velocidad. El signo (dirección de giro) se controlará independientemente con el valor de otro pin (p.e. RC1 en el esquema anterior).
  2. Si optamos por el montaje B) tendremos 10 bits para guiar el motor, incluyendo dirección. Un valor de 512 lo mantendrá parado, 0 será todo en una dirección y 1023 avante toda en el otro sentido.

Comentarios

Entradas más populares de este blog

Fix Audio Windows on MAC

Tkinter tkFileDialog module

Using real data types in VHDL