Ene 122017
 
19. Control PID en PIC Ejemplo 2
5 (100%) 4 votes

En esta entrada veremos un segundo ejemplo de un controlador PID implementado en un microcontrolador PIC. Para esta entrada veremos el funcionamiento de este algoritmo aplicado sobre un proceso real. Recuerda que ya habíamos visto un primer ejemplo totalmente detallado de la implementación de un PID, si todavía no lo has visto da CLIC ACA para ir a la entrada del control PID PIC para un horno, pues usaremos casi que el mismo código que fue explicado en esa entrada.

 

El proceso escogido a ser controlado es conocido como un Motor-Generador y es mostrado en la siguiente fotografía:

Motor-Generador

El funcionamiento del proceso es el siguiente: Este proceso consta de dos motores los cuales están acoplados en sus ejes por medio de poleas. Uno de estos motores funciona propiamente como motor, entonces cuando dicho motor es excitado con un voltaje de alimentación comienza a girar a una velocidad proporcional al voltaje de entrada, el giro del motor hace que el eje del segundo motor (Conocido como generador) comience a girar debido al acople entre ejes. Cuando el eje del generador está en movimiento, este comienza a generar voltaje directo el cual puede ser tomado de los dos terminales del motor.

 

Aquí tenemos un sistema a ser Controlado, como variable manipulada tendremos el Voltaje de Entrada del Motor y como variable controlada tendremos el Voltaje generado por el Generador.

 

Adicionalmente puede ser observado en la fotografía, que el sistema cuenta con dos bombillos que simularan la carga del sistema, esto seria la perturbación que constantemente afectan los sistemas de control. Nuestro control debe ser lo suficientemente robusto para rechazar esas perturbaciones y llevar la variable controlada de nuevo para el Set-Point.

 

El circuito básico de este proceso MOTOR-GENERADOR puede ser descargado en el siguiente archivo de Word dando CLIC ACA.

 

Para este ejemplo inicialmente debemos obtener el modelo matemático del proceso (Identificar la planta) y posteriormente con la función de transferencia identificada haremos el controlador PID. Estos fueron los mismos pasos que utilizamos en la entrada anterior del PID del horno.

 

Identificación del Proceso

Mostraré un procedimiento para realizar la identificación del proceso, pero aquí les dejaré su primera tarea. Lo ideal es que lo siguiente que vamos a ver ustedes lo implementen con una comunicación serial (Click aca para ver entrada de comunicación serial), enviando los datos al computador para poder obtener la curva de reacción del proceso y posteriormente obtener la función de transferencia.

 

Como en este momento no poseo un FT232 para poder comunicar el PIC con mi Computador, decidí por hacer una identificación un poco más manual, utilizando un LCD 4×20. El circuito para realizar la identificación es el siguiente:

PID con PIC

NOTA:

En este circuito se aplica lo aprendido en la entrada del Teclado Matricial 4×4 y como se está utilizando un LCD4x20, ya habíamos visto que el compilador CCS C Compiler ya trae lista la librería para trabajar con este teclado, pero solo está lista para trabajarla conectandola al PUERTO B, por eso en el video de la identificación de Youtube, se muestra como hacer la modificación de la libreria para que trabaje con el PUERTO D.

 

 

La idea de una identificación del proceso consiste en lo siguiente:

Tenemos nuestro proceso MOTOR-GENERADOR, el cual no tenemos idea de cual puede ser su representación matemática para poder sintonizar nuestro controlador PID, pero la idea entonces es obtener ese modelo.

Aquí estamos recayendo sobre la teoría de Control Lineal, por eso estamos obteniendo una Función de Transferencia en el dominio de Laplace.

 

Todos los procesos en la industria y en la vida real en si, son procesos NO LINEALES, recayendo entonces en la teoría no lineal que es mucho mas compleja. Ahora, dado que en la industria en la mayoría de los casos, los procesos siempre están trabajando sombre un punto de operación (Un mismo setpoint) y raramente son movidos para otro punto de operación, podemos aproximar ese proceso no lineal en un modelo Lineal por medio de una función de transferencia.

 

Entonces lo que haremos es exitar el sistema con un set-point o un escalón del mismo valor a nuestro punto de operación, para este ejemplo yo exité el sistema con un escalón del 40%, colocando entonces un PWM en la salida del CCP1 un ancho de pulso proporcional al 40% (Ver entrada del PWM con PIC). Adicionalmente establezco el tiempo de muestreo que quiero tomar datos del MOTOR-GENERADOR (Dado que este sistema es sumamente Rápido, coloque un periodo de muestreo de 10mS). De esa manera el PIC exita el motor por causa de los 40% del PWM y comienza a guardar los valores de voltaje generados por el generador cada 10mS. Estos datos los guarda en un vector de 45 posiciones. Una vez las 45 posiciones son llenadas, el PIC coloca el PWM en Cero y muestra todos los datos en la pantalla del LCD. Este código de identificación se encuentra al Final de este Post o también en el Video de Youtube, donde se explica en detalle.

 

