(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