Está en la página 1de 11

PID Digital (paso a paso)

en: 27 de Enero de 2009, 21:48:20


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


comodidad

lo cual llamaremos (alfa +/- j beta) para

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

También podría gustarte