Como la Planta MOTOR-GENERADOR solo acepta en su entrada voltaje de 0 a 5 voltios, y nosotros estamos generando un PWM, es necesario transformar ese PWM en un valor de voltaje continuo que dependa del ancho de pulso. Para eso se implementa el siguiente filtro pasa bajos que hace esa función.

Filtro Pasa Bajos

 

Los datos de voltaje mostrados en el LCD, los copie en un archivo de excel junto con los datos de tiempo (periodo de muestreo) y los datos de entrada o escalón (que son los 40%). Estos datos los muestro tanto en Voltaje como en Porcentaje. (Click aca para bajar el archivo en Excel)

 

La respuesta obtenida en porcentaje se muestra a continuación:

Identificacion del Motor-Generador

Tipicamente, todo proceso industrial es representado por funciones de transferencia de primer o segundo orden. A continuación es expuesto un modelo de primero orden sobre el cual vamos a trabajar para poder modelar el comportamiento de nuestra planta.

P(s)=\dfrac{Ke^{-\theta s}}{\tau s +1}

El modelo está representado en su forma continua, es decir en el dominio de Laplace. donde K es la ganancia del sistema, \tau es la constante de tiempo del proceso y \theta es el retardo del proceso.

Vemos que la gráfica el voltaje generado (linea azul) comienza en 0% y llega hasta 32% y que para conseguir esta respuesta tuvimos que alimentar el motor con una exitación del 40% (linea naranja). Así podemos obtener la ganancia del proceso con la siguiente formula:

K=\dfrac{Y_{final}-Y_{inicial}}{U_{final}-U_{inicial}}

K=\dfrac{32-0}{40-0}=0.8

Notemos que el voltaje generado (linea zul), al comienzo ella se demora en comenzar a subir, ese tiempo que ella se queda en cero, es conocido como el retardo del sistema y en este caso equivale a 0,03 segundos o 30mS

\theta=30

Observemos que el voltaje generado en la gráfica, se comienza a estabilizar mas o menos a los 0.26 segundos, pero debemos restarle los 0,03 segundos del retardo, entonces el tiempo de establecimiento seria 0,23 segundos, así podemos obtener la constante de tiempo de la variable temperatura con la siguiente formula:

T_{establecimieto}=4\tau

Osea que el \tau=57,5.

 

Así que en términos generales, nuestro proceso del MOTOR-GENERADOR está representado por la siguiente función de transferencia:

P(s)=\dfrac{0,8e^{-30 s}}{57,5 s +1}

Con nuestro proceso identificado podemos calcular los parámetros del controlador (k_p,t_i,t_d), para eso utilizamos cualquiera de las tres técnicas vistas en la entrada el PID del horno.

Si te está sirviendo de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




Algoritmo del PID

PID sintonia

Una ves tenemos nuestro modelo matemático que representa nuestro proceso MOTOR-GENERADOR en el escalón del 40%, podremos calcular nuestro control PID para que controle adecuadamente el proceso en ese punto de operación.

 

 

Para este caso PARTICULAR de mi MOTOR-GENERADOR, es un proceso de muy baja NO LINEALIDAD, es decir que tiene un comportamiento casi lineal, entonces voy a poder controlar con facilidad el proceso en cualquier punto de operación diferente a el 40%. Esto en la mayoría de los procesos NO sucede.

 

Utiliza el control discreto PID que vimos en la entrada pasada  dado por:

C(z^{-1})=\dfrac{u(k)}{e(k)}=\dfrac{q_0+q_1z^{-1}+q_2z^{-2}}{1-z^{-1}}

donde:

q_0=k_p\left [ 1+\dfrac{T}{2t_i}+\dfrac{t_d}{T} \right ] q_1=-k_p\left [ 1-\dfrac{T}{2t_i}+\dfrac{2t_d}{T} \right ] q_2=\dfrac{k_pt_d}{T}

Con esto, la ley de control que vamos a ingresar a nuestro PIC sale del control PID discreto (Despejando u)

u(k)(1-z^{-1})=q_0e(k)+q_1z^{-1}e(k)+q_2z^{-2}e(k)

u(k)-u(k)z^{-1}=q_0e(k)+q_1z^{-1}e(k)+q_2z^{-2}e(k)

u(k)=u(k)z^{-1}+q_0e(k)+q_1z^{-1}e(k)+q_2z^{-2}e(k)

aplicando transformada inversa Z obtenemos la ecuacion en diferencias:

