CONTROL PID PROGRAMABLE

(Por CARCASS -Año 2008-)

Introducción:

El objetivo de este proyecto es desarrollar un controlador PID al cual se le puedan variar arbitrariamente sus constantes proporcional, integral y derivativo, para poder comprobar en forma real el comportamiento de estos sistemas y verificar su similitud con la teoría.

Para que sea realmente educativo, permitiendo la investigación y el estudio de los resultados, es necesario que quede un registro visual donde se observen en función del tiempo, la señal de salida “y” del proceso, la señal de referencia “r”, la señal de error “e” y la señal de salida “u” del controlador.

Esquema general:

Para poder tener un buen registro y visualización utilicé una PC, la misma permite realizar por medio de un soft, una interfaz gráfica de fácil uso por parte del operador del equipo.

El sistema completo queda representado por la siguiente figura:

En esta figura se ve un modelo genérico en color negro y en rojo se observa como la PC intercepta las señales para controlarlas o crearlas.

Implementación del dispositivo a controlar:

Como parámetro a controlar elegí la posición del eje de un motor, porque permite una rápida visualización en comparación con otros parámetros (como por ejemplo temperatura).
Un motor paso a paso hubiese sido conveniente para simplificar el armado, ya que su velocidad de giro es lenta, pero opté por un motor común de corriente continua que le agrega más similitud con la realidad, por medio de la inercia y de necesitar un voltaje mínimo para comenzar a girar.

Claro que controlar la posición del eje de este tipo de motores que giran entre 5 y 100 vueltas por segundo es imposible, por lo que mido la posición de un eje conectado al motor por medio de un sistema de engranajes como muestra la siguiente figura.

Este sistema consta de 5 engranajes con relación de dientes 44/15 y uno simple de 25 dientes con lo que logro una reducción de 44/15 x 44/15 x 44/15 x 44/15 x 44/25 = 130,3 veces.

De esta forma logro una velocidad de giro de menos de una vuelta por segundo cuando el motor gira a máxima velocidad.

Solucionado el problema del movimiento mecánico, aparece otro que es medir con precisión la posición de este eje.

Una primera posible solución era adosar al eje un potenciómetro lineal para tener un valor de resistencia proporcional a la posición del eje, pero como el potenciómetro no da la vuelta completa había que utilizar uno multivueltas o colocarlo en el eje de una reducción extra de engranajes. Mas allá de esto, la opción de potenciómetro la descarté por el desgaste que se produce en el carbón con cada giro del eje, lo cual convertiría al equipo en algo descartable.

La segunda opción era usar un encoder mecánico de los que se consiguen por poca plata, pero como este encoder tiene solo 24 pasos no me servia para conectarlo directamente al eje. Para tener por lo menos 360 grados de precisión tenía que colocarlo sobre alguno de los engranajes de la reducción que gire 15 veces mas rápido que el eje a medir. El problema es que de esta forma el encoder giraría hasta 15 veces por segundo desgastándose rápidamente y absorbiendo mucha energía mecánica del sistema.

Finalmente coloqué un disco con perforaciones en la periferia, directamente sobre el eje del motor. Al tener 7 perforaciones y como la reducción de los engranajes es de 130,3 obtengo una precisión de 912 pasos por vuelta (0.4 grados aprox.). Estas perforaciones permiten el paso de la luz infrarroja de un led colocado debajo del disco hacia un fototransistor colocado arriba.
De esta forma tengo 7 pulsos por cada vuelta del eje del motor y conociendo el sentido de giro (controlado por el PWM) puedo conocer la posición exacta del eje del último engranaje.

Durante los primeros ensayos de este sistema de encoder aparecieron los problemas relacionados con su simpleza, por ejemplo si durante un cambio instantáneo del sentido de giro, el motor continuaba un instante girando en el sentido anterior (por la inercia) antes de frenarse y comenzar a girar en el otro sentido, los pulsos marcados por el encoder eran contabilizados en la nueva dirección de giro y no en la real. Otro problema era que cuando el motor se detiene en una posición donde el haz de luz está justo en el límite donde es bloqueado por el disco, en este caso cuando el voltaje de salida del PID no alcance para mover el motor y solo lo haga vibrar, estas vibraciones producen pulsos en el encoder ya que hacen que el disco se mueva lo suficiente para interferir en el haz de luz.

Para evitar este error, tendría que haber hecho una segunda hilera de perforaciones desfasadas 90º con respecto a la original y colocar una segunda barrera óptica para obtener esta señal desfasada similar a la de un encoder real. Pero como no quería desarmar la parte mecánica (ya que este disco perforado costó bastante balancearlo para que en altas velocidades no vibre) preferí colocar simplemente un fototransistor al lado del original, aprovechando la luz del mismo led emisor. De esta forma la luz le llega un instante antes a un receptor que al otro (o viceversa, según el sentido de giro) y tengo el dato de sentido de giro real desde el encoder, con lo cual si se fuerza manualmente al motor para variar su posición, igualmente se sigue teniendo la posición exacta del eje. Como se ve en la siguiente figura.

