(Academic work – Angle control with DC motor and Arduino)
En lo que sigue se expone el diseño e implementación de un controlador de posición angular para motor DC de imanes permanentes, basado en topología Convertidor Buck controlado por lazo de realimentación PI para el voltaje de armadura y control proporcional P de velocidad. Los requerimientos de posición angular son ingresados desde un computador, vía puerto serie. La posición angular del eje motriz se mide a través de un encoder óptico rotatorio, cuya construcción se detalla.
Lo implementé en base a Arduino Uno, el cual controlaba el ciclo de trabajo de un convertidor buck que alimentaba el motor DC. Mis agradecimientos a Carlos M. y Waldo M., quienes ayudaron bastante con facilitar el espacio de trabajo y algunos insumos.
I. El Encoder rotatorio
Un encoder rotatorio es un dispositivo que permite conocer la posición angular de un eje en todo instante t, con una determinada precisión Δθ. Los hay para medición de posición y velocidad en máquinas giratorias, en perillas para control de aparatos electrónicos en instrumentos de medición, entre otras aplicaciones.
En el mercado hay encoders en base a conmutadores mecánicos (más económicos, pero menos durables, ruidosos y para bajas velocidades) y ópticos (cuyo contacto de cierre y apertura de conmutadores internos del encoder se hace en forma óptica, prácticamente sin desgastes mecánicos, facilitando su operación a altas velocidades de giro con alta resolución – más de 200 pasos por giro [1]-). En lo que sigue, se hará referencia a la construcción de un encoder rotatorio de tipo óptico.
Se adopta la topología de encoder rotatorio mostrado al lado derecho de la Fig.1, donde el desplazamiento Δθ es indicado al microcontrolador a través de un emisor-receptor de luz infrarrojo, el cual entrega como salida un 1 lógico (+5Vdc) cuando hay reflexión de la luz en el disco, y un 0 lógico (0 Vdc) cuando no la hay. Estos valores de tensión se obtienen a partir de un circuito comparador alimentado con +5Vdc, ideal para los pines de entrada del Arduino Uno. De hecho, la implementación en hardware se hizo a través del módulo KY-033 diseñado para Arduino. A nivel de programación, se detectan los flancos de subida y bajada para efectos de sumar o restar pasos de Δθ. En la Fig. 2 se muestra el disco implementado en esta experiencia, con un total de 24 flancos subida-bajada por vuelta (en total), distribuidos en forma uniforme por la circunferencia del disco, resultando en una resolución de 15° sexagesimales.
En caso que se deseara medir el sentido de giro, sería necesario instalar un segundo emisor y receptor de luz, desfasado en 90° eléctricos respecto del primero. Conociendo el orden en que se producen los flancos de subida y bajada en cada sensor fotoeléctrico, es posible conocer el sentido de giro. Sin embargo, en nuestro caso controlamos el sentido de avance a través de la polaridad aplicada al motor DC, por lo cual es suficiente implementar un único sensor fotoeléctrico.
II. Implementación
El hardware se desarrolló en base a la tarjeta Open Source de fácil programación Arduino Uno, aprovechando que disponemos de una unidad, y además porque posee pines para interrupciones, puerto serie vía USB, Timers, ADCs y su velocidad de reloj es adecuada para esta aplicación (16 MHz).
La lógica de operación se muestra en la Fig. 3, donde podemos apreciar dos lazos de control concatenados, uno para la velocidad y otro para el voltaje de armadura.
A nivel global se maneja la velocidad mediante un control proporcional P cuya referencia se define desde el computador (vía puerto Serial – USB) y con lazo de control realimentado a través de las interrupciones provenientes desde el encoder óptico, las que definen la posición angular actual del disco a través del valor incremental dado por la suma reiterada (o resta, según sea el sentido giro – polaridad aplicada al motor DC -) de la resolución del encoder. En nuestro caso, de acuerdo a la Fig. 2, se tiene una resolución Δθ = 15°, puesto que las interrupciones (o incrementos) actúan tanto en flancos de subida como de bajada del sensor óptico. Así se obtiene la posición actual y, restándola a la referencia, obtenemos el error de posición, valor que ocupamos como entrada al control proporcional.
Es suficiente ocupar un control proporcional para la posición puesto que en un motor DC de imanes permanentes, la velocidad angular de giro es aproximadamente proporcional a la tensión de armadura aplicada, considerando una inercia constante en el sistema rotatorio. Como en nuestro caso experimentalmente hemos comprobado que prácticamente no hay un efecto visible de inercia mecánica una vez el dispositivo alcanza el valor referencia de ángulo (no hay sobrepasos) para velocidades bajas; a lo que sumamos que la resolución del encoder es de 15°, no es necesario el uso de control integral puesto que el error en estado estacionario será imperceptible por nuestro lazo de realimentación. Sin embargo, es muy delicado el ajuste del control proporcional, puesto que ante una ganancia excesiva se tiene dificultades desde el punto de vista mecánico y de errores de medición en el encoder óptico. Luego de diversas pruebas para diferentes tipos de control y condiciones de saturación, se concluye que la función de control mostrada en la Fig. 4 satisface todos los requerimientos de nuestro sistema: se adapta a la capacidad de conteo del encoder óptico, actúa en forma adecuada en el motor DC sin que se trabe en mecanismo reductor de revoluciones (si este se ubica físicamente en forma conveniente) y además permite la conexión de esta tensión al ADC del Arduino, previo filtro pasa bajos.
Para el control proporcional integral PI de voltaje se han utilizado los valores Kp = 10, Kv = 10 y tiempo de integración de Ts = 1 [ms], con resultados satisfactorios puesto que la dinámica con que nuestro convertidor llega al valor de referencia es mucho más rápida que las definidas por la mecánica del sistema (que determinan el control de velocidad – posición). Si se desea profundizar en el funcionamiento del control de voltaje DC a través de lazo PI (proporcional – integral), se sugiere revisar el informe del Taller 1.
Es importante mencionar que el convertidor Buck construido solamente es capaz de entregar tensiones mayores o iguales a cero e inferiores al valor de entrada DC (que, en nuestro caso, para efectos de simplificar la implementación, se ha definido igual a Vin = 5 [V]), por lo que no es suficiente para que el motor gire en ambos sentidos ni alcance velocidades de giro muy elevadas. Por lo mismo, la lógica de control considera que en caso que al PI de voltaje se le solicite una acción de control con voltaje de salida negativo (velocidad de giro en sentido contrario), para efectos de la definición del ciclo de trabajo del convertidor considera el valor absoluto de dicha referencia de tensión, y mediante un puente H se entrega la polaridad correcta a la tensión de armadura (mostrado en Fig. 5). Por otro lado, se define valores de saturación para evitar que el convertidor opere por sobre sus límites teóricos, más aún, por sobre o por debajo de sus límites prácticos [D = 0.2 a 0.8, observados experimentalmente]. Esto porque para valores del ciclo de trabajo cercano a los extremos 0 o 1, el comportamiento del convertidor es inestable, especialmente en nuestro caso por el apagado lento del optoacoplador con fototransistor Darlington utilizado (4N32), único disponible y de adquisición personal al momento de implementar el circuito. Además, en la práctica el motor es altamente no lineal, principalmente por problemas de lubricación en la caja reductora, haciendo crítica la correcta definición de estos márgenes de operación.
En la Fig. 5 se aprecia un diagrama de bloques representativo del hardware implementado, mientras que conexionado del Arduino Uno se muestra en la Fig. 6.
Respecto del Arduino UNO, de acuerdo a lo mostrado en Fig. 6, se tiene las siguientes conexiones:
-
-
-
- Interfaz USB para comunicación serial hacia PC.
- PIN 3 Salida PWM
- PIN 7 Sentido de avance hacia adelante
- PIN 8 Complementario PIN 7
- PIN 2 Entrada Pulsos Encoder Óptico (Interrupción)
- PIN A3 Entrada ADC sensor Vout
- PIN 13 Salida LED indicador posición alcanzada
-
-
Para efectos de la generación de señal PWM, se ha establecido como N = 32 el valor de división (prescaler) de la frecuencia de reloj para el Timer que se usa en nuestro generador PMW, y se ha definido como valor máximo del contenedor de fase Tocr = 100 (equivalente a un ciclo de trabajo D=1, es decir, del 100%), quedando el ciclo de trabajo expresado con resolución de 1%. Considerando que la frecuencia de reloj del Arduino Uno es de Fclk = 16[MHz] y que el Timer avanza 1 unidad por ciclo, se tiene una frecuencia de conmutación PWM de fPWM = 5 [kHz], lo que es adecuado para nuestro hardware. Recordemos que, por el largo tiempo de apagado del Optoacoplador, no es posible ocupar frecuencias superiores a 5 [kHz], tal como se indica en informe del Taller 1. Se dispone una resistencia (ampolleta 12[VDC]/5W) en forma paralela a la carga DC del motor, para así incrementar la corriente de carga y asegurar que el sistema operará en modo de conducción continua de corriente.
La topología implementada para el convertidor reductor de tensión es la mostrada en la Fig. 5. Utiliza el N-MOSFET IRFP450 de International Rectifier, y como GATE Driver un Totem-pole basado en transistores bipolares complementarios 203904 (NPN) y 2N3906 (PNP), excitados a través del Optoacoplador 4N32 open-collector. Es idéntica a la utilizada en el Taller 1, pero con algunas modificaciones que se indican a continuación:
-
-
- Voltaje de alimentación etapa de potencia Vin = 5[VDC]
- Diodo Zener es D1 = 1N4732A (4.7 [V])
- Lazo de realimentación está formado sólo por filtro pasa-bajos capacitivo de 1uF, muy cerca de PIN del ADC.
-
El circuito capaz de generar los pulsos para llevar a cabo las interrupciones que definen los incrementos (o reducción, según sea el sentido de giro), se muestra en la Fig. 8, donde la tensión presente en el divisor de tensión formado por el fotodiodo D1 y R2 depende de la luz que recibe D1, proveniente de las zonas blancas del disco rotatorio mostrado del encoder (mostrado en Fig. 2). El voltaje umbral (por ende, la sensibilidad) es ajustado a través del potenciómetro R3. En la práctica, este circuito se implementó a través del módulo KY-033 para Arduino.
Por otro lado, se implementó un circuito inversor de polaridad del motor DC para permitir el giro de este en ambos sentidos. En primer lugar, se utilizó un puente H en base a transistores bipolares (BJT) complementarios, comandados desde los pines de sentido de giro complementarios entre sí (pines 7 y 8 del Arduino). El circuito fue el mostrado en la Fig. 7. Se utilizaron los transistores complementarios FJP3305 (NPN) y 2SA940 (PNP), con encapsulado TO-220, disponibles en laboratorio. También hubiese sido adecuado el uso de los transistores TIP41C y TIP42C, más económicos que los anteriores. Luego de varias pruebas, se observó que el comportamiento del puente inversor (o intercambiador de polaridad, para que no se confunda con el concepto de inversor que habitualmente se ocupa en electrónica de potencia) es adecuado, pero la caída de tensión en el puente fue del orden de 1.5 ~ 2 [V], afectando el desempeño del control de velocidad puesto que alimentamos el convertidor con sólo 5 [V]. En todo caso, el control funcionó, pero se trababa con facilidad por las no-linealidades del sistema mecánico al contar con una menor tensión de armadura. También se observó que, al no haber sobrepasos, el dispositivo no requiere conmutaciones de alta velocidad en el cambio de polaridad de la tensión aplicada al motor, por lo cual un mecanismo basado en relés mecánicos se consideró una solución adecuada. Esta opción es la mostrada en la Fig. 9.
El puente H en base a relés electromecánicos, si bien opera a velocidades mucho más bajas que uno de estado sólido, tiene la ventaja que la caída de tensión entre contactos cerrados es prácticamente cero, y tolera altos niveles de corriente y tensión (aunque en nuestro caso, ambas variables son bajas). Si sumamos aquello a que disponemos del módulo de 2 relés para Arduino, lo que nos permite ahorrar gran cantidad de cables sobre nuestro protoboard, optamos por utilizar esta opción. Así se reduce la probabilidad de fallas durante la presentación de este setup, debidas muchas veces a cables sueltos o errores de conexión involuntarios en el protoboard. En la Fig. 10 se muestra el circuito basado en relés electromecánicos, implementado en la práctica con un módulo accesorio Arduino.
El software de control se puede resumir en el diagrama de flujo mostrado en la Fig. 11.
En la Fig. 12 tenemos el setup de esta experiencia. Se utilizó una fuente lineal de laboratorio, dual, con salidas configuradas a 5 [V] (alimentación del circuito de potencia) y 10 [V] (polarización del circuito de disparo del MOSFET, flotante respecto de la anterior).
Se ha probado el setup satisfactoriamente con ángulos de referencia positivos y negativos, con valores de varias vueltas completas del encoder (por ejemplo 3600°, equivalentes a 10 vueltas completas), o a fracciones de esta (por ejemplo 15°, ó -30°), o a combinación de ambas (por ejemplo, 375° o -105°) con resultados totalmente satisfactorios.
La solución aquí presentada demuestra ser efectiva para un amplio rango de ángulos objetivo, ya sean positivos o negativos. Pruebas realizadas mostraron resultados satisfactorios para ángulos entre -10000° y +10000°, con una adecuada precisión.
Mejorando la robustez mecánica del encoder óptico, incrementando la capacidad de potencia del convertidor Buck y adaptando los lazos de control (en software y hardware), esta implementación es perfectamente extrapolable para aplicaciones industriales, resguardando cumplir las exigencias constructivas para este tipo de equipos.