Hola a todos.
Amigos tengo un proyecto para una materia y me gustaria que me ayudaran, pero la verdad es que no quiero nada hecho, lo que deseo es que me ayuden a hacerlo paso a paso, uds me guian y yo lo hago, quiza algunas cosas ya esten hechas, pero si no hago las cosas no aprendo y esa es mi mas grande ilusion.
Objetivo: Crear un control PID digital usando pic16f877a para controlar la temperatura de un horno.
Datos: La planta sera un cajon de madera y en su interior estara una bombilla de 60W la cual hara las veces de calefactor, esta bombilla se controlara usando pwm, el cual con la ayuda de un circuito adicional controlara la intensidad luminica de la bombilla y a su vez el calor generado. Para sensar la temperatura se usara un LM35 el cual da 10mV/ºC
Nota: Ire editando este post a medida como vaya realizando nuevas cosas y recibiendo sugerencias y correcciones de su parte.
PASO 1: * Armamos el circuito sensor usando el LM35, probamos de que sense bien la temperatura y lo introducimos en nuestra caja de madera, previamente elaborada; hay que tener en cuenta de que la caja quede bien sellada una vez se cierre, o habra problemas al momento de controlar y sensar la temperatura.
PASO 2: * Graficamos los datos y hallamos la ecuacion caracteristica de la planta, esta ecuacion es distinta para cada planta, podemos usar un cicruito/programa sensor de temperatura que nos ayude a tomar los datos de la temperatura cada cierto intervalo de tiempo.... o ..... usamos lapiz, papel y cronometro para hacer todo manual... yo lo hare manual.
-- Con estos datos pasamos a elaborar la grafica, manualmente, usando excel o usando matlab, como aqui lo que queremos es aprender, pues usaremos matlab, para eso ingresamos los datos en matlab en forma de dos matrices (tiempo/temperatura) y que nos la grafique.
Codigo para graficar los datos (esto es un ejemplo, los datos reales son demasiados):
clc;
tiempo[0 1 2 3 4 5 6 7 8 9 10];
temperatura[25 25 26 27 28 29 30 30 31 31 31];
plot(tiempo,temperatura)Listo ahora tenemos graficada la respuesta de la planta ante una entrada escalon unitario.
Lo siguiente lo pueden hacer como lo explico a continuacion o como lo explica blackcat en un post mas adelante, los dos metodos son validos, ya cada quien escogera.Para hallar la ecuacion, nos vamos a matlab (donde esta el workspace), alli veremos un boton que dice START (con el logo de matlab), pulsamos ese boton, luego click en toolboxes, luego en curve fitting y por ultimo en curve fitting tool: (figura 1)

Figura 1
Se nos abrira una ventana nueva y alli daremos click en el boton Data... en la ventana que se abrio en X data ponemos la variable tiempo y en Y data la variable temperatura (o sus los nombres que uds les tengan asignados) .. si no les aparece nada es por que tienen que haber corrido su codigo de graficacion de sus datos reales para que las variables del tiempo y temperatura aparezcan en el workspace...
luego daremos click en Create date set. y click en close (figura 2)

Figura 2
La grafica mostrada sera muy similar a la de su figure 1, pero en forma de puntos, lo cual no es ningun problema, por que ahora vamos a hallar nuestra ecuacion, para eso hacemos lo siguiente:
click en el boton fitting, luego en new fit .... aqui es donde les voy a recomendar algo a titulo personal...
Recomendacion: traten de la ecuacion quede en terminos de eulers y no en forma de polinomio, ya que si es asi todos los polos les quedaran en el mismo lugar (en cero) y no es muy buena idea para los calculos, pero en fin ya sabran uds como hacerlo...
Vamos a modificar unicamente donde dice Tye of fitt. ahi podran ver todo el tipo de ecuaciones con las cuales se puede representar nuestra curva caracteristica de la planta... si siguen mi recomendacion entonces buscar donde dice exponential y escogemos el tipo de ecuacion ( a*exp(bx) + c*exp(dx) ) y hacemos click en apply... luego de eso nos aparecera nuestra ecuacion (la que nos describe nuestros datos) ... si tienen dudas de que valores para las constantes escoger, escojan los promedios, osea los valores que estan fuera de los parentesis ... (figura 3)