Como pasa casi siempre, cuando se soluciona un problema aparece otro:
Al tener un disco girando a 100 vueltas por segundo, tiene un periodo de 10 milisegundos que dividido por 7 perforaciones nos da un tiempo de 1.4mseg. del pulso del encoder, este pulso es bastante fácil de medir por el microcontrolador PIC que se encuentra ejecutando simultáneamente otras tareas dentro de la placa PID a una frecuencia de cristal de 4MHz, que nos da un tiempo de instrucción de 1uSeg. Pero al agregarle el segundo fototransistor (ambos en formato SMD) la distancia entre receptores es de 2mm por lo que el tiempo del pulso mas angosto que tenemos que medir es de 200useg aprox. (tiempo de la vuelta completa dividido por la relación ente la distancia de receptores y la circunferencia del disco perforado a la altura de las perforaciones).

Según Nyquist tengo que tener un muestreo mayor al doble, yo elijo agregarle un factor de seguridad extra y también suponer que el motor podría girar mas rápido eventualmente, por eso adopto un muestreo 5 veces mayor quedándome un intervalo entre muestras de 40uSeg.

Como no estoy usando interrupciones de soft por variación de nivel de los pines conectados al encoder y los estoy controlando por un sistema de pooling administrado por interrupciones periódicas ocurre lo siguiente: la interrupción se tendría que producir cada 40uSeg. (cada 40 instrucciones) y como la rutina de interrupción controla varias cosas (el PWM por ejemplo) tiene unas 50 instrucciones, lo que significa que antes de terminarse la interrupción podría cambiar el estado del encoder, con la consecuente perdida de pulsos.

Para solucionar esto tuve que aumentar la frecuencia de trabajo del micro, (como no tenia un cristal de 40MHz a mano) coloqué uno de 10MHz y activé el PLL interno del PIC que multiplica la frecuencia del cristal por 4. De esta forma el ciclo de instrucción es de 100 nanosegundos y fácilmente se puede controlar el encoder.

El control de velocidad y sentido de giro del motor lo hice con una configuración de transistores tipo “H” que trabajan al corte/saturación según las señales del PWM generadas en el PIC en base a los datos enviados por la PC.

Todo esto fue solo para obtener la señal “y” que representa la posición del motor. Por suerte las demás señales son mas fáciles de obtener.

El circuito impreso tiene entradas extra para obtener señales “y” de distintos dispositivos analógicos como medidores de temperatura, presión, humedad, potenciómetros, etc.


Generación de la señal “r”.

La señal de referencia puede obtenerse desde un potenciómetro o un encoder según se prefiera ya que en el circuito hay conectores para los dos sistemas. Al variar el valor de referencia se observa como el motor se aproxima a la nueva posición siguiendo las ordenes del control PID y en pantalla se ve el recorrido que hizo hasta alcanzarla (o entrar dentro de un margen de error determinado).

Si bien utilizando el ajuste de referencia manual se logra un funcionamiento del PID idéntico al de cualquiera instalado en una industria, la parte mas interesante de este controlador es la de experimentación, para la cual la señal “r” es generada por la PC para hacer estudios controlados a las respuestas del sistema a “escalones”, “rampas” y otras variaciones predeterminadas. Variando las constantes Kp, Ki y Kd se puede lograr que el control sea tipo P, PI, PD y PID incluso se podría configurar para que fuera puramente integral, ya que hay control total de las constantes.
También podemos configurar desde la PC la unidad de tiempo del eje “t” para hacer mediciones desde intervalos cortos como el posicionamiento del motor hasta intervalos de horas como puede ser el calentamiento/enfriado de un horno.
Para el caso de un horno se puede utilizar la entrada analógica con alimentación de 5v especial para el LM35 y similares, conectar al actuador por rele (incluido en el circuito) la resistencia que calienta el horno, dibujar en pantalla la curva de calentamiento en función del tiempo que queramos y definir las constantes de control PID. Al darle inicio al proceso el controlador hará que la curva real de temperatura se parezca lo mas posible a la ideal.


Generación de la señal “e”

Esta señal es la mas simple de generar, ya que es el soft de PC quien hace la diferencia entre la señal de referencia “r” y la señal de salida “y” obteniendo la señal de error “e” (positiva o negativa).
Se puede ver gráficamente como la distancia entre la curva de ajuste y la de salida.


Generación de la señal “u”

