Un controlador PID es un mecanismo de control por realimentación ampliamente usado en sistemas de control industrial. Este calcula la desviación o error entre un valor medido y un valor deseado. (Wikipedia.)
En Internet hay multitud de controladores PID para el control de temperatura o de velocidad, sin embargo, encontrar información sobre el control de posición es bien escaso. En esta página presento dos controladores PID para PIC (Microchip) para controlar la posición de un motor, y está enfocado en el 18F4550, pero puedes utilizar cualquiera de la familia 18FXX5X. Para otros microcontroladores PIC tendrías que hacer adaptaciones, teniendo presente que necesitarás una interrupción externa y dos salidas PWM.
El montaje del circuito es bien sencillo, en la imagen de arriba puedes ver las pocas conexiones que tiene. Si no tenemos en cuenta el cristal de cuarzo y el USB sólo hay dos entradas para decodificar el encoder y dos salidas PWM. Es importante acondicionar las señales del encoder con alguna puerta lógica que posea disparador Schmitt. Yo utilizo el clásico 74LS14, que es un inversor lógico (puerta Not) porque posee histéresis (esta característica es lo importante). La mayoría de los encoders dan las señales de cuadratura directamente de los leds receptores y no suelen estar acondicionadas, entonces lo hemos de implementar nosotros.
El puente en H puede ser cualquiera que se adapte al motor que vayas a utilizar. Para los que no tienen mucha experiencia en puentes en H decirles que es importante que tenga protección para cuando los dos niveles de entrada están en "alto" y ha de llevar los 4 diodos de protección para eliminar las corrientes inversas que produce las bobinas del motor. Yo utilizo puentes en H que compro en Internet y a día de hoy son muy económicos y están preparados para controlar motores y bobinas.
En esta imagen puedes ver el motor que he utilizado, es un motor con encoder incorporado de 334 pulsos por revolución (ppr). El encoder me permite alimentarlo con 5 voltios (también funciona con 3,3V), pero hay que tener cuidado porque muchos encoders de hoy en día funcionan sólo con 3,3 voltios y si los alimentas con 5 se podrían estropear. Antes de hacer nada hemos de informarnos sobre esta característica y la distribución de los pines. En este enlace puedes ver la configuración del patillaje de algunos modelos de encoders ópticos de media/alta resolución.
El motor lo he alimentado con 5 voltios, a través del puente en H, y he llegado hasta los 12. La velocidad del motor es clave porque si va excesivamente rápido, como el microcontrolador ha de decodificar el encoder y traducirlo a posición, el exceso de velocidad le haría perder pulsos, entonces hemos de poner una tensión de alimentación no muy alta, y luego, una vez que funciona todo correcto, puedes ir incrementado la tensión del motor (en realidad sería al puente en H) y asegurarte de que cuenta perfecto. Cuando usamos encoders incrementales, la "velocidad" del microcontrolador es clave, por eso he utilizado un PIC rápido y con PLL interno para aumentar al máximo la frecuencia de ejecución, en este caso a 48MHz. Luego explico esto con más detalles.
Comentado los puntos importantes sobre el hardware, vamos a pasar al software. Pulsa en el siguiente enlace para descargar este proyecto. Luego iremos viendo qué es cada parte, cómo utilizarlo y la descripción de los programas.
Abre el ZIP y descomprímelo; dentro de la carpeta "controlPID" verás dos carpetas llamadas "CCS" y "Freebasic". La carpeta CCS contiene las dos versiones de control PID (en dicho lenguaje) y todo lo necesario para poder compilar. En Freebasic está el código fuente y ejecutable para establecer la comunicación entre el microcontrolador y el PC. No te preocupes si tu lenguaje de programación es otro, eso lo puedes cambiar. Yo utilizo el modo "Bulk transfer" porque me es muy cómodo y no crea tiempos de latencia, pero haciendo unas modificaciones en el programa del PIC puedes eliminar esa parte y configurarlo para comunicarte como mejor estés acostumbrado, como por ejemplo desde un terminal serie.
La carpeta "CCS" contiene dos versiones de control PID. "normalPID.c" es el control PID convencional, está basado en el algoritmo publicado por Brett Beauregard. La segunda versión es prácticamente igual, se llama "reformedPID" (PID mejorado), pero le he añadido unas líneas de código en la parte matemática que mejora notablemente el comportamiento del motor, dándole más suavidad y estabilidad al posicionarse, incluso es más sencillo de sintonizar (encontrar las constantes PID óptimas).
Pondré una imagen del código y debajo hago los comentarios.
Después viene el cuerpo del programa, con muchas configuraciones que omito describir porque ya está explicado a modo de comentarios dentro del mismo código. Pasamos directamente al "músculo" del programa que es la parte que hace mover el motor.
En el código tengo puesto las constantes PID que son óptimas para mi caso. En el tuyo es probable que el motor sea diferente y/o tengas un encoder con otra resolución. Estos cambios hace que mis constantes PID puedan ser diferentes a las que tú necesitas, entonces hay que re-sintonizar dichas constantes.
Se trata de ir probando valores para las constantes KP, KI, KD y tiempo de muestreo.
En resumen:
KP = Es la que realmente hace mover al motor la mayor parte del recorrido.
KI = Incrementa, en tiempos discretos, el valor del PWM, y lo hace en proporción a la desviación.
KD = Ajusta la velocidad de llegada y eso tiene el efecto añadido de eliminar las oscilaciones que pueda provocar el control proporcional e integral.
SampleTime = Acelera o disminuye los efectos del control integral y derivativo.
El control de posición de motores con control PID no es sencillo, pero a medida que acumules experiencia sabrás qué valores has de poner en esas constantes, hasta dejarlo perfecto. Mi consejo es comenzar con KI=0 (para anular el control integral), y poner KP=1 y KD=1. Entonces haces mover al motor hacia un lado y hacia otro, y si ves que el motor se pasa, aumentas KD, hasta que finalmente deje de hacerlo. Aumentar la constante KP nos daría mucha velocidad en el posicionamiento, pero si te excedes se pondrá a oscilar. Una vez que tengas todo esto de manera aceptable nos falta un último empuje y de eso se encarga el control integral. Para la constante integral has de comenzar con valores muy pequeños y poco a poco ir elevando esa cifra hasta conseguir el ajuste perfecto.
Según sea la naturaleza de tu proyecto te puedes encontrar que haciendo funcionar sólo la parte proporcional (P) ya te funciona estupendamente, o sólo la parte proporcional-integral (PI), o sólo la parte proporcional-derivativa (PD).
Control P: Cuando hay un amplio margen de error, existe mucha resolución (cuanto más mejor) y existe esfuerzo continuado, este controlador puede ir bien.
Control PI: Cuando la exactitud sí es crítica, en cualquier resolución y existe un esfuerzo continuado, este controlador puede ir bien.
Control PD: La exactitud aquí depende del tipo de proyecto, en cualquier resolución, con fuertes inercias, este controlador puede ir bien.
Como ya sabrás hay muchos tipos de aplicaciones de controladores PID, bien sea para posicionar un motor, controlar la velocidad, mantener una temperatura, manejar galvos, etc. Cada uno, dependiendo de la naturaleza del proyecto te puedes encontrar que no siempre es necesario un controlador PID completo.
Control de precisión, con más detalle.
Se trata de ver con más detalle la nula separación entre los dos palitos de helado. Observa especialmente el punto más inferior en el que casi se tocan; al ir y volver el carro se posiciona en el exacto lugar que antes, sin oscilaciones. De estar mirando la tecla que iba a pulsar para hacer mover el carro, me desplaza con la cámara hacia la derecha y a veces se pierde de vista ese detalle, pero al darme cuenta volvía al ángulo adecuado; esto sucede a lo largo del vídeo.
Control de inercia y esfuerzo.
Se trata de "arrastrar" un peso de 500gr; son tres imanes de magnetrones de microondas domésticos. En el vídeo no llega a los 500 porque para que se pudiera ver los dígitos de la báscula, tuve que inclinarla y eso hace perder un poco de peso (en apariencia). Ten en cuenta que el motor mueve directamente el carro, no hay engranajes ni reducciones para aumentar el par. El vídeo demuestra que a pesar de llevar una pesada carga y la inercia que provoca, el controlador PID sigue siendo igual de preciso. He utilizado las mismas constantes PID en los tres vídeos de esta página.