Figura 3
Ahora damos click en close y confirmamos que la ecuacion reproduce lo mas fielmente posible la grafica de nuestros datos si es asi ya tienemos nuestro y(t) = a*exp(bt) + c*exp(dt) y tambien los valores de las constantes... y si no s asi buscamos la que mejor lo haga.. pero estoy un 90% seguro de que la funcion exponential lo hara de maravilla.
Por lo tanto obtenemos una ecuacion y(t) = a*exp(b*t) + c*exp(d*t) aplicando laplace obtenemos:
32.98 s + 0.06097
Y(S) = ----------------------------
s^2 + 0.00141 s - 9.773e-009
Para mi caso ... a uds les dara una ecuacion similar .. matlab tambien lo hace usando el codigo
syms t
a = 42.98;
b = -6.9x10^-6;
c = -10.15;
d = 0.001417;
yt = a*exp(b*t) + c*exp(d*t)
YS = laplace (yt)pero la verdad es que se ve muy raro y desordenado, asi que recomiendo lapiz y papel que hacerlo no es dificil y ademas sale directo, luego se aplica un poco de algebra, se reemplazan valores y listo.
Ahora sabemos que dentro de Y(S) tenemos implicito nuestra entrada escalon unitario, po lo tanto nuestra G(S) sera:
32.93 s^2 + 0.06097 s
G(S) = ----------------------------
s^2 + 0.00141 s - 9.773e-009
Ahora tenemos que determinar el tiempo de muestreo (T) para eso podemos usar el metodo que describe blackcat mas adelante o podemos asumirlo, ya cada quien decidira, por mi parte lo sumire como T=0.1
Pasamos a la parte en que tenemos que aplicar la transformada Z para poder discretizar nuestro G(S) y obtener nuestro G(Z) .. pero recuerden que G(Z) no es igual a la transformada Z de G(S) si no que lleva incorporado un retenedor de un orden cualquiera, para este caso usaremos uno de orden cero... y lo llamaremos Bo(S) asi que:
G(Z) = Z/ Bo(S) G(S) donde Z/ sera la tranformada Z de todo eso... bueno para los amantes del lapiz y papel, podeis hacerlo, por que por mi parte no lo voy a hacer, para eso voy a usar matlab y el siguiente codigo.
n1=32.98;
n2=0.06097;
d1=1;
d2=0.0014101;
d3=-(9.773/1000000000);
GS=tf( [n1 n2 0], [d1 d2 d3])
T=0.1;
GZ=C2D(GS,T,'zoh')donde zoh indica a matlab que se va a usar un retenedor de orden cero. osea nuestro Bo(S)
y el resultado que nos entrega matlab sera el siguiente:
3.293 z - 3.292
G(Z) = ------------------
z^2 - 2 z + 0.9999
Sampling time: 0.1
Bueno hasta aqui todos deberiamos llevar algo similar, ahora es donde yo me he decidido por hacer un controlar por el metodo de ragazzini .. asi que por ahi es donde lo haremos....
lo primero es hallar los polos deseados teniendo en cuenta las siguientes condiciones de lazo cerrado.
essp = 0 ; Test 5% = 10 seg ; T = 0.1 ; Zcita = 0.5
usando formulas ya conocidas en nuestros estudios realizados obtenemos los dos polos deseados Z(1,2):
Z(1,2) = 0.9691 +/- j 0.0504 lo cual llamaremos (alfa +/- j beta) para comodidad
El metodo ragazzini nos dice que:
F(Z) = K / P(Z)
ahora P(Z) = (Z - Z1) (Z - Z2) como ya sabemos los valores de Z1 y Z2 entonces reemplazamos... pero podemos hacer algo mejor y es reemplazar por las letras y despejar para que nos quede algo asi:
P(Z) = Z^2 - 2 alfa Z + (alfa^2 + beta^2) ahora se reemplazan los valores y listo.
para que ragazzini funcione se dice que F(1) = 1 .. lo cual es de gran ayuda.. sabemos por formula que:
F(Z) = K / P(Z) --- reemplazamos P(Z) y nos quedara asi:
F(Z) = K / Z^2 - 1.9382 Z + 0.94169 --- hacemos F(1) = 1 --- quedando: 1 = K / 1^2 - 1.9382 + 0.94169 -- despejando K
K = 0.00349 ahora pasamos a la parte interesante...
D(Z) = [ 1/G(Z) ] [ F(Z) / 1 - F(Z) ]
pero como todo se puede simplificar entonces lo hacemos.
D(Z) = [ 1 / G(Z) ] [ K / P(Z) - K ]
como ya conocemos todas las variables y ecuaciones, simplemente hallamos D(Z)
D(Z) = [ 0.001058Z^2 - 0.002116Z + 0.001058 ] / [ Z^3 - 2.93769Z^2 - 0.9379 ]
Bueno la parte final es hallar la ley de control, para eso cambiamos D(Z) por u(Z)/ e(Z) y multiplicamos al otro lado por Z^-3 / Z^-3
quedandomos asi:
u(Z) 0.001058Z^-1 - 0.002116Z^-2 + 0.001058Z^-3
----- = ---------------------------------------------------------
e(z) 1 - 2.93769Z^-1 + 0.9382Z^-2 - 0.9379Z^-3
ahora el denominador pasa a multimplicar a u(Z) y e(Z) a multiplicar al numerador. luego de lo cual despejamos u(Z) y de paso usamos una un teorema que dice en resumen que u(Z)Z^-1 = u(Z-1) .. lo mismo con e(Z) .... ahora cambiamos Z por k quedando finalmente la ley de control asi:
u(k) = 0.001058 e(k-1) - 0.002116 e(k-2) + 0.001058 e(k-3) + 2.93769 u(k-1) - 0.9382 u(k-2) + 0.9379 u(k-3)
esta ley de control u(k) es la que programamos para poder controlar nuestro sistema
SE EDITARA A MEDIDA QUE SE AGREGUEN NUEVAS COSAS....