Esta señal también es relativamente fácil de lograr, ya que es el resultado de aplicar la fórmula general de controladores PID con los datos medidos y los de las constantes.
Como utilizarla con sus integrales y derivadas puede ser un poco molesto a la hora de hacer el soft en VisualBasic, opté por hacer los cálculos referidos a diferenciales de tiempo “finitos”, por ejemplo:
Para la Kp no hay problema es simplemente (Kp x error)
Pero para Ki lo que hago es una sucesión de sumatorias de valores en cada diferencial de tiempo dado por el tiempo entre muestras.
Para Kd en lugar de calcular derivadas (algo un tanto complejo en una curva con datos reales que no se ajustan a ninguna formula exacta), lo que hago es tomar el valor de la muestra inmediata anterior y la muestra actual, al estar separadas por un tiempo conocido puedo conocer la pendiente de la tangente a la curva en ese punto.

De esta forma tengo un modelo equivalente a la fórmula original, pero fácil de programar mediante un algoritmo.

Tanto el efecto integral como el proporcional actúan dentro de una “ventana” programable (individuales), de esta forma se puede hacer que comience a integrar y/o diferenciar solo cuando se aproxima al valor de referencia.

Esta señal “u” que incluye los efectos P,I y D es enviada al microcontrolador, quien la transforma en su equivalente en ancho de pulso y polaridad para mover el motor.

Diseño de la placa.


Para esto primero pasé el circuito armado en protoboard a un esquemático en EAGLE, aprovechando para agregar algunas cosas más, como por ejemplo:

- Doble fuente regulada de 5V, para que la etapa de potencia (motor y rele) no interfiera con las sensibles entradas analógicas (utilizo los 5v regulados como voltaje de referencia de los conversores A/D).

- Salida por rele, para encender/apagar cualquier elemento externo.

- 3 entradas analógicas con alimentación de 5v, para conectar directamente potenciómetros, LM35 y otros dispositivos de 3 patas.

- Un conversor D/A discreto, formado por resistencias para entregar por una bornera de salida un voltaje entre 0 y 200mV con resolución de 8 bit.

Además de lo que ya estaba en el protoboard:

- Entrada para encoder, para la referencia manual.

- Comunicación con la PC por RS232.

- Conector para el módulo motor/encoder o similar.

- Microcontrolador PIC 18F452


Todo esto se puede observar en la siguiente figura:

Una vez terminado el esquemático paso al acomodamiento de los componentes en el impreso y el ruteo de las pistas, quedando de la siguiente forma:

Diseño del soft

Para lograr un mayor desempeño del PIC lo programé en assembler por ser el lenguaje de mas bajo nivel y por lo tanto el mas cercano a la electrónica, en cambio el soft de PC lo programé en VisualBasic por ser un lenguaje de alto nivel y por lo tanto mas cercano al humano, permitiéndome lograr una interfaz gráfica de fácil comprensión para el estudiante y el usuario del equipo.

El soft de PC consta de una pantalla formada por un eje horizontal que representa el tiempo y un eje vertical donde se muestran las señales “r” e “y”, el eje horizontal tiene graficadas 40 divisiones y el vertical 20, la resolución vertical por defecto es de 1500 puntos, pero como el dato de posición que la placa envía a la PC es de 2 bytes la resolución máxima vertical se puede llevar hasta 65000 puntos aproximadamente.

Actualmente en la parte inferior de la pantalla están:

- Las casillas donde aparecen los datos de las señales de salida “y”, “u”, de error “e” y de error integral.
- Los botones para generar las señales de Escalón, Rampa y control Manual.
- La casilla para setear la unidad de tiempo.
- Las casillas para setear las ventanas de actuación del efecto integral y diferencial.
- Las casillas para setear las constantes Kp,Ki y Kd.

En futuras versiones se irán agregando nuevas funciones y controles para lograr distintos estudios específicos. También quedarán los códigos fuente del PIC y de la PC disponibles para que quien quiera pueda mejorar el sistema y agregar comandos nuevos.


Ejemplos de mediciones:

Usando únicamente la acción proporcional con distintas constantes, podemos ver figuras como las siguientes:

En estos casos se observa que la posición final del motor (color blanco) no alcanza nunca a la posición de referencia (color rojo).

Para alcanzar el valor de referencia podemos agregarle algo de control integral como se ve en las siguientes figuras:

En estos casos vemos como el efecto integral hace que la posición del motor exceda el valor de referencia y vuelva en sentido contrario en forma de oscilación amortiguada.

En la ultima imagen vemos que aumentando el efecto integral, el sistema se vuelve inestable, para evitar esto le agregamos algo de efecto diferencial, como se ve en la siguiente figura:

En estos casos se ve como se alcanza el valor de referencia casi en el mismo tiempo, pero se evita el descontrol generado por el efecto integral, haciendo que el valor final tienda al de referencia.

Descargar ASM .................Descargar SOFT DE PC

Descargar PCB (BRD) ...........Descargar esquematico