u(k)=u(k-1)+q_0e(k)+q_1e(k-1)+q_2e(k-2)

Como tiempo de muestreo para el control PID utilizamos el criterio:

T=\dfrac{\tau}{20}=\dfrac{57,5}{20}=2,87\approx 3mS

NOTA

Como vemos el tiempo de muestreo debe ser de 3mS, o sea que realmente debe ser rápido nuestro microcontrolador para poder alcanzar tal velocidad, para ello por la alta velocidad lo más recomendable es usar un cristal externo de 20.000Mhz. En mi caso personal, no cuento con este cristal, entonces voy a tener que implementarlo con un cristal de 4.000Mhz, por lo que no voy a poder cumplir el criterio del tiempo de muestreo. Esto me puede traer serios problemas de estabilidad, pero al hacer las pruebas, mi periodo de muestreo alcanzado fue de 11mS y el sistema consiguió responder adecuadamente, principalmente porque todavía es 5 veces menor que  la constante de tiempo. Si se hubieran presentado problemas de estabilidad por causa que no puedo respetar el periodo de muestreo, lo que hubiera hecho es ponderar un poco el error del controlador PID, es decir multiplicar el error por valores entre (0 – 1).

 

Código de Implementación:

A continuación se presenta el código para que lo copies y lo pegues en tu compilador y puedas reproducirlo. Recuerda que para ver el código debes compartir el contenido de este blog para que más personas se beneficien de esta información.

> Descargar los Archivos de PICC y PROTEUS 8 (Click aca) <<<

Descargar librería del LCD4x20 para puertoD: LCD420D.C

Código de la Identificación

 

Código del Control PID para MOTOR-GENERADOR

 

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




  13 Responses to “19. Control PID en PIC Ejemplo 2”

  1. Hola Sergio
    Felicitaciones por el excelente trabajo y explicación, quisiera pedirle el favor de darme unas pautas de como migrarlo su programa al pic 16F877A,es posible?, Ya que en el la ciudad donde vivo solo encontré este pic
    he estado viendo todos sus vídeos y aun no puedo lograr dominarlo bien el compilador PIC C (CCS Compiler) soy nuevo en esto de microcontroladores

    • Solo necesitas cambiar el encabezado y agregar la libreria del 16f877a, esos dos pics son identicos
      #INCLUDE <16F877a.h>

      • Gracias por responderme lo hare y ya te cuento

      • Hola Sergio:
        disculpe que le moleste de nuevo, cambie el encabezado como me indico pero ahora no compila me sale este error
        >>>Warning 208 “PID Contro.c” line 103(6,13):Function not void and does not return a value escalon

        *** error 12 “PID Contro.c” line 14(20,24) Undefined identifier sANO
        Es mismo codigo de Ud, solo lo cambie el encabezado

  2. Hola ¿como estas?, excelente trabajo, ha sido de mucha ayuda para un proyecto que estoy realizando, tengo una pregunta ¿como puedo obtener la función de transferencia de un motorreductor que compro en el mercado ?.

    • Es basicamente hacer lo mismo visto en el ejemplo. Debes tener un sensor que esté midiendo tu variable de interes, aplicar un escalón, tomar los datos, graficar la respuesta y obtener la FT. Más adelate, cuando tenga algo de tiempo, comenzaré a explicar temas de identificación de sistemas. Suerte con tu proyecto.

  3. Hola 🙂
    Como estas?
    Espero que bien.
    Sabes son nuevo en esto y por fin encontré a alguien que explicara bien, te felicito.
    Ya baje los programas en C y el proyecto en proteus para hacer algunos ejercicios.
    Pero que crees?
    Cuando compilo el programa, SE QUEDA TRABADO ….. TENGO QUE ABORTARLO
    Lo intenté con ambos programas y pasa lo mismo.
    Compile unos programas que he hecho, y no se traba.
    Que podrá ser?
    GRACIAS…

    • Hola Oscar. no entendi muy bien tu pregunta. El compilador se esta quedando trabado cuando compilas mis códigos? No se a que pueda deberse. Intenta ejecutar el compilador como administrador o utilizar otro equipo para ir descartando problemas. Pero una excelente noticia es que SI compilan tus códigos y el objetivo del blog es dar una inducción y que realmente uds hagan sus propios códigos para que realmente aprendan. Saludos y muchos éxitos en tus proyectos.

  4. Sergio excelente proyecto mas aun tu excelente explicación la verdad no savia como sacar los datos iniciales de una proceso físico , gracias.

    en manera de lo posible me gustaría me mandaras el plano del tarjeta que utilizas, lo pienso realizar físico.

    de antemano muchas gracias.

    Att: emerson palacio
    correo: seagan_84@hotmail.com

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

(required)

(required)