PID Inverso JJAC

December 18, 2017 | Author: Jorge Eduardo Gallardo Sanchez | Category: Arduino, Systems Engineering, Cybernetics, Applied Mathematics, Control Engineering
Share Embed Donate


Short Description

Descripción: Obtención de la función de transferencia de un sistema térmico, a partir del sistema ya construido, ademas ...

Description

PID de enfriamiento con Arduino. Autor: J.J. Antolín Cuadrado PID de enfriamiento con Arduino En este artículo se pretende mostrar una forma de obtener la planta de un sistema con la herramienta “ident” para luego diseñar un controlador con la herramienta “rltool” de Matlab. Nuestro sistema es un envase de plástico en el que en el fondo se colocan una serie de resistencias formando un total de 11homios y alimentado constantemente con 12v, esto da una potencia de 13W. En medio de estas resistencias se coloca una NTC de 10k para sensar la temperatura, y en la parte superior del envase se coloca un ventilador para extraer el calor del interior. El aspecto es el siguiente:

Para obtener la función de transferencia de esta planta usaremos la herramienta “ident” de Matlab. Necesitamos un vector de valores de entrada, un intervalo de tiempo entre medidas, y un vector de salida. Para ello alimentamos las resistencias con 12v, esperamos que la temperatura se estabilice, ponemos 6v al ventilador, y empezamos a medir el voltaje en el divisor formado con la NTC cada cinco segundos, el divisor es el siguiente:

PID de enfriamiento con Arduino. Autor: J.J. Antolín Cuadrado En mi caso he obtenido estos valores: temperatura=[4.88 4.87 4.85 4.82 4.78 4.74 4.69 4.64 4.58 4.53 4.47 4.41 4.36 4.31 4.26 4.21 4.17 4.14 4.10 4.07 4.04 4.01 3.99 3.96 3.94 3.93 3.91 3.89 3.88 3.87 3.86 3.85 3.83 3.83 3.82 3.82 3.81 3.80 3.79 3.79 3.78 3.78 3.77 3.77 3.76 3.76 3.76 3.76 3.76 3.75 3.75 3.75 3.74 3.74 3.74 3.74 3.74 3.74 3.73 3.73 3.73 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72];

En total son 71 valores tomados cada 5 segundos, entonces en matlab ponemos para el vector de tiempo: tiempo=[0:5:350];

El otro vector que nos falta, el de entrada, serán los 6v que hemos aplicado al ventilador. El ventilador será controlado posteriormente por un PWM del Arduino con un valor máximo de 256 (de 0 a 255), entonces puesto que 6v es la mitad de 12v, el valor de entrada será 128, para implementar esto en Matlab se hace lo siguiente: %array de entrada. Son 6v del ventilador (mitad del PWM = 256/2 = 128). for i=1:length(tiempo) entrada(i)=128; end entrada

Con todos estos datos podemos ver el aspecto de la respuesta en el tiempo para comprobar que los valores son coherentes, para ello ejecutamos estas líneas en la consola de Matlab: clc; clear; %vector tiempo tiempo=[0:5:350]; %array de entrada. Son 6v del ventilador (mitad del PWM = 256/2 = 128). for i=1:length(tiempo) entrada(i)=128; end entrada %vector temperatura %son 5v voltios de un divisor, ntc 10k al positivo, 10k a masa. %medido en la de 10k a masa. temperatura=[4.88 4.87 4.85 4.82 4.78 4.74 4.69 4.64 4.58 4.53 4.47 4.41 4.36 4.31 4.26 4.21 4.17 4.14 4.10 4.07 4.04 4.01 3.99 3.96 3.94 3.93 3.91 3.89 3.88 3.87 3.86 3.85 3.83 3.83 3.82 3.82 3.81 3.80 3.79 3.79 3.78 3.78 3.77 3.77 3.76 3.76 3.76 3.76 3.76 3.75 3.75 3.75 3.74 3.74 3.74 3.74 3.74 3.74 3.73 3.73 3.73 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72 3.72]; plot(tiempo,temperatura) %en eje x tiempo. Eje y voltios o temperatura.

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

Y tendremos que obtener una gráfica parecida a esto:

Ahora ejecutamos la herramienta ident desde la consola de Matlab poniendo: ident Se abre la aplicación y hacemos lo siguiente:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

Ahora desde la consola podemos poner P1 y ver nuestra función de transferencia de la planta: >> P1 P1 = Process model with transfer function: Kp G(s) = ---------1+Tp1*s Kp = 0.028766 Tp1 = 79.767 Parameterization: 'P1' Number of free coefficients: 2 Use "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using PROCEST on time domain data "mydata". Fit to estimation data: 89.49% (prediction focus) FPE: 0.001494, MSE: 0.001397

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado Podemos ver la respuesta al escalón de nuestra planta: step(P1)

Como se puede observar no llega al máximo valor (1) y el tiempo de estabilización es muy alto (500 seg). El siguiente paso es arreglar esto con la herramienta “rltool”,, para ello escribimos en la consola: rltool(P1)

Y nos aparece el lugar de las raíces de nuestra planta:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado Seguimos estos pasos:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado Podemos observar que al incluir el controlador PID tanto la respuesta al escalón como el lugar de las raíces han cambiado:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado El siguiente paso es mover el cero en rojo, y los cuadraditos rosas hasta obtener la respuesta respue deseada en la gráfica de respuesta al escalón. En mi caso lo ajustaré para un sobre impulso del 15% y un tiempo de asentamiento de unos 60 segundos. Podemos poner marcadores sobre la gráfica con botón derecho  Characteristics  peak response. Y botón derecho  Characteristics  Setting time:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

Una vez ajustado exportamos el controlador a la consola:

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado

Si desde la consola escribimos: C Vemos nuestro controlador:

>> C C= 331.0205 (s+0.06521) ----------------------------s Continuous-time zero/pole/gain model.

Para obtener las constantes Kp, Ki y Kd, tenemos que comparar con un controlador típico PID:

Kd S^2 + Kp S + Ki --------------------------------------------S nuestras constantes serán: Kd = 0; Kp = 331.0205; Ki = 331.0205*0.06521 = 21.56;

PID de enfriamiento con Arduino. Arduino Autor: J.J. Antolín Cuadrado Podemos comprobar nuestro sistema completo: f=feedback(P1*C,1) step(f)

Ahora queda codificar el programa para el microcontrolador, microcontrolador, en mi caso un Arduino, el código está adjunto. Cabe destacar que al ser un sistema inverso, cuando la temperatura aumenta tenemos que aumentar las revoluciones del ventilador, al contrario de un control de un horno por ejemplo en el que al aumentar aumentar la temperatura hay que bajar el PWM para que disminuya la temperatura, la salida se hace así: //Actualizo salida analogWrite(9,255-(int)Output);

Espero que os sirva!!!

PID de enfriamiento con Arduino. Autor: J.J. Antolín Cuadrado

Referencias: http://real2electronics.blogspot.com.es/2011/07/maqueta-de-control-pid-con-arduino.html http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ http://brettbeauregard.com/blog/wp-content/uploads/2012/07/Gu%C3%ADa-de-uso-PIDpara-Arduino.pdf http://www.todopic.com.ar/foros/index.php?topic=24599.80

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF