TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: krakc en 27 de Enero de 2009, 21:48:20

Título: PID Digital (paso a paso)
Publicado por: krakc 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)

(http://img19.imageshack.us/img19/1746/piddigitalf1yy2.th.jpg) (http://img19.imageshack.us/my.php?image=piddigitalf1yy2.jpg)
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)

(http://img209.imageshack.us/img209/7956/piddigitalf2jn7.th.jpg) (http://img209.imageshack.us/my.php?image=piddigitalf2jn7.jpg)
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)

(http://img187.imageshack.us/img187/1171/piddigitalf3ig7.th.jpg) (http://img187.imageshack.us/my.php?image=piddigitalf3ig7.jpg)
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....



Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 27 de Enero de 2009, 23:21:35
Hola ...

Para poder estimar un sistema con matlab se utiliza la herramienta IDENT .. esta es muy facil de usar, lo que se necesita es lo siguiente:

-> un vector de entradas (x) ... la señal de estimulo que aplicaste al sistema
-> un vector de salidas (y) ... la señal de respuesta que obtuviste del sistema al aplicar la señal de entrada
-> un vector de tiempo (t) ... los tiempos de cada muestra, deben ser constantes, es decir, 1, 2, 3, 4 segundos etc ... y no 1, 1.5, 2, 3, 5, 8 .. etc..

Con eso IDENT identificará el sistema que se encuentra adentro.

(http://img218.imageshack.us/img218/551/sist1zd9.jpg)

Lo que necesitas es una señal de prende o apaga el bombillo .. o bien una señal de volaje RMS que le aplicas al bombillo, luego debes medir en tiempo real el comportamiento de la temperatura ante la señal. Un escalon como lo estas haciendo, es posible, sin embargo solo tenes el comportamiento de calentar y no de enfriar.

Para poner a prueba el IDENT me inventé un sistema tipico y muy facil de entender .. un filtro pasobajos RC de primer orden, representado en Laplace como:

\begin{equation}
G(s) = \frac{1}{1 + 0.001s}
\end{equation}

Es decir R = 1k y C = 1uF ... siendo tau = 1ms;


>> R = 1000
>> C = 1e-6
>> G = tf( 1, [R*C 1] )


Lo que voy hacer es inventar un vector de entradas, estimulare el sistema con esas entradas y utilizaré IDENT para identificar el sistema; lo ideal es que obtenga un resultado como en de la ecuacion anterior. En el caso practico, no conozco la ecuación del sistema, pero lo que se acostumbra es estimular el sistema con diferentes vectores de entrada y estimar varios modelos y comparar el resultado con los otros vectores.

Como mencioné, es necesario que tenga un vector de datos de entrada y ver la respuesta del sistema (salida) ante esa entrada, el mejor vector de entrada es aquel que tenga un buen contenido de frecuencia, ruido por ejemplo; sin embargo, dependiendo del sistema esto se complica, por ejemplo, en un motor; lo recomendable es estimar el modelo matemáticamente y ver que frecuencias son las aptas para crear una señal de estímulo; por ejemplo, el modelo de un motor es parecido a un filtro pasobajos, entonces utilizamos una señal que contenga componentes de frecuencia dentro del ancho de banda del motor.

Como en este caso, el ejemplo es simulado, utilizo la función RAND para generar un vector de entrada aleatorio de 100 muestras:

>> x = rand([100, 1])

(http://img220.imageshack.us/img220/5128/entradaxs3.jpg)

Esta es mi señal de entrada, ahora, necesito el vector de salida, estimularé el sistema con la función LSIM, entre los datos de esta funcion está el vector de tiempo. Aqui voy a utilizar tiempo discreto y elejiré que el tiempo de muestreo sea un décimo de la constante de tiempo del sistema (tau = RC); en este caso, ts = 0.1ms. Genero un vector de tiempo de 100 datos desde 0 hasta 99*0.1e-3.

>> n = (0:99)'
>> ts = 0.1e-3
>> t = n*ts


Ahora utilizo LSIM ....

>> y = lsim(G, x, t)

La grafica que obtengo en el tiempo es:

(http://img220.imageshack.us/img220/9757/salidaspr6.jpg)

donde la linea azul es la entrada y la linea verde es la salida, veran que esta filtrada.

Ya tengo listo mi vector de entrada, salida y tiempo; esto es lo que tendria en la practica, una señal de entrada, el comportamiento de la salida y el tiempo en que fue tomado cada dato.  En el caso de la temperatura, el vector de entrada seria pulsos rectangulares, que me dicen cuando se prendio el bombillo y cuando permanecio apagado; la salida seria el aumento de temperatura y la disminucion de temperatura, el tiempo seria cada cuanto tome la muestra, como es temperatura puede ser de 1 o 3seg, constantes y no interrumpidos ... en este caso, tomar los datos a reloj en mano no es conveniente.

Yo conozco el sistema; sin embargo, la idea es estimar el sistema en tiempo discreto utilizando el vector de entrada, salida y tiempo; luego transformar el sistema a tiempo continuo y comparar.

Ejecuto IDENT

>>ident

Y aparece una pantalla como la siguiente:

(http://img220.imageshack.us/img220/2124/ident1xz8.jpg)

Lo que hacemos es en IMPORT DATA seleccionamos TIME DOMAIN DATA ... esto porque nuestros datos de entrada, salida y tiempo estan en el tiempo. Aparece un cuadro como asi:

(http://img220.imageshack.us/img220/1276/ident2wy0.jpg)

Y lo lleno con la informacion que tengo, entrada (x), salida (y), tiempo de inicio (0), tiempo entre muestras (ts) como lo hice en la figura. Damos IMPORT ..

(http://img220.imageshack.us/img220/1257/iden3xn4.jpg)

En la columna de cuadros izquierda me aparece el bloque de datos que cargue en IDENT; ahi puedo cargar la cantidad de datos que desee y puedo combinar datos como de estimulo y verificacion, esto es que con un conjunto de datos puedo estimar el sistema y con otro conjunto puedo verificar si la estimacion está correcta.

Ahora, sobre ESTIMATE damos LINER PARAMETRIC MODELS ... aqui escogemos el método de estimación que mas nos guste o que mejor de resultados, sobre el tipo de estimador se puede encontrar información en internet:

http://www.ie.itcr.ac.cr/einteriano/control2/Laboratorio/3.Models.pdf (http://www.ie.itcr.ac.cr/einteriano/control2/Laboratorio/3.Models.pdf)

Yo elejí ARX tanto de orden 1 como de orden 2 ... entre mas orden es mejor la estimación; sin embargo, hay un compromiso, pues estimar un compensador para un sistema que tiene un orden alto es mas dificil que para uno bajo, entonces escogemos el modelo de menor orden. Seleccionando la casilla MODEL OUTPUT aparecerá una gráfica que nos dice cual modelo es el que mejor se ajusta a los datos de salida. Vemos que con el modelo de 1º orden tenemos un ajuste de 100.

(http://img294.imageshack.us/img294/4262/ident5kn6.jpg)

Ahora arrastramos el cuadro que dice ARX111 de la columna derecha sobre el cuadro TO WORKSPACE ... eso hara que los datos del modelo lo tengamos en la linea de comando. Para ver el modelo ejecutamos:

>> H = tf(arx111)
 
Transfer function from input "u1" to output "y1":
 0.09516
----------
z - 0.9048
 
Transfer function from input "v@y1" to output "y1":
1.665e-016 z
------------
 z - 0.9048
 
Input groups:           
      Name      Channels
    Measured       1   
     Noise         2   
                       
Sampling time: 0.0001


Entonces nuestro modelo estimado en tiempo discreto es:

\begin{equation}
G(z) = \frac{0.09516}{z - 0.9048}
\end{equation}

Usamos:

>> G2 = d2c(H)

y obtenemos:

\begin{equation}
G(s) = \frac{1000}{s + 1000}
\end{equation}

Vemos que IDENT identificó el sistema correctamente ...  Utilizando este modelo podemos usar SISOTOOL y calcular de manera sencilla un compensador  :)

Saludos y espero que les sirva de algo!

PD: Espero sus comentarios y estamos listos para la implementación PID en un PIC!
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 28 de Enero de 2009, 00:21:18
Bueno amigo me di a la tarea de buscar lo que no entendia y segun como voy armando las cosas paso a paso y encontre la primera pregunta y la segunda.

Lo que has escrito esta completisimo y muy interesante, que cosas las que sabes, hombre yo ni lo habia pensado asi, pues lo que queria era algo sencillo, pero eso seguro que servira, pero se necesita algo de tiempo para poder aprender a usarlo no es facil...

pero eso no seria usando un circuito para leer los datos y que matlab los interprete?????
si es asi a mi no me sirve jejeje pues yo tome los datos manualmente....


quisiera que veas lo que he hecho y veas que era lo que yo queria, haber si me entiendes:

****************
usando datos experimentales (no son los reales) se intrducen a matlab, luego se grafican, una vez graficados lo que se hace es usar BASIC FITTING hallamos la ecuacion de esa grafica y este es el resultado... (se puede ver la ecuacion que mas se asemeje o modele mas fielmente la grafica)

--- aclaro que la grafica de los datos reales de la planta seran muy similares a esta grafica, pero con mucho mas datos ---

(http://img149.imageshack.us/img149/8251/matlabgraficaecuacionqq7.th.jpg) (http://img149.imageshack.us/my.php?image=matlabgraficaecuacionqq7.jpg)



una vez teniendo esta ecuacion (la ecuacion de la grafica) se puede usar tf() para hallar la funcion de transferencia y empezar el pid matematicamente ??????''

Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 28 de Enero de 2009, 00:32:45
El detalle está en que estas estimando un modelo en el tiempo ante un escalon no podes usar TF asi por asi ya que TF crea el sistema deacuerdo a los coeficientes de la ecuacion diferencial ...

Podes hacer un tiempo de 10 segundos calentando (bombillo encendido), 5 seg enfriando (bombillo apagado), 3 segundos calentando, 5 enfriando. Notaras un comportamiento en la temperatura como de carga o descarga. Con esta secuencia e IDENT podes estimar un buen modelo.

Sin embargo, recuedo que unos compañeros estimaron un modelo termico similar a lo que estas haciendo, el siguiente PDF quiza te ayude:

http://www.ie.itcr.ac.cr/einteriano/control2/Clase2008/EjemploControldeunSistemaTermico.pdf (http://www.ie.itcr.ac.cr/einteriano/control2/Clase2008/EjemploControldeunSistemaTermico.pdf)

Saludos!
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 28 de Enero de 2009, 00:44:07
Gracias amigo, creo que voy entendiendo, pues lo que yo he hecho es como me lo han enseñado, no me han dicho nada de lo que tu me dices, pero lo hare y te dire como me va, lo mas seguro es que lo haga de mi forma y de tu forma...

por cierto el pdf esta completisimo, lo guarde y lo revisare mañana con mi compañero del pryecto y discutiremos los dos metodos.

revise rapidamente el pdf y me fije que el siguiente paso a seguir es analizar la grafica....

bueno mañana revisare mas cosas, por que esto si va en serio XD
Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 28 de Enero de 2009, 01:16:15
Bueno ... metodos hay muchos .. sin embargo, segun mi experiencia, el metodo que te explique es el que mejor resultados me ha dado, mi interes no se enfoca en solo los sistemas termicos sino en muchos como mecanicos (motores, etc ), magneticos, fluidos y hasta quimicos ...

El detalle que tienes que tener cuidado es que el PDF considera que el calentamiento y el enfriamiento es homogeneo, es decir, como la carga y descarga de un capacitor ... sin embargo, hay factores que pueden provocar que este comportamiento no sea homogeneo, como la disipacion termica, que tan aislante es la caja del exterior .. etc etc ...

Veo que eres nuevo por el foro y propusiste un tema que a mi parecer es bastante interesante y con mucha ingenieria ... (Aunque en la practica industrial el problema se soluciona con un regulador de temperatura autosintonizado  :D :D :D .. ) que ayuda a explotar la imaginacion y ciencia de todos los del foro. Te felicito pues me gustan este estilo de proyectos con mucho contenido matemático; sin embargo, aprender hacer un PID y todo el modelado involucra mucho conocimiento, en el que el fin es que todos aportemos ideas y aprendamos.

Saludos!




Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 28 de Enero de 2009, 04:17:19
La explicación que te ha dado blackat es buena a mi me ayudó para hallar la TF de mi motor, te permite hallar la función de transferencia con la transformada Z, con esta diseñas tu controlador discreto que lo llevas a tu pic en forma de ecuacion en diferencias.

Si usas ziegler-nichols tu respuesta al escalón tiene que tener la forma de S bien definida, para el caso de un motor dc este método no me sirvió porque la S no estaba bien definida al comienzo y el PID no era nada real porque trataba de establecer al motor en pocos milisegundos cosa nada real.

El Lugar geométrico de las raices me resultó mucho más seguro y preciso, manejando el estado permanente y transitorio con mayor aproximación a como salia en la simulación.
También podrías analizar tu sistema en el plano s y tu controlador analógico lo conviertes a uno digital.

saludos,
Título: Re: PID Digital (paso a paso)
Publicado por: Mario en 28 de Enero de 2009, 16:00:27
Información muy completa Blackcat.


Quizás les sirva estoesto (http://www.todopic.com.ar/foros/index.php?topic=14074.0)


Tendré que realizar un modelado como lo hizo Blackcat para comprender y después hacer una identificación de parámetros para un motor de DC (tomando RPMs vs tiempo).
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 28 de Enero de 2009, 18:08:21
Bueno segun he leido y leyendo sus aportes he concluido que el metodo de sintonizacion de ziegler-nichols no es muy exacto, pues se basa en algo un poco ideal....

entonces como ya tengo la ecuacion que define mi sistema, hallada con el maravilloso matlab, tengo que hallar ahora el G(s) de esa funcion.

para eso usamos matlab y hallamos la funcion de transferencia, para esto recurrimos a la ecuacion encontrada con basic fitting, lo que tenemos que hacer es crear una matriz y llenarla con los datos linealizados, si no saben el codigo aqui se los dejo:

X=0:1:10;
Y=[];
for jj=1:1
    for ii=1:11
            ecu=(0.002*(ii-1)^4) - 0.053*(ii-1)^3 + 0.4*(ii-1)^2 - 0.1*(ii-1) + 25;
            Y(jj,ii)=(ecu);
    end
end
Y
plot(X,Y)

ahora vemos que matlab nos muestra la matriz "Y" con los datos de la ecuacion "ecu" y si los comparamos con los datos experimentales, nos fijaremos que son muy, pero muy similares, ahora al sacar la funcion de transferencia de "X" vs "Y" y la de "tiempo" vs "temperatura" y compararlas vemos que es aun mas similares.

se hace asi:

tf(X,Y)
tf(tiempo,temperatura)

AQUI es donde quiero que me ayuden a aclarar o a corregir lo que este mal (o todo, si esta mal todo) ... teniendo la funcion de transferencia

Transfer function:
 
     s^9 + 2 s^8 + 3 s^7 + 4 s^6 + 5 s^5 + 6 s^4 + 7 s^3 + 8 s^2 + 9 s + 10
--------------------------------------------------------------------------------------------------------------------------------------------------
25 s^10 + 25.25 s^9 + 26.01 s^8 + 27.03 s^7 + 28.12 s^6 + 29.13 s^5 + 29.94 s^4 + 30.52 s^3 + 30.86 s^2 + 30.98 s + 31

le aplico transformada Z para discretizarla y poder hacer el metodo de lugar geometrico de las raices y diseñar el controlador ?????????????????

o me salte algun paso, seria mejor usndo algun otro metodo o como hago para seguir adelante....

gracias.

PD: por el metodo de ziegler nichols tambien voy a probar paralelamente (para quienes solo les han enseñado ese metodo) asi que teniendo una grafica en forma de S basta, donde se vea claramente un tiempo "muerto". Como en la del ejemplo.
Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 29 de Enero de 2009, 01:58:00
MMMmmmm ... hay algo que no cuadra ... parece que estas confundiendo las peras con los tomates ... voy a retornar a los cuadernos y repasar un poco de matematica avanzada para ingenieria.

Lo que tenes es una ecuacion que representa algo como funcion del tiempo ante una entrada escalon ... sin embargo, no estas representando a un sistema por completo ... esto es algo mas complicado (y la peor pesadilla de muchos!  :D)

Aqui tenemos que ser claros .. la entrada del sistema no es el tiempo . sino la funcion escalon! es decir [0 0 0 1 1 1 1 1 ... ] donde 1 es el momento en que se encendio el bombillo. Para describir un sistema en el tiempo y en palabras matematicas tenemos algo como asi:

\begin{equation}
y(t) = h(t) * x(t)
\end{equation}

Donde y(t) es la salida o mas bien la temperatura, x(t) es la entrada o la tension del bombillo, si es fija, puede usarse 1 para encendido o 0 para apagado. h(t) es la funcion de transferencia del sistema descrita en el tiempo (muchas veces como ecuaciones diferenciales y exponenciales)

Y el operador * no es una multiplicacion!!!; si no, la temible, terrorifica y tragica funcion de convolucion :2] que ha destrozado miles de sueños de mucha gente!. Quiza la han oido mencionar ...

Ahora ... ¿¿¿porque todo el cuento de la convolucion??? ... si averiguas que es la funcion de convolucion veras que es una formula un poco complicada (tanto de entender como de resolver ) ... Dios trabaja de manera misteriosa pero aveces deja portillos abiertos que simplifican mucho las cosas, pero sin antes haberse roto el coco .. en este caso el que se rompio el coco fue un señor de apellido Laplace (un genio y casi padre de la ingenieria, tambien como Heaviside y Fourier), la ventaja es que Laplace "transforma" la convolucion en una simple multiplicacion. Entonces, se veria algo como asi:

\begin{equation}
Y(s) = H(s)X(s)
\end{equation}

Donde Y(s) es la transformada Laplace de y(t) que es la señal de salida, X(s) es la transformada de Laplace de x(t) o la señal de entrada y H(s) es nuestro querido y desconocido sistema a encontrar! ... que lo averiguamos simplemente haciendo:

\begin{equation}
H(s) = \frac{Y(s)}{X(s)}
\end{equation}

Las cosas van mejorando, solo tenemos que encontrar Y(s) y X(s) .... la transformada de Laplace de una funcion escalon o x(t) = 1 (para t > 0) es:

\begin{equation}
X(s) = \frac{1}{s}
\end{equation}

Ahora solo tenes que averiguar la transformada de Laplace de la funcion que obtuviste osea Y(s) y hacer:

\begin{equation}
H(s) = sY(s)
\end{equation}

Pero te advierto que: Te deseo muy buena suerte transformando a Laplace (a lapiz y papel) esa funcion (mas si nunca lo has hecho antes pero me imagino que si, entonces no hay problema  :o) ... sin embargo, hay muchas herramientas que te facilitan el proceso ... creo que en MATLAB tiene funciones para eso ... nunca las he usado ... la HP49G me lo ha hecho todo!  8)

Para entender mejor como esta todo este cuento utilizaré el ejemplo del filtro RC ... tenemos que:

\begin{equation}
H(s) = \frac{1}{RCs + 1}
\end{equation}

Si aplicamos un escalon de voltaje a un circuito RC ... el capacitor se empieza a cargar .... ya todos conocemos la funcion de carga de un capacitor ... si multiplico (en el dominio s) H(s) por X(s) donde X(s) es la funcion escalon, entonces tendria:

\begin{equation}
Y(s) = H(s)X(s) = \frac{1}{RCs^2 + s}
\end{equation}

Ahora si aplico Laplace inverso .. obtengo la funcion de carga de un capacitor en el tiempo:

\begin{equation}
y(t) = 1 - e^{\frac{-t}{RC}}
\end{equation}

Si la matematica no miente, yo no miento y todo esta comprobable!

El otro detalle importantisisimo es que la funcion TF de MATLAB no hace eso que estas pensando ... TF crea el sistema conociendo ya los coeficientes, ejemplo, teniendo el sistema:

\begin{equation}
G(s) = \frac{s^2 + 2s + 3}{4s^2 + 5s + 6}
\end{equation}

La introduccion en MATLAB de ese sistema es:

>>G = tf( [1 2 3], [4 5 6] )

Es decir, TF solo sirve para agregar un sistema ... no te facilita muchas cosas!

Si ya pudiste introducir el sistema, podes verificarlo haciendo la funcion STEP o escalon,

>>step(G)

Esto te genera un grafico con la respuesta del sistema ante un escalon, deberias ver algo similar a lo que obtuviste experimentalmente.

Bueno eso es un resumen ... Espero que te ayude y no te moleste, pues esa es la matematica del asunto, muchos la evitan diariamente ¿¿Como?? usando reguladores PID ya fabricados ... pero lamentablemente los que estudian ingenieria no tienen como salvarse de eso ... Saludos!
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 29 de Enero de 2009, 04:58:37
hola, un sistema de orden 10 es demasiado para  tu planta, si tu respuesta tiene la forma de S o es como la carga de un condensador ante un escalón, entonces aproximalo a un sistema de primer orden, incluso eso lo puedes hacer manualmente, hallas el tiempo de establecimiento T,,, entonces tau=T/5, y tu ganancia seria la temperatura final entre el voltaje de entrada al foco, osea:

Gplanta=A/(tau*s+1);

donde:  A=Tss/U      ; Tss=temp.final, U=voltaje de entrada.
tau=T/5;

Con Gp puedes usar él método LGR (Lugar geométrico de las raices para hallar tu controlador),

Agregando algo más al concepto de convolución que dio Blackat, h(t) es la respuesta que tiene un sistema ante una entrada impulso. Entonces conociendo esta respuesta se puede calcular la respuesta que tendría este sistema ante cualquier otra entrada, convolucionando h(t) con la entrada x(t), que es un juego de sumas y productos entre ellos.

saludos,
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 29 de Enero de 2009, 05:07:21
Blackat tu última funcion G(s) no existe fisicamente, debería estar invertida.

saludos,
Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 29 de Enero de 2009, 11:50:41
Blackat tu última funcion G(s) no existe fisicamente, debería estar invertida.

saludos,

A si si ... fue algo que me inventé en el momento ... voy a corregirlo


El método de Renatox es correcto ... es el mismo que está propuesto en el pdf
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 29 de Enero de 2009, 12:01:36
Excelente, como me habeis abierto los ojos, definitivamente nunca debi pensar que esas aburridas clases con ese aburrido profesor de matematicas especiales eran aburridas, pero en fin, lo de convolucion, la place, fourier y Z lo tengo algo claro, tendre que repasar y no me es dificil volver a entenderlo.

Leyendo lo que ha escrito blackcat me perdi en una cosa:

haber
H(s) = Es quien me describe la planta y lo que tengo que hallar
X(s) = Entrada al sistema, en este caso seria el escalon unitario, por que solo inicio el sistema. (solo bombilla y sensor) ¿verdad?
Y(s) = Aqui esta mi gran duda, este es mi Y(t) (hallado con basic fitting) pasandolo al plano S con ayuda de LaPlace ?????

Si las cosas son asi, no resta si no pasar Y(t) -> Y(s) y luego hallar mi anhelado H(s) ????

---------------------

Renatox, lo que dices es cierto, pero si lo hacemos por ese lado, simplemente uso el metodo de sintonizacion de ziegler nichols, el cual con ayuda de la grafica ya me da todo, ya tengo mi h(t) etc... pero como se sabra, no es muy exacto y toca empezar a variar Kp, Ti y Td, luego de variarlos, se escoje el que mejr controle y sale, aunque no se aplica mucha matetica ni mucha intuicion pues todo viene prefabricado XD

-------------------------

renatox tienes razon, blackcat se ha equivocado, el denominador y numerador deberian ir invertidos...
Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 29 de Enero de 2009, 12:38:45
Si ... y(t) es una ecuacion que varia con el tiempo y esa es la respuesta ante un escalon .. asi como al obtuviste con basic fitting ... deberias convertir y(t) -> Y(s) ... te doy una pista:

La transformada Laplace de una señal descrita como:

\begin{equation}
\frac{t^{n-1}}{(n-1)!}
\end{equation}

es

\begin{equation}
\frac{1}{s^n}
\end{equation}
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 29 de Enero de 2009, 13:27:36
Hola, otra transformada de utilidad es:

         t^n     ---------------->     S^( n! / n+1 )

Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 01 de Febrero de 2009, 13:28:13
Bueno amigos, retomando el tema....

Una vez aque tenemos nuestro y(t) le aplicamos transformada de LaPlace lo cual nos entrega una funcion Y(S), con esto ya podemos hallar nuestra funcion de transferencia (de la planta).

suponiendo que nos dio: G(S)= (1) / (S+1)^2  ahora miramos nuestro diagrama de bloques del sistema a controlar que seria el siguiente:

(http://img98.imageshack.us/img98/6851/diagramabloquespidkx9.th.jpg) (http://img98.imageshack.us/my.php?image=diagramabloquespidkx9.jpg)

Donde el primer diagrama corresponde al dominio del tiempo (t) y el segundo al de la frecuencia (S) y donde:

D(S) : Es la funcion de nuestro controlador discreto en el dominio de la frecuencia
Bo(S): Es un retenedor de orden 1
G(S): Es la funcion de transferencia de nuestra planta

D(Z): Es nuestro controlador en el plano discreto
G(Z): Es el producto del retenedor y la planta en el plano discreto

R(?): Entrada
Y(?): Salida

Ahora hacemos la canonica del segundo diagrama de bloques para obtener: F(Z) = [ D(Z) G(Z) ] / [ 1 + D(Z) G(Z) ]
Donde F(Z) es la respuesta de nuestro sistema en el plano discreto.

Si tenemos G(Z) y sabemos como queremmos que se comporte nuestro sistema osea conocemos F(Z), pero con la condicion que F(1) = 1 y el Essp=0 .... y ademas que F(Z) = K / P(Z) y que P(Z) = (Z - Z1) (Z - Z2) ........ entonces despejamos D(Z) el cual seria nuestra incognita y se refiere a nuestro controlador.

D(Z) = [ 1 / G(Z) ] [ F(Z) / (1 -F(Z)) ]

Ahora tenemos que discretizar nuestro G(S)... que para este ejemplo es G(S) = 1 / (S+1)^2

Pero recuerden que tenemos un G(Z) que es igual a: G(Z) = Tranformada Z | Bo(S) G(S)
si nos leemos la teoria de los retenedores de orden 1 obtenemos que Bo(S) = (1 - e^-TS) / S
y aplicando transformada Z obtenemos que Bo(Z) = (1 - Z^-1)

Entonces nos falta discretizar nuestro G(S) para asi hallar nuestro G(Z) completo:
G(Z) = (1 - Z^-1) Tranformada Z G(S)

Despues de mucho calculo, lapiz borrador y papel y como no de hacer una y otra cosa obtenemos:

(http://img136.imageshack.us/img136/2750/gdezui6.th.jpg) (http://img136.imageshack.us/my.php?image=gdezui6.jpg)

Donde:
a = 1
T = periodo de muestreo

Ahora con la teoria que nos dan en libros y universidades sabemos que T = tao min / 10 .... o .... T = tao min / 8 ... pero para comodidad escogemos el /10 .

Bueno aqui empiezan las preguntas:

** Como hago para que funcion de transferencia quede de la forma G(S) = 1 / (tao1+S+1)(tao2+S+1).....(taoN+S+1) ... por que se supone que se escoge el minimo de los taos para poder hallar el periodo de muestreo.... ahi necesito ayuda.

** La otra pregunta es: tengo que escoger las demas condiciones de mi sistema, asi que se escoge Essp = 0 y un Zita = 0.5... pero tambien tengo que escoger un Test5% = xx segundos .... se supone que con mi G(S) puedo saber este tiempo de establecimiento, pero la cuestion es como ??? se hace mediante la grafica ??? o algun otro metodo....

ayudenme ahi, por que es donde estoy barado... despues de eso, puedo terminar todo y pasar la parte matematica y seguir a la de programacion...


PD: no habia vuelto a escribir por que andaba en parciales  :P
 




Título: Re: PID Digital (paso a paso)
Publicado por: blackcat en 01 de Febrero de 2009, 14:08:55
Hola!

Elegir el tiempo de muestreo siempre es un dilema, en audio es muy facil; sin embargo, en control el tiempo de muestreo correcto lo dice la planta, parece que en eso lo tenes bien claro ...

El detalle está en que si elegimos un tiempo de muestreo muy alto, nuestro controlador digital no será capaz reproducir ciertas frecuencias en el que la planta reacciona, si usamos un tiempo de muestreo bajo es posible que tengamos un amplio rango de frecuencias y habrá algunas en el que la planta no actua ... este último suena bien, pero nos comprometemos a usar un procesamiento mas robusto; es decir, tenemos que usar un micro de mas velocidad.

Lo que yo hago, no se si estará bien  :?; sin embargo, mi profesor me dio el visto bueno, este es una vez obtenido el sistema aplicar la función BODE, que me muestra el rango de frecuencias del sistema. Por lo general, es un pasobajos, entonces tomo la frecuencia de -3dB, la multiplico por 10 y esa será mi frecuencia de muestreo.

Aqui dejo un ejemplo del sistema en tiempo continuo y el mismo sistema discretizado a diferentes frecuencias de muestreo:

(http://img88.imageshack.us/img88/7439/bodejx1.jpg)

La linea azul es la respuesta en frecuencia del sistema en tiempo continuo, los otros sistemas son los distretizados a diferentes frecuencias de muestreo, se observa que el tiempo de muestreo determina el rango de frecuencias que podrá representar, Nyquist no estaba tan loco como decian!!  :D ...


Para discretizar el sistema podes usar la funcion C2D, que se usa como:

>>H = c2d( G, ts )

donde G es el sistema en tiempo continuo o plano S y ts es el tiempo de muestreo. La función tambien permite elegir el método de discretización.

Saludos!



 
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 01 de Febrero de 2009, 16:27:38
Muy bein ,ahora si voy entendiendo... haber si es vedad...

tengo G(S) = 1 / (S+1)^2

en matlab seria:

G = tf([0 1],[1 -2 1]);
bode(G)

hasta ahi bien???

bueno ahora en la grafica busco la magnitud en -3dB, y me da 0.637 rad/seg ... pero asi no me sirven, entonces hago lo siguiente multiplico por 180 y divido en pi .. verdad ???

si lo anterior es cierto y no me he confundido el valor resultante seria 36.4974 .... entonces ahora lo multiplico por 10 .... quedaria 364.974  ahora para hallar T = 1/ 364.974 .... entonces T = 0.00274 seg .... verdad o dije alguna mentira????


ahora pasando a lo siguiente.. una vez elegido el periodo de muestreo, matlab me discretiza usando C2D verdad?? lo cual es realmente cierto, pues tome un periodo de muestreo con el cual hize mi controlador y me dio similar, aunque debido a que matlab toma todas las decimas y yo solo 4, pues habia alguna diferencia entre los resultados, pero no era muy grande que digamos, asi que para este caso es mejor usar matlab y si quieres aprender pues usa lapiz y papel...

una vez se resuelvan mis dudas continuaremos con el siguiente paso... y editare el post principal para añadir lo que ya esta bien...
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 10 de Febrero de 2009, 18:02:24
Bueno muchachos despues de unos cuantos dias sin poder seguir con esto, he vuelto y terminado la parte matematica, espero que revisen nuevamente el primer post, por que lo he modificado bastante...

Ahora viene la parte de programacion... una vez obtenida la famosa ley de control jejeje

Para lo cual requiero que me ayuden con un programa para hacer comunicacion rs232 usando pic 16f877a ... ademas que se pueda leer por matlab o por labview ... asi que necesitare bastante ayuda..

espero respuetas amigos.

vemos.
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 15 de Febrero de 2009, 13:36:47
Hola Krack, este es el controlador que has hallado en tu primer post,

u(Z)     0.001058Z^-1 - 0.002116Z^-2 + 0.001058Z^-3
----- = ---------------------------------------------------------
e(z)     1 - 2.93769Z^-1 + 0.9382Z^-2 - 0.9379Z^-3


ya lo simulaste en matlab, con tu planta haber como responde?

sería bueno que coloques la grafica de la respuesta al escalón haber como queda,

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: carq en 10 de Mayo de 2009, 11:03:42
Hola

al digitar ident en matlab me sale un error en donde especifica que la funcion o variable no esta definida
y hasta el momento no se como activarla
espero que me ayuden
Título: Re: PID Digital (paso a paso)
Publicado por: NANO1985 en 10 de Mayo de 2009, 17:40:09
que buen  hilo éste!!  :-) no me había enterado de él.... voy a seguirlo desde cerca.
Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 13 de Mayo de 2009, 02:54:47
hola, talves estas usando una version antigua de matlab que no tiene ese guide, la 2006b si la tiene.

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: komodo100 en 17 de Mayo de 2009, 23:01:26
Hola!lei toda esta informacion y me parecio muy interesante...yo estoy implementando un pid con pic 18f452 ¿Alguien sabe como hacerlo?.......
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 18 de Mayo de 2009, 00:44:00
Hola.

No es complicado hacerlo, solo basta resolver la ecuacion en diferencias del controlador. Algo que es de vital importancia es el modelo fisico del sistema -ya sea experimental o teorico-, el modelo del actuador .... si tienes mal eso, el control no te funcionara.

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: dkns en 07 de Julio de 2009, 03:20:46
Que tal, oigan esta muy interesante y muy buena la informacion que dan aqui, la vdd me esta ayudando mucho a darme idea de como es esto del PID, solo que mi gran y principal problema es que en la escuela me pidieron hacer esto del PID discreto con un microcontrolador (ya sea pic o avr), pero sin enseñarme absolutamente nada al respecto de que es y como se hace un PID, todo me lo dejaron a investigacion, y sii ya he buscado por toodos lados y he encontrado varias cosas, pero lo que sigo sin encontrar o sin entender, es exactamente cuales son las variables que necesito conocer de mi  "caja negra" conformada en mi caso por una hielera de unicel, un foco de 40watts y un lm35.. y bueno por el momento esa es mi principal duda, espero pueda alguien auxiliarme porque me lo encargaron la semana pasada y lo tengo que entregar a finales de esta semana  :(.. estoy practicamente desesperado. de ante mano gracias.
Título: Re: PID Digital (paso a paso)
Publicado por: NANO1985 en 07 de Julio de 2009, 11:24:16
que buen tema éste.... muy buena data el PDF blackcat
los voy a estar siguiendo
Gracias por compartir tanta informacion   :lol:
Saludos  8)
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 07 de Julio de 2009, 14:29:30
Lee al principio de este hilo. Esto todo muy bien explicado por BlackCat.

Una cosa muy importante: segun el ejemplo el modelo es ideal. Para un modelo real, la ecuacion del sistema de planta tendria una ecuacion como esta:

G(s) = \frac{K_{o}e^{-s\tau_{o}}}{1+s\tau}

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: krakc en 12 de Julio de 2009, 22:46:00
Que tal, oigan esta muy interesante y muy buena la informacion que dan aqui, la vdd me esta ayudando mucho a darme idea de como es esto del PID, solo que mi gran y principal problema es que en la escuela me pidieron hacer esto del PID discreto con un microcontrolador (ya sea pic o avr), pero sin enseñarme absolutamente nada al respecto de que es y como se hace un PID, todo me lo dejaron a investigacion, y sii ya he buscado por toodos lados y he encontrado varias cosas, pero lo que sigo sin encontrar o sin entender, es exactamente cuales son las variables que necesito conocer de mi  "caja negra" conformada en mi caso por una hielera de unicel, un foco de 40watts y un lm35.. y bueno por el momento esa es mi principal duda, espero pueda alguien auxiliarme porque me lo encargaron la semana pasada y lo tengo que entregar a finales de esta semana  :(.. estoy practicamente desesperado. de ante mano gracias.

hola que pena la tardanza en responder pero hace varios dias que no tengo acceso a internet asi que no me habia enterado de nada

bueno en este hilo se crea un pid digital que es lo mismo que hacer un pid discreto, pues asi es que se hace uno digital, osea discretizando, si te lees el post completo (un poco extenso jejeje) te dras cuenta que hay que discretizar usando la transformada Z...

al final del proceso matematico obtienes una ecuacion que es la que programas en tu pic para controlar tu bombilla respecto a la entrada, el lm35.

para programar te recomiendo lenguaje C, asi que busca info alli.

para tomar las medidas lo mejor es hace un programa de comunicacion serial que tome datos cada cierto tiempo y los envie al pc para luego leerlos con matlab y guardarlos en una matriz para luego graficarla, con eso obtienes mucha exactitud y rapides en la toma de datos

cualquier duda pregunta que para eso estamos,

suerte con eso.
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 20 de Septiembre de 2009, 19:01:37
Y ¿Como se implementa una ecuacion de un controlador en C?

Un saludo.
Título: Re: PID Digital (paso a paso)
Publicado por: Suky en 22 de Septiembre de 2009, 09:25:27
Y ¿Como se implementa una ecuacion de un controlador en C?

Un saludo.
Aquí (http://www.todopic.com.ar/foros/index.php?topic=26780.0) hay uno implementado en C.


Saludos!
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 01 de Marzo de 2010, 03:53:10
Blackcat, estoy intentando seguir tus pasos con el IDENT tal y como lo describiste unos mensajes atrás, pero me he quedado atascado en el paso "Ahora arrastramos el cuadro que dice ARX111 de la columna derecha sobre el cuadro TO WORKSPACE ... eso hara que los datos del modelo lo tengamos en la linea de comando."

Te dejo una imagen de lo que veo en pantalla, y con una flecha roja te indico lo que hago con el ratón, pero no consigo arrastrar nada. ¿Será que no he entendido bien lo que tengo que hacer?
(http://img689.imageshack.us/img689/2733/matlabdraganddrop.jpg)
Título: Re: PID Digital (paso a paso)
Publicado por: Suky en 01 de Marzo de 2010, 09:19:11
Y seleccionando el modelo y clickeando en To Workspace?
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 02 de Marzo de 2010, 02:20:07
Pues no lo consigo, ni dándole al label "To workspace", ni sin darle. Es como si el Workspace no estuviera diseñado para recibir drags & drops  :(
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 02 de Marzo de 2010, 04:03:59
hola nocturno, To Workspace esta en la misma ventana de System Identification en la parte centrarl ahi arrástralo. Luego
en el Comand Windows arma tu función de la forma como blackat comenta.

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 06 de Marzo de 2010, 04:15:42
Perfecto, así sí funciona.
Voy a preparar un log de los datos para meterlos en la coctelera a ver qué sale.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 06 de Marzo de 2010, 08:19:35
Llevo un rato jugando con MATLAB y no me acaban de convencer los resultados que he obtenido, porque seguramente la habré cagado en alguna parte.
 
Os cuento lo que he hecho.
En primer lugar he preparado un programa en el PIC que captura cada 10ms. la velocidad del motor almacenando un total de 470 muestras (4.7s) que es lo máximo que me permitía la RAM.
He excitado el motor en secuencias que duraban 500ms de tres maneras distintas:

Estas son las respuestas que he obtenido del motor:
CAPTURA 1
(http://img169.imageshack.us/img169/9167/pidcaptura1.png)

CAPTURA 2
(http://img716.imageshack.us/img716/8179/pidcaptura2.png)

CAPTURA 3
(http://img707.imageshack.us/img707/5878/pidcaptura3.png)

Tras ejecutar IDENT he decidido utilizar orden 2 en la primera y tercera captura, y de orden 1 en la segunda, porque a mi juicio es el que mejor relación presenta entre complejidad y aproximación a la función real. Estos son los modelos obtenidos:
MODELO 1
(http://img696.imageshack.us/img696/4730/pidmodelo1.jpg)

MODELO 2
(http://img192.imageshack.us/img192/3694/pidmodelo2.jpg)

MODELO 3
(http://img297.imageshack.us/img297/4796/pidmodelo3.jpg)


Estas son las funciones de transferencia obtenidas:
FUNCION 1
Transfer function from input "u1" to output "y1":
   0.5152 z - 0.3286
-----------------------
z^2 - 0.7035 z - 0.2006
 
Transfer function from input "v@y1" to output "y1":
       18.23 z^2
-----------------------
z^2 - 0.7035 z - 0.2006
 
Input groups:          
      Name      Channels
    Measured       1    
     Noise         2    
                        
Sampling time: 0.01

FUNCIÓN 2
Transfer function from input "u1" to output "y1":
   1.361 z - 1.208
----------------------
z^2 - 0.702 z - 0.2102
 
Transfer function from input "v@y1" to output "y1":
      15.24 z^2
----------------------
z^2 - 0.702 z - 0.2102
 
Input groups:          
      Name      Channels
    Measured       1    
     Noise         2    

FUNCIÓN 3
Transfer function from input "u1" to output "y1":
    -2.32 z + 2.313
-----------------------
z^2 - 0.6377 z - 0.3697
 
Transfer function from input "v@y1" to output "y1":
       9.735 z^2
-----------------------
z^2 - 0.6377 z - 0.3697
 
Input groups:          
      Name      Channels
    Measured       1    
     Noise         2    
                        
Sampling time: 0.01


Pues bien, como podéis comprobar cualquier parecido entre una función y otra es pura coincidencia, lo que me ha dejado desconcertado.
¿No se supone que deberían parecerse?
¿Me recomendáis que siga adelante calculando el PID o debo hacerlo de otra manera?

Gracias y perdonad por el tostón.
 
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 10:26:06
Para obtener una mejor respuesta lo que te conviene hacer es que el periodo de las secuencias sean algo mayor. para que la velocidad llegue al estacionario. El problema que veo es que no vas  a tener suficiente memoria para guardar los datos. Como ves en las gráficas, en ningún momento la velocidad llega al valor estacionario, por lo tanto solo tomas el transitorio de la respuesta y eso hace que tu modelo obtenido no sea muy bueno. Prueba con un período de al menos 2 segundos.
Otra cosa que veo es que en la secuencia 1 y 2, estás utilizando un duty de 0 para el calor mínimo del mismo y esto hace que la velocidad haga cosas raras, Te conviene utilizar secuencias como la tercera, pero siempre procura que llegue al estacionario. Si hay partes de la respuesta en los extremos que hace cosas raras recorta esos puntos y no los consideres.
No se con que obtienes la velocidad, pero si es con una matriz taquimétrica filtra con un capacitor un poco la señal.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 06 de Marzo de 2010, 13:41:34
Probaré entonces ampliando el periodo de 500ms a uno mayor, pero dejé eso porque creí que ya estaba en el estacionario. Realmente si miras las curvas 1 y 2 verás que cuando el escalón cae es cuando la curva está plana.
La velocidad la mido con un encoder que llevan los motores, midiendo la duración de cada pulso tengo T y de ahí obtengo la frecuencia.
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 06 de Marzo de 2010, 13:44:46
Una manera más simple de sacar la función de tu planta es hacerla al ojo :?, la respuesta de velocidad de un motor dc tiene la forma de una funcion de primer orden es decir sin sobreimpulso. Entonces tendrías una función:

Gs=A/(tau*s+1);

donde A=w(rad/seg)/V(voltios)
y tau=Ts/5;   donde T es el tiempo de establecimiento que en tu gráfica parece ser 0.6seg. Debes estar usando un motor grandecito o conectado a carga para que te de este valor alto seguramente.

luego lo discretizad con c2d:

Gz=c2d(Gs,0.01,'zoh')

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 06 de Marzo de 2010, 13:48:33
Es mejor que midas la cantidad de pulsos que entran cada 10 mseg vas a obtener una mejor medida.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 06 de Marzo de 2010, 13:58:44
Con el motor a toda velocidad, leo unos 350 pulsos por segundo, por lo que en 10 ms. sólo leería 3.5 pulsos. Pero a poca velocidad se cae a 12 pulsos por segundo (0.12 pulsos por periodo).
Me temo que no puedo contar pulsos porque me quedo sin resolución.

Lo de conseguir la función a mano me ha despistado un poco. Veré si soy capaz de digerirlo e implementarlo.

Gracias
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 14:34:13
A mano si es fácil  porque es un modelo sencillo, y solo es un polo, el tema es aprender a usar la herramienta que trae el matlab para sistemas más complejos empezando por algo que ya es muy conocido como el modelo de un motor de DC
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 14:38:59
Nocturno, mirando las gráficas si se ve que está comenzando el estacionario, pero al ser la señal tan ruidosa es conveniente alargar un poco más el período. Como no tienes manera de filtrar cuando capturas los datos, te convendría filtrar los datos con matlab. Tal vez haciendo un promediador de algunas muestras le elimines algunos picos. Luego pruebas el modelo que te da sin filtrar y filtrado y a mano y verificas si se asemejan.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 06 de Marzo de 2010, 14:57:50
Y si no es mucho preguntar, ¿cómo se filtra con Matlab, cómo puedo hacer ese promediador de muestras?
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 15:48:40
Lo puedes hacer con una función creada por tí

Esta es una que he usado en algun momento:

Código: Matlab M
  1. function promediador=f(m);
  2. %Realiza un filtrado mediante promedio de las muestras
  3. %m->vector a filtrar
  4. for k=1:length(m)                                                                       % Para k variando en el rango 1..largo del vector
  5.            
  6.    if((k>2) & (k<length(m)-1)),                                         % Si estoy en los elementos centrales
  7.       suma(k)=1/5*(m(k-2)+m(k-1)+m(k)+m(k+1)+m(k+2));           % promedio normalmente
  8.      
  9.    elseif (k==1),                                                       % Si estoy en el primer elemento
  10.       suma(k)=1/2*(m(k)+m(k+1));                                % promedio con el siguiente solamente
  11.    elseif (k==2),                                                       % Si estoy en el primer elemento
  12.       suma(k)=1/3*(m(k-1)+m(k)+m(k+1));                         % promedio con el siguiente solamente
  13.      
  14.    else                                                                         % Si estoy en el último (no queda otra)
  15.       suma(k)=1/3*(m(k-2)+m(k-1)+m(k));                         % promedio con el anterior solamente
  16.      
  17.    end                                                                                  % Fin del IF
  18.    
  19. end
  20. promediador=suma;

Hace un promedio de 5 muestras.

Si quieres filtrarlo más pasas el promediador varias veces y listo. Este lo usé para el control de un péndulo invertido en una materia de control de la uni y funcionó muy bien.

Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 15:51:24
Cuando haces filtrados con esta función, en el vector que obtienes te conviene eliminar los extremos del inicio y del final del vector, pero no creo que sea necesario. Además te vas a quedar con muy pocos puntos  :lol:
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 06 de Marzo de 2010, 16:03:47
En el adjunto pongo un ejemplo de como queda el resultado después de aplicar el promediador 10 veces a una señal
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 07 de Marzo de 2010, 03:06:37
Pues ya he ejecutado tu estupenda función promediadora. Este es el resultado después de haberla pasado un par de veces sobre la señal de entrada:
(http://img707.imageshack.us/img707/2636/pidpromediador.jpg)

Y tras ejecutar IDENT esto es lo que obtengo:
(http://img692.imageshack.us/img692/2102/pidmodelopromediado.jpg)

con esta función de transferencia:
Transfer function from input "u1" to output "y1":
  0.1156
----------
z - 0.9414
 
Transfer function from input "v@y1" to output "y1":
 4.406 z
----------
z - 0.9414
 
Input groups:          
      Name      Channels
    Measured       1    
     Noise         2    
                        
Sampling time: 0.01

¿Cómo lo véis ahora?, ¿será más válido el resultado?

P.D.: tuve un problema con la función promediador. El vector de entrada era de tipo 470x1 (una columna y 470 filas) y al ejecutar la función me daba una salida de tipo 1x470 (una fila y 470 columnas). Esto impedía que pudiera ejecutar IDENT correctamente por lo que tuve que transponer filas y columnas para conseguirlo
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 07 de Marzo de 2010, 03:22:01
Ese promediador parece que no retrasa la señal, la voy a probar para filtrar la velocidad de mi motor ya que uso un periodo de muestreo de 1mseg.

Nocturno te sale un bajo porcentaje de precisión, porque tu curva calculada no se aproxima bien en muchas zonas a la curva real, segun se ve tu tiempo de establecimiento es 0.6seg.

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 07 de Marzo de 2010, 03:38:08
Si me genera retraso, mis transitorios de velocidad son de 20mseg mientras más muestras tome más se desfasa.

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 07 de Marzo de 2010, 04:28:17
Ese promediador parece que no retrasa la señal, la voy a probar para filtrar la velocidad de mi motor ya que uso un periodo de muestreo de 1mseg.

Nocturno te sale un bajo porcentaje de precisión, porque tu curva calculada no se aproxima bien en muchas zonas a la curva real, segun se ve tu tiempo de establecimiento es 0.6seg.

saludos.

¿Tendría entonces que irme a una aproximación de mayor orden?, ese modelo es de primer orden.
¿Qué es ese tiempo de establecimiento de 0.6s?
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 07 de Marzo de 2010, 08:17:38
Parece que ajustaba mejor la primer gráfica que habías puesto., jaja. Aunque era una de segundo orden.
Si fuera yo, alargaría el período de la secuencia a 2 segundos. Y el duty no lo llevaría a cero ya que no se cual es la razón por la que te recorta la señal y agrega muchas no linealidades que no son buenas para obtener un modelo lineal.
Al duty le daría un offset de por ejemplo 50, por decir algún valor, entonces haría:
Secuencia: 1000ms con duty=177, 1000ms con duty=50, 1000ms con duty=177, 1000ms con duty=50, ...
Si le das ese offset Los datos convendría comenzar a tomarlos luego de uno o dos períodos de la secuencia para estar seguros de que se llego al régimen de trabajo, porque si tomas desde el principio la velocicad comienza desde cero y no desde los valores máximos y mínimos estacionarios que debería tener
Título: Re: PID Digital (paso a paso)
Publicado por: GustavoT en 07 de Marzo de 2010, 13:35:44
Wow   hace tanto tiempo que no piso la lista.........

Esto algo impresionado por los temas que estan tratando, esto del PDI y Matlab   avanzadooo, no lei con detenimiento el post

Pero me recuerda cuando arme un Servo usando un mtor DC  un PI y un Pic18 para controlarlo, mas bien prueba y error pero funciono muy bien una vez que logre sintonizarlo, y eliminar un maldito problema de no linealidad en la zona muerta del motor DC,

El control PI era discreto y el tiempo de muestreo  correspondía con la velocidad del PWM, para que mas si ivan a ser datos que se perdían y no llegaban a la salida.

Ahora deje de lado los PIC lo que no quiere decir que no los extrañe realmente son pequeñas maravillas encapsuladas en plástico, baratos y poderosos, ahora trabajo con PLC A-B maravillas caras, las cosas salen mas rapidas en PLC pero los micros tiene capacidades solos limitadas por la imaginación y la persistencia.

Coméntales ya que estan trabajando con Matlab que logre conectarlos con un PLC usando un OPC server pero no logre todavía compartir datos :(   si alguien sabe de esto le agradezco

Saludos
GustavoT
Título: Re: PID Digital (paso a paso)
Publicado por: Renatox_ en 08 de Marzo de 2010, 23:22:11
La respuesta de la velocidad de un motor DC es una función de segundo orden que responde sin sobreimpulso, por eso se le suele aproximar a una de primer orden, no debes aumentar el orden a más de dos.

Por ejm para un motor pequeño le metes un escalón de 10v, entonces podrías tener estas lecturas: 0 200 350 500 600 700 780 820 900 950 1000 1000 1000 rpm, si cada medición es en 10mseg entonces puedes ver que la velocidad se establece en 100meg, entonces se dice que el sistema de velocidad tiene un tiempo de establecimiento de 100mseg. y tu ganancia sería A=1000rpm/10v=100rpm/v puedes pasarlo a rad/seg/v si lo deseas.

saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 09 de Marzo de 2010, 01:37:38
Por si alguien tiene dudas de como se obtienen experimentalmente y a mano los parámetros de un sistema de primer orden al cual se le aplica un escalón. Acá va una pequeña descripción:
Si tenemos un sistema de la forma
\
Y(s)=\frac {K}{(s+a)}

La respuesta a un escalón de amplitud V es:
\
Y(s)=\frac {V.K}{s.(s+a)}

En tiempo seria:
\
y(t)=\frac{V.K}{a}.(1-exp{-at})\ para\ t>0

Para obtener la ganancia K del motor debemos obtener el valor de estado estacionario.
\
{K_{ss}=limite_{t \to{+}\infty}{\frac{V.K}{a}.(1-exp{-at})=\frac{V.K}{a}}
por lo tanto, la ganancia K va a ser el valor de estado estacionario obtenido experimentalmente (Kss) multiplicado por "a" que es el valor del polo( el polo es -a), y dividido por la amplitud del escalón.
\
K=\frac{a.K_{ss}}{V}


Para calcular el valor del polo, sabemos que la exponencial alcanza aprox. el 63% del valor de estado estacionario, en la constante de tiempo del sistema si es uno de primer orden.
por lo tanto:
\
\0.63.K_{ss}=K_{ss}.(1-exp{-a\tau})
0.63=1-exp{-a\tau}
\font{5pts}
a=-\frac{ln(-0.63+1)}{\tau}
a=\frac{1}{\tau}

Por lo tanto, si tenemos la respuesta experimental del sistema de primer orden ante un escalón, midiendo el tiempo que tarda la exponencial en llegar al 63% del valor de estado estacionario obtenemos el "tao" y por ende el valor del polo "a"(recordar que el polo está en -a). Midiendo el valor de estado estacionario, y conociendo la amplitud del escalón aplicado al sistema ya podemos calcular la ganancia "K" del motor

Con lo que se obtiene la función transferencia deseada.

Ahora veamos un ejemplo. Si tenemos una respuesta medida del sistema:
(http://img532.imageshack.us/img532/3050/escaln.png) (http://img532.imageshack.us/i/escaln.png/)


El valor de estado estacionario es 0.2. Por lo tanto el 63% es 0.126,
Buscamos en la gráfica el tiempo en que llega a 0.126 y obtenemos el tao=0.2. El polo está en -5
Si suponemos que le aplicamos al sistema un escalón de amplitud 1, la ganacia K=1

Entonces la función transferencia buscada es
\
Y(s)=\frac {1}{(s+5)}

Esta es la forma que uso para obtener estos parámetros


PD: Alguien sabe por qué aparece la h al principio de las fórmulas cuando se usa LaTeX
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 09 de Marzo de 2010, 03:23:20
Vale, pues lo intento hacer a mano como me habéis aconsejado. Este es el proceso que sigo.
Una manera más simple de sacar la función de tu planta es hacerla al ojo :?, la respuesta de velocidad de un motor dc tiene la forma de una funcion de primer orden es decir sin sobreimpulso. Entonces tendrías una función:

Gs=A/(tau*s+1);

donde A=w(rad/seg)/V(voltios)
y tau=Ts/5;   donde T es el tiempo de establecimiento que en tu gráfica parece ser 0.6seg. Debes estar usando un motor grandecito o conectado a carga para que te de este valor alto seguramente.

luego lo discretizad con c2d:

Gz=c2d(Gs,0.01,'zoh')

saludos.

Si tomamos 225 como la velocidad máxima alcanzada para una alimentación de 12V tendríamos:
>> A=225/12

A =

   18.7500

Por otra parte tenemos que mi motor alcanza su estacionaria en 0.6s. y por tanto el tau es:
>> tau=0.6/5

tau =

    0.1200


Cuando en la fórmula aparece una "s" deduzco que te refieres a "segundos", por lo que en mi caso utilizo el array "t" (intenté poner la "s" pero me dijo que no está definida).
En t tenemos un array de 0 a 4.69 que representa 470 pasos de 10ms.

Ahora defino la función:
>> Gs = A / (tau * t + 1)

Y el resultado que me sale es muy extraño: aparecen 469 valores iguales a 0, y en el último valor aparece un 11.9977

La verdad es que no lo entiendo.

¿O es que tendría que haber definido "t" de otra manera?

Por supuesto al intentar discretizar me da un error:
>> Gz=c2d(Gs,0.01,'zoh')
??? Error using ==> c2d at 50
The A matrix must be square
Título: Re: PID Digital (paso a paso)
Publicado por: pablomanieri en 09 de Marzo de 2010, 08:29:00
Debes definir Gs como una función transferencia, en matlab esto es:
Gs=tf(A,[tau 1])

y luego si haces
Gz=c2d(Gs,0.01,'zoh')
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 09 de Marzo de 2010, 16:07:19
Estupendo, ya lo tengo:
>> Gs=tf(A,[tau 1])
 
Transfer function:
  18.75
----------
0.12 s + 1
 
>> Gz=c2d(Gs,0.01,'zoh')
 
Transfer function:
 1.499
--------
z - 0.92
 
Sampling time: 0.01

Muchas gracias. Voy a pelearme ahora con el Simulink a ver si saco el algoritmo del PID.
Título: Re: PID Digital (paso a paso)
Publicado por: Nocturno en 09 de Marzo de 2010, 16:32:37
Os dejo unas capturas del modelo PID que ha calculado MATLAB y el código generado.
Seguiré informando, porque ahora toca implementarlo en mi montaje real.

(http://img19.imageshack.us/img19/6163/pidtuneado2.jpg)

(http://img690.imageshack.us/img690/7376/pidtuneado.jpg)

Este es el código que ha generado:

Código: C
  1. /*
  2.  * ControlPID.c
  3.  *
  4.  * Real-Time Workshop code generation for Simulink model "ControlPID.mdl".
  5.  *
  6.  * Model Version              : 1.4
  7.  * Real-Time Workshop version : 7.4  (R2009b)  29-Jun-2009
  8.  * C source code generated on : Tue Mar 09 20:28:17 2010
  9.  *
  10.  * Target selection: rsim.tlc
  11.  * Note: GRT includes extra infrastructure and instrumentation for prototyping
  12.  * Embedded hardware selection: 32-bit Generic
  13.  * Emulation hardware selection:
  14.  *    Differs from embedded hardware (MATLAB Host)
  15.  * Code generation objectives: Unspecified
  16.  * Validation result: Not run
  17.  */
  18.  
  19. #include <math.h>
  20. #include "ControlPID.h"
  21. #include "ControlPID_private.h"
  22. #include "ControlPID_dt.h"
  23.  
  24. /* user code (top of parameter file) */
  25. const int_T gblNumToFiles = 0;
  26. const int_T gblNumFrFiles = 0;
  27. const int_T gblNumFrWksBlocks = 0;
  28.  
  29. /* Root inports information  */
  30. const int_T gblNumRootInportBlks = 0;
  31. const int_T gblNumModelInputs = 0;
  32. extern rtInportTUtable *gblInportTUtables;
  33. extern const char *gblInportFileName;
  34. const int_T gblInportDataTypeIdx[] = { -1 };
  35.  
  36. const int_T gblInportDims[] = { -1 } ;
  37.  
  38. const int_T gblInportComplex[] = { -1 };
  39.  
  40. const int_T gblInportInterpoFlag[] = { -1 };
  41.  
  42. const int_T gblInportContinuous[] = { -1 };
  43.  
  44. #include "simstruc.h"
  45. #include "fixedpoint.h"
  46.  
  47. /* Block signals (auto storage) */
  48. BlockIO rtB;
  49.  
  50. /* Continuous states */
  51. ContinuousStates rtX;
  52.  
  53. /* Block states (auto storage) */
  54. D_Work rtDWork;
  55.  
  56. /* Parent Simstruct */
  57. static SimStruct model_S;
  58. SimStruct *const rtS = &model_S;
  59.  
  60. /* Initial conditions for root system: '<Root>' */
  61. void MdlInitialize(void)
  62. {
  63.   /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn' */
  64.   rtX.TransferFcn_CSTATE = 0.0;
  65.  
  66.   /* InitializeConditions for DiscreteIntegrator: '<S1>/Filter' */
  67.   rtDWork.Filter_DSTATE = rtP.Filter_IC;
  68.  
  69.   /* InitializeConditions for DiscreteIntegrator: '<S1>/Integrator' */
  70.   rtDWork.Integrator_DSTATE = rtP.Integrator_IC;
  71. }
  72.  
  73. /* Start for root system: '<Root>' */
  74. void MdlStart(void)
  75. {
  76.   MdlInitialize();
  77. }
  78.  
  79. /* Outputs for root system: '<Root>' */
  80. void MdlOutputs(int_T tid)
  81. {
  82.   /* local block i/o variables */
  83.   real_T rtb_TransferFcn;
  84.  
  85.   {
  86.     real_T currentTime;
  87.     if (ssIsSampleHit(rtS, 1, 0)) {
  88.       /* Step: '<Root>/Step' */
  89.       currentTime = ssGetTaskTime(rtS,0);
  90.       if (ssIsMajorTimeStep(rtS)) {
  91.         if (currentTime >= rtP.Step_Time) {
  92.           rtDWork.Step_MODE = 1;
  93.         } else {
  94.           rtDWork.Step_MODE = 0;
  95.         }
  96.       }
  97.  
  98.       rtB.Step = rtDWork.Step_MODE == 1 ? rtP.Step_YFinal : rtP.Step_Y0;
  99.     }
  100.  
  101.     /* TransferFcn: '<Root>/Transfer Fcn' */
  102.     rtb_TransferFcn = rtP.TransferFcn_C*rtX.TransferFcn_CSTATE;
  103.  
  104.     /* Sum: '<Root>/Sum' */
  105.     rtB.Sum = rtB.Step - rtb_TransferFcn;
  106.     if (ssIsSampleHit(rtS, 2, 0)) {
  107.       /* Gain: '<S1>/Filter Coefficient' incorporates:
  108.        *  DiscreteIntegrator: '<S1>/Filter'
  109.        *  Gain: '<S1>/Derivative Gain'
  110.        *  Sum: '<S1>/SumD'
  111.        */
  112.       rtB.FilterCoefficient = ((real_T)rtP.DerivativeGain_Gain * rtB.Sum -
  113.         rtDWork.Filter_DSTATE) * (real_T)rtP.FilterCoefficient_Gain;
  114.  
  115.       /* Gain: '<S1>/Integral Gain' */
  116.       rtB.IntegralGain = (real_T)rtP.IntegralGain_Gain * rtB.Sum;
  117.  
  118.       /* Sum: '<S1>/Sum' incorporates:
  119.        *  DiscreteIntegrator: '<S1>/Integrator'
  120.        *  Gain: '<S1>/Proportional Gain'
  121.        */
  122.       rtB.Sum_e = ((real_T)rtP.ProportionalGain_Gain * rtB.Sum +
  123.                    rtDWork.Integrator_DSTATE) + rtB.FilterCoefficient;
  124.     }
  125.   }
  126.  
  127.   /* tid is required for a uniform function interface.
  128.    * Argument tid is not used in the function. */
  129.   UNUSED_PARAMETER(tid);
  130. }
  131.  
  132. /* Update for root system: '<Root>' */
  133. void MdlUpdate(int_T tid)
  134. {
  135.   if (ssIsSampleHit(rtS, 2, 0)) {
  136.     /* Update for DiscreteIntegrator: '<S1>/Filter' */
  137.     rtDWork.Filter_DSTATE = rtP.Filter_gainval * rtB.FilterCoefficient +
  138.       rtDWork.Filter_DSTATE;
  139.  
  140.     /* Update for DiscreteIntegrator: '<S1>/Integrator' */
  141.     rtDWork.Integrator_DSTATE = rtP.Integrator_gainval * rtB.IntegralGain +
  142.       rtDWork.Integrator_DSTATE;
  143.   }
  144.  
  145.   /* tid is required for a uniform function interface.
  146.    * Argument tid is not used in the function. */
  147.   UNUSED_PARAMETER(tid);
  148. }
  149.  
  150. /* Derivatives for root system: '<Root>' */
  151. void MdlDerivatives(void)
  152. {
  153.   /* Derivatives for TransferFcn: '<Root>/Transfer Fcn' */
  154.   {
  155.     ((StateDerivatives *) ssGetdX(rtS))->TransferFcn_CSTATE = rtB.Sum_e;
  156.     ((StateDerivatives *) ssGetdX(rtS))->TransferFcn_CSTATE +=
  157.       (rtP.TransferFcn_A)*rtX.TransferFcn_CSTATE;
  158.   }
  159. }
  160.  
  161. /* Projection for root system: '<Root>' */
  162. void MdlProjection(void)
  163. {
  164. }
  165.  
  166. /* InitSystemMatrices for root system: '<Root>' */
  167. void MdlInitSystemMatrices(void)
  168. {
  169. }
  170.  
  171. /* ZeroCrossings for root system: '<Root>' */
  172. void MdlZeroCrossings(void)
  173. {
  174.   /* ZeroCrossings for Step: '<Root>/Step' */
  175.   ((ZCSignalValues *) ssGetSolverZcSignalVector(rtS))->Step_StepTime_ZC = ssGetT
  176.     (rtS) - rtP.Step_Time;
  177. }
  178.  
  179. /* Termination for root system: '<Root>' */
  180. void MdlTerminate(void)
  181. {
  182. }
  183.  
  184. /* Function to initialize sizes */
  185. void MdlInitializeSizes(void)
  186. {
  187.   ssSetNumContStates(rtS, 1);          /* Number of continuous states */
  188.   ssSetNumY(rtS, 0);                   /* Number of model outputs */
  189.   ssSetNumU(rtS, 0);                   /* Number of model inputs */
  190.   ssSetDirectFeedThrough(rtS, 0);      /* The model is not direct feedthrough */
  191.   ssSetNumSampleTimes(rtS, 3);         /* Number of sample times */
  192.   ssSetNumBlocks(rtS, 12);             /* Number of blocks */
  193.   ssSetNumBlockIO(rtS, 5);             /* Number of block outputs */
  194.   ssSetNumBlockParams(rtS, 13);        /* Sum of parameter "widths" */
  195. }
  196.  
  197. /* Function to initialize sample times. */
  198. void MdlInitializeSampleTimes(void)
  199. {
  200.   /* task periods */
  201.   ssSetSampleTime(rtS, 0, 0.0);
  202.   ssSetSampleTime(rtS, 1, 0.0);
  203.   ssSetSampleTime(rtS, 2, 0.01);
  204.  
  205.   /* task offsets */
  206.   ssSetOffsetTime(rtS, 0, 0.0);
  207.   ssSetOffsetTime(rtS, 1, 1.0);
  208.   ssSetOffsetTime(rtS, 2, 0.0);
  209. }
  210.  
  211. /* Function to register the model */
  212. SimStruct * ControlPID(void)
  213. {
  214.   static struct _ssMdlInfo mdlInfo;
  215.   (void) memset((char *)rtS,0,
  216.                 sizeof(SimStruct));
  217.   (void) memset((char *)&mdlInfo,0,
  218.                 sizeof(struct _ssMdlInfo));
  219.   ssSetMdlInfoPtr(rtS, &mdlInfo);
  220.  
  221.   /* timing info */
  222.   {
  223.     static time_T mdlPeriod[NSAMPLE_TIMES];
  224.     static time_T mdlOffset[NSAMPLE_TIMES];
  225.     static time_T mdlTaskTimes[NSAMPLE_TIMES];
  226.     static int_T mdlTsMap[NSAMPLE_TIMES];
  227.     static int_T mdlSampleHits[NSAMPLE_TIMES];
  228.     static boolean_T mdlTNextWasAdjustedPtr[NSAMPLE_TIMES];
  229.     static int_T mdlPerTaskSampleHits[NSAMPLE_TIMES * NSAMPLE_TIMES];
  230.     static time_T mdlTimeOfNextSampleHit[NSAMPLE_TIMES];
  231.  
  232.     {
  233.       int_T i;
  234.       for (i = 0; i < NSAMPLE_TIMES; i++) {
  235.         mdlPeriod[i] = 0.0;
  236.         mdlOffset[i] = 0.0;
  237.         mdlTaskTimes[i] = 0.0;
  238.         mdlTsMap[i] = i;
  239.         mdlSampleHits[i] = 1;
  240.       }
  241.     }
  242.  
  243.     ssSetSampleTimePtr(rtS, &mdlPeriod[0]);
  244.     ssSetOffsetTimePtr(rtS, &mdlOffset[0]);
  245.     ssSetSampleTimeTaskIDPtr(rtS, &mdlTsMap[0]);
  246.     ssSetTPtr(rtS, &mdlTaskTimes[0]);
  247.     ssSetSampleHitPtr(rtS, &mdlSampleHits[0]);
  248.     ssSetTNextWasAdjustedPtr(rtS, &mdlTNextWasAdjustedPtr[0]);
  249.     ssSetPerTaskSampleHitsPtr(rtS, &mdlPerTaskSampleHits[0]);
  250.     ssSetTimeOfNextSampleHitPtr(rtS, &mdlTimeOfNextSampleHit[0]);
  251.   }
  252.  
  253.   ssSetSolverMode(rtS, SOLVER_MODE_SINGLETASKING);
  254.  
  255.   /*
  256.    * initialize model vectors and cache them in SimStruct
  257.    */
  258.  
  259.   /* block I/O */
  260.   {
  261.     ssSetBlockIO(rtS, ((void *) &rtB));
  262.     (void) memset(((void *) &rtB),0,
  263.                   sizeof(BlockIO));
  264.   }
  265.  
  266.   /* parameters */
  267.   ssSetDefaultParam(rtS, (real_T *) &rtP);
  268.  
  269.   /* states (continuous)*/
  270.   {
  271.     real_T *x = (real_T *) &rtX;
  272.     ssSetContStates(rtS, x);
  273.     (void) memset((void *)x,0,
  274.                   sizeof(ContinuousStates));
  275.   }
  276.  
  277.   /* states (dwork) */
  278.   {
  279.     void *dwork = (void *) &rtDWork;
  280.     ssSetRootDWork(rtS, dwork);
  281.     (void) memset(dwork, 0,
  282.                   sizeof(D_Work));
  283.   }
  284.  
  285.   /* data type transition information */
  286.   {
  287.     static DataTypeTransInfo dtInfo;
  288.     (void) memset((char_T *) &dtInfo,0,
  289.                   sizeof(dtInfo));
  290.     ssSetModelMappingInfo(rtS, &dtInfo);
  291.     dtInfo.numDataTypes = 14;
  292.     dtInfo.dataTypeSizes = &rtDataTypeSizes[0];
  293.     dtInfo.dataTypeNames = &rtDataTypeNames[0];
  294.  
  295.     /* Block I/O transition table */
  296.     dtInfo.B = &rtBTransTable;
  297.  
  298.     /* Parameters transition table */
  299.     dtInfo.P = &rtPTransTable;
  300.   }
  301.  
  302.   /* Model specific registration */
  303.   ssSetRootSS(rtS, rtS);
  304.   ssSetVersion(rtS, SIMSTRUCT_VERSION_LEVEL2);
  305.   ssSetModelName(rtS, "ControlPID");
  306.   ssSetPath(rtS, "ControlPID");
  307.   ssSetTStart(rtS, 0.0);
  308.   ssSetTFinal(rtS, 1.0);
  309.  
  310.   /* Setup for data logging */
  311.   {
  312.     static RTWLogInfo rt_DataLoggingInfo;
  313.     ssSetRTWLogInfo(rtS, &rt_DataLoggingInfo);
  314.   }
  315.  
  316.   /* Setup for data logging */
  317.   {
  318.     rtliSetLogXSignalInfo(ssGetRTWLogInfo(rtS), (NULL));
  319.     rtliSetLogXSignalPtrs(ssGetRTWLogInfo(rtS), (NULL));
  320.     rtliSetLogT(ssGetRTWLogInfo(rtS), "tout");
  321.     rtliSetLogX(ssGetRTWLogInfo(rtS), "");
  322.     rtliSetLogXFinal(ssGetRTWLogInfo(rtS), "");
  323.     rtliSetSigLog(ssGetRTWLogInfo(rtS), "");
  324.     rtliSetLogVarNameModifier(ssGetRTWLogInfo(rtS), "rt_");
  325.     rtliSetLogFormat(ssGetRTWLogInfo(rtS), 0);
  326.     rtliSetLogMaxRows(ssGetRTWLogInfo(rtS), 1000);
  327.     rtliSetLogDecimation(ssGetRTWLogInfo(rtS), 1);
  328.     rtliSetLogY(ssGetRTWLogInfo(rtS), "");
  329.     rtliSetLogYSignalInfo(ssGetRTWLogInfo(rtS), (NULL));
  330.     rtliSetLogYSignalPtrs(ssGetRTWLogInfo(rtS), (NULL));
  331.   }
  332.  
  333.   {
  334.     static ssSolverInfo slvrInfo;
  335.     static boolean_T contStatesDisabled[1];
  336.     static real_T solverAbsTol[1] = { 1.0E-006 };
  337.  
  338.     static boolean_T solverAutoAbsTol[1] = { 1 };
  339.  
  340.     static uint8_T zcAttributes[1] = { (ZC_EVENT_ALL_UP) };
  341.  
  342.     static ssNonContDerivSigInfo nonContDerivSigInfo[1] = {
  343.       { 1*sizeof(real_T), (char*)(&rtB.Sum_e), (NULL) }
  344.     };
  345.  
  346.     ssSetSolverRelTol(rtS, 0.001);
  347.     ssSetSolverAbsTol(rtS, solverAbsTol);
  348.     ssSetSolverAutoAbsTol(rtS, solverAutoAbsTol);
  349.     ssSetStepSize(rtS, 0.0);
  350.     ssSetMinStepSize(rtS, 0.0);
  351.     ssSetMaxNumMinSteps(rtS, -1);
  352.     ssSetMinStepViolatedError(rtS, 0);
  353.     ssSetMaxStepSize(rtS, 0.01);
  354.     ssSetSolverMaxOrder(rtS, -1);
  355.     ssSetSolverRefineFactor(rtS, 1);
  356.     ssSetOutputTimes(rtS, (NULL));
  357.     ssSetNumOutputTimes(rtS, 0);
  358.     ssSetOutputTimesOnly(rtS, 0);
  359.     ssSetOutputTimesIndex(rtS, 0);
  360.     ssSetZCCacheNeedsReset(rtS, 0);
  361.     ssSetDerivCacheNeedsReset(rtS, 0);
  362.     ssSetNumNonContDerivSigInfos(rtS, 1);
  363.     ssSetNonContDerivSigInfos(rtS, nonContDerivSigInfo);
  364.     ssSetSolverInfo(rtS, &slvrInfo);
  365.     ssSetSolverName(rtS, "ode45");
  366.     ssSetVariableStepSolver(rtS, 1);
  367.     ssSetSolverConsistencyChecking(rtS, 0);
  368.     ssSetSolverAdaptiveZcDetection(rtS, 0);
  369.     ssSetSolverRobustResetMethod(rtS, 0);
  370.     ssSetSolverStateProjection(rtS, 0);
  371.     ssSetSolverMassMatrixType(rtS, (ssMatrixType)0);
  372.     ssSetSolverMassMatrixNzMax(rtS, 0);
  373.     ssSetModelOutputs(rtS, MdlOutputs);
  374.     ssSetModelLogData(rtS, rt_UpdateTXYLogVars);
  375.     ssSetModelUpdate(rtS, MdlUpdate);
  376.     ssSetModelDerivatives(rtS, MdlDerivatives);
  377.     ssSetSolverZcSignalAttrib(rtS, zcAttributes);
  378.     ssSetSolverNumZcSignals(rtS, 1);
  379.     ssSetModelZeroCrossings(rtS, MdlZeroCrossings);
  380.     ssSetSolverConsecutiveZCsStepRelTol(rtS, 2.8421709430404007E-013);
  381.     ssSetSolverMaxConsecutiveZCs(rtS, 1000);
  382.     ssSetSolverConsecutiveZCsError(rtS, 2);
  383.     ssSetSolverMaxConsecutiveMinStep(rtS, 1);
  384.     ssSetSolverShapePreserveControl(rtS, 2);
  385.     ssSetTNextTid(rtS, INT_MIN);
  386.     ssSetTNext(rtS, rtMinusInf);
  387.     ssSetSolverNeedsReset(rtS);
  388.     ssSetNumNonsampledZCs(rtS, 1);
  389.     ssSetContStateDisabled(rtS, contStatesDisabled);
  390.     ssSetSolverMaxConsecutiveMinStep(rtS, 1);
  391.   }
  392.  
  393.   ssSetChecksumVal(rtS, 0, 159084874U);
  394.   ssSetChecksumVal(rtS, 1, 215820345U);
  395.   ssSetChecksumVal(rtS, 2, 994859013U);
  396.   ssSetChecksumVal(rtS, 3, 1666355192U);
  397.   return rtS;
  398. }
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 09 de Marzo de 2010, 21:37:20
Que chulo!!

Si disminuyes el tiempo de muestreo, disminuirá el sobrepaso máximo ... como para que quede un poco mas sobreamortiguado
Título: Re: PID Digital (paso a paso)
Publicado por: NANO1985 en 10 de Mayo de 2010, 18:11:06
hasta ahora siempre los diseños de PIDs,... siempre lo vi en base a hornos y demas, donde la respuesta temporal es muy lenta.... pero que pasa si se requiere hacer un control PID, donde la respuesta para correjir el error debe ser lo más rápida posible, y no es posible hacer una prueba manual del sistema.
como se hace para determinar las componentes de la ecuacion PID?
saludos
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 10 de Mayo de 2010, 18:46:23
Hola.

Si la respuesta debe ser rápida, lo mejor es buscar otro algoritmo de control ... el PID tiene sus cosas ...

Para sintonizar teóricamente creo que se iguala el polinomio del controlador y la planta con el polinomio característico deseado.

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: NANO1985 en 10 de Mayo de 2010, 18:49:55
me mataste MLO_ jajajaja  :D
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 10 de Mayo de 2010, 19:04:54
jeje ...

El polinomio característico deseado sería:

$ P(z) = 1 + G_{c}(z)G_{p}(z)

en donde:
Gc(z) : Función de transferencia del controlador
Gp(z) : Función de transferencia de la planta

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 01 de Octubre de 2010, 06:02:19
Al comienzo de este hilo se describe un ejemplo de control de temperatura de un horno. Para obtener la función de la planta, se enciende la resistencia del horno, y se toman valores de temperatura cada cierto intervalo de tiempo.

Pero, si en lugar de calentar, quiero enfriar un disipador, como tengo que tomar esas lecturas de temperatura? Haciendo que se caliente el disipador, y una vez caliente quitar la fuente de calor, poner el ventilador en marcha, y a partir de ahí tomar valores de temperatura?

O poniendo en marcha el ventilador y la fuente de calor al tiempo, y tomar valores?

Saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: Suky en 01 de Octubre de 2010, 08:44:07
Como en realidad va a funcionar el sistema, lo que tu quieres es encontrar un modelo matemático de la dinámica del sistema. Si los 2 se mantienen encendidos al mismo tiempo, no creo, la obtienes de esa manera.


Saludos!
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 02 de Octubre de 2010, 20:38:29
Hola.

En tu sistema la fuente de calor va a estar presente? si es así, debe estar a la hora de tomar los datos.

El sistema de refrigeración debe "sacar" el calor necesario para mantener la temperatura mínima establecida, por ello el sistema de refrigeración debe ser mas eficiente que el sistema que entrega calor (por ello se usan disipadores con aletas y conveccion forzada), si no ... no habrá controlador que te sirva  ;-)

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: cdanielm_58 en 05 de Noviembre de 2010, 14:16:22
Hola amigo. He seguido tus pasos casi al pie de la letra y todo está bien hasta que me llegaron unos inconvenientes.

Primero, como dices que usaste el metodo de ragazzini si por favor me indicas que es el essp y como hallar Zita ahh y lo de los polos que en tiempo discreto no se como es.

Lo segundo, es que como mi docente me dice que para hallar la verdadera función de transferencia de mi planta tengo que hacer varias muestras con varias entradas, me explico. Uso un bombillo de 9v (Exploradora) para calentar mi caja a la que mido la temperatura y la muestro en el ordenador con JAVA a traves de USB con un PIC 2550, pero ahora tengo que cambiar por un bombillo de 110V para hacer muestras con 50V 30V 60V, etc.

Me dicen que tengo que usar PWM porque la señal de entrada es análoga y tendria que pasarla a DC y para regularla a través del PIC se usa el Triger, pero todavía estoy corto en eso.... si me puedes dar un empujoncito te lo agradezco.
Título: Re: PID Digital (paso a paso)
Publicado por: MLO__ en 05 de Noviembre de 2010, 17:32:50
Hola.

Seria mejor hacer control de fase, de esa manera puedes obtener el valor del voltaje en función del ángulo de disparo (V_RMS (http://es.wikipedia.org/wiki/Corriente_alterna))

Saludos
Título: Re: PID Digital (paso a paso)
Publicado por: loqui en 06 de Julio de 2011, 10:37:18
Hola a todos, una pregunta para el amigo nocturno por este comentario:

"Os dejo unas capturas del modelo PID que ha calculado MATLAB y el código generado.
Seguiré informando, porque ahora toca implementarlo en mi montaje real."

Quería saber si ha logrado implementar el controlador en su modelo real, también preguntar como obtener la función de transferencia con los valores P, I, D, N, calculados con el matlab  “los que se muestra en la figura ”
 
Y como se obtiene la ecuación en diferencias a partir de estos valores.
Otra cosa, el código en C generado por el matlab como se puede  programar en el pic.

Título: Re: PID Digital (paso a paso)
Publicado por: phantom879 en 31 de Octubre de 2011, 20:46:59
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)

(http://img19.imageshack.us/img19/1746/piddigitalf1yy2.th.jpg) (http://img19.imageshack.us/my.php?image=piddigitalf1yy2.jpg)
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)

(http://img209.imageshack.us/img209/7956/piddigitalf2jn7.th.jpg) (http://img209.imageshack.us/my.php?image=piddigitalf2jn7.jpg)
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)

(http://img187.imageshack.us/img187/1171/piddigitalf3ig7.th.jpg) (http://img187.imageshack.us/my.php?image=piddigitalf3ig7.jpg)
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....





Saludos a todos, tengo una duda elemental, ¿por qué al usar una entrada escalón unitario, ese vector tiene valores que van creciendo de 0 a el max del escalón?
un escalón unitario no es un único valor para todo tiempo?, estoy sumamente confundido en algo tan elemental :'(
Título: Re: PID Digital (paso a paso)
Publicado por: phantom879 en 31 de Octubre de 2011, 23:48:58
Hola ...

Para poder estimar un sistema con matlab se utiliza la herramienta IDENT .. esta es muy facil de usar, lo que se necesita es lo siguiente:

-> un vector de entradas (x) ... la señal de estimulo que aplicaste al sistema
-> un vector de salidas (y) ... la señal de respuesta que obtuviste del sistema al aplicar la señal de entrada
-> un vector de tiempo (t) ... los tiempos de cada muestra, deben ser constantes, es decir, 1, 2, 3, 4 segundos etc ... y no 1, 1.5, 2, 3, 5, 8 .. etc..

Con eso IDENT identificará el sistema que se encuentra adentro.

(http://img218.imageshack.us/img218/551/sist1zd9.jpg)

Lo que necesitas es una señal de prende o apaga el bombillo .. o bien una señal de volaje RMS que le aplicas al bombillo, luego debes medir en tiempo real el comportamiento de la temperatura ante la señal. Un escalon como lo estas haciendo, es posible, sin embargo solo tenes el comportamiento de calentar y no de enfriar.

Para poner a prueba el IDENT me inventé un sistema tipico y muy facil de entender .. un filtro pasobajos RC de primer orden, representado en Laplace como:

\begin{equation}
G(s) = \frac{1}{1 + 0.001s}
\end{equation}

Es decir R = 1k y C = 1uF ... siendo tau = 1ms;


>> R = 1000
>> C = 1e-6
>> G = tf( 1, [R*C 1] )


Lo que voy hacer es inventar un vector de entradas, estimulare el sistema con esas entradas y utilizaré IDENT para identificar el sistema; lo ideal es que obtenga un resultado como en de la ecuacion anterior. En el caso practico, no conozco la ecuación del sistema, pero lo que se acostumbra es estimular el sistema con diferentes vectores de entrada y estimar varios modelos y comparar el resultado con los otros vectores.

Como mencioné, es necesario que tenga un vector de datos de entrada y ver la respuesta del sistema (salida) ante esa entrada, el mejor vector de entrada es aquel que tenga un buen contenido de frecuencia, ruido por ejemplo; sin embargo, dependiendo del sistema esto se complica, por ejemplo, en un motor; lo recomendable es estimar el modelo matemáticamente y ver que frecuencias son las aptas para crear una señal de estímulo; por ejemplo, el modelo de un motor es parecido a un filtro pasobajos, entonces utilizamos una señal que contenga componentes de frecuencia dentro del ancho de banda del motor.

Como en este caso, el ejemplo es simulado, utilizo la función RAND para generar un vector de entrada aleatorio de 100 muestras:

>> x = rand([100, 1])

(http://img220.imageshack.us/img220/5128/entradaxs3.jpg)

Esta es mi señal de entrada, ahora, necesito el vector de salida, estimularé el sistema con la función LSIM, entre los datos de esta funcion está el vector de tiempo. Aqui voy a utilizar tiempo discreto y elejiré que el tiempo de muestreo sea un décimo de la constante de tiempo del sistema (tau = RC); en este caso, ts = 0.1ms. Genero un vector de tiempo de 100 datos desde 0 hasta 99*0.1e-3.

>> n = (0:99)'
>> ts = 0.1e-3
>> t = n*ts


Ahora utilizo LSIM ....

>> y = lsim(G, x, t)

La grafica que obtengo en el tiempo es:

(http://img220.imageshack.us/img220/9757/salidaspr6.jpg)

donde la linea azul es la entrada y la linea verde es la salida, veran que esta filtrada.

Ya tengo listo mi vector de entrada, salida y tiempo; esto es lo que tendria en la practica, una señal de entrada, el comportamiento de la salida y el tiempo en que fue tomado cada dato.  En el caso de la temperatura, el vector de entrada seria pulsos rectangulares, que me dicen cuando se prendio el bombillo y cuando permanecio apagado; la salida seria el aumento de temperatura y la disminucion de temperatura, el tiempo seria cada cuanto tome la muestra, como es temperatura puede ser de 1 o 3seg, constantes y no interrumpidos ... en este caso, tomar los datos a reloj en mano no es conveniente.

Yo conozco el sistema; sin embargo, la idea es estimar el sistema en tiempo discreto utilizando el vector de entrada, salida y tiempo; luego transformar el sistema a tiempo continuo y comparar.

Ejecuto IDENT

>>ident

Y aparece una pantalla como la siguiente:

(http://img220.imageshack.us/img220/2124/ident1xz8.jpg)

Lo que hacemos es en IMPORT DATA seleccionamos TIME DOMAIN DATA ... esto porque nuestros datos de entrada, salida y tiempo estan en el tiempo. Aparece un cuadro como asi:

(http://img220.imageshack.us/img220/1276/ident2wy0.jpg)

Y lo lleno con la informacion que tengo, entrada (x), salida (y), tiempo de inicio (0), tiempo entre muestras (ts) como lo hice en la figura. Damos IMPORT ..

(http://img220.imageshack.us/img220/1257/iden3xn4.jpg)

En la columna de cuadros izquierda me aparece el bloque de datos que cargue en IDENT; ahi puedo cargar la cantidad de datos que desee y puedo combinar datos como de estimulo y verificacion, esto es que con un conjunto de datos puedo estimar el sistema y con otro conjunto puedo verificar si la estimacion está correcta.

Ahora, sobre ESTIMATE damos LINER PARAMETRIC MODELS ... aqui escogemos el método de estimación que mas nos guste o que mejor de resultados, sobre el tipo de estimador se puede encontrar información en internet:

http://www.ie.itcr.ac.cr/einteriano/control2/Laboratorio/3.Models.pdf (http://www.ie.itcr.ac.cr/einteriano/control2/Laboratorio/3.Models.pdf)

Yo elejí ARX tanto de orden 1 como de orden 2 ... entre mas orden es mejor la estimación; sin embargo, hay un compromiso, pues estimar un compensador para un sistema que tiene un orden alto es mas dificil que para uno bajo, entonces escogemos el modelo de menor orden. Seleccionando la casilla MODEL OUTPUT aparecerá una gráfica que nos dice cual modelo es el que mejor se ajusta a los datos de salida. Vemos que con el modelo de 1º orden tenemos un ajuste de 100.

(http://img294.imageshack.us/img294/4262/ident5kn6.jpg)

Ahora arrastramos el cuadro que dice ARX111 de la columna derecha sobre el cuadro TO WORKSPACE ... eso hara que los datos del modelo lo tengamos en la linea de comando. Para ver el modelo ejecutamos:

>> H = tf(arx111)
 
Transfer function from input "u1" to output "y1":
 0.09516
----------
z - 0.9048
 
Transfer function from input "v@y1" to output "y1":
1.665e-016 z
------------
 z - 0.9048
 
Input groups:           
      Name      Channels
    Measured       1   
     Noise         2   
                       
Sampling time: 0.0001


Entonces nuestro modelo estimado en tiempo discreto es:

\begin{equation}
G(z) = \frac{0.09516}{z - 0.9048}
\end{equation}

Usamos:

>> G2 = d2c(H)

y obtenemos:

\begin{equation}
G(s) = \frac{1000}{s + 1000}
\end{equation}

Vemos que IDENT identificó el sistema correctamente ...  Utilizando este modelo podemos usar SISOTOOL y calcular de manera sencilla un compensador  :)

Saludos y espero que les sirva de algo!

PD: Espero sus comentarios y estamos listos para la implementación PID en un PIC!


Buenas, tengo una duda muy grande, cuando explicas tu procedimiento usando ident, partes de la FT de un filtro, no sé si estoy interpretando mal, pero cómo hago para hallar la FT de la planta partiendo de nada, estoy muy confundido :s
Título: Re: PID Digital (paso a paso)
Publicado por: Suky en 01 de Noviembre de 2011, 01:11:26
Busca sobre identificación de sistemas.


Saludos!
Título: Re: PID Digital (paso a paso)
Publicado por: b3rsui en 13 de Agosto de 2012, 14:34:06
Hola gente! Como andan? Bueno tengo una duda en concreto que no logro identificar.

Eh seguido los pasos para hallar la funcion que describa el comportamiento de mi sistema (horno) el cual planeo controlarlo mediante un control PID. El tema es que no entiendo como encontrar los valores de Kd, Ki y Kp. Por favor les ruego me iluminen en este sentido.

Eh levantado la curva de temperatura del horno cada 5 segundos y mediante el metodo explicado por krakc eh obtenido que:

y(t) = -1841/20000*exp(377/10000*t)+2639/50*exp(997/100000*t)

Y(S) = 7/2*(15053700000*s-568253789)/(10000*s-377)/(100000*s-997) 

Luego mi funcion transferencia sera:

                 52.69 s^2 - 1.989 s
H(S) = ----------------------------------
           s^2 - 0.04767 s + 0.0003759

Finalmente la transformada Z

Transfer function:
52.69 z^2 - 105.4 z + 52.71
---------------------------
       z^2 - 2 z + 1
 
Sampling time: 0.01

Pero no entiendo de donde y como sacar las constantes que me refiero.

Bueno si alguien puede orientarme en el lio que tengo de conceptos se lo voy a agradecer.

Saludos a todos y continuen asi!
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 21 de Junio de 2014, 15:45:04
Retomo este tema para practicar un poco, resulta que encontré esto por casualidad y me puse a recordar los sistemas de control:

http://real2electronics.blogspot.com.es/2011/07/maqueta-de-control-pid-con-arduino.html

he echo ese mismo montaje con un envase de aceitunas, y con seis resistencias de 10homios, dos grupos de tres en serie puestas en paralelo, total 15homios. Y para medir la temperatura NTC de 10K al positivo, con una resistencia de 3k3 a masa, midiendo en la de fija de 3k3.

Con eso obtengo los siguientes datos:
Código: [Seleccionar]
tiempo=[0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210];

%son voltios de un divisor, ntc 10k al positivo, 3k3 a masa.
%medido en la de 3k3 a masa.
temperatura=[4.77 4.69 4.61 4.51 4.40 4.29 4.14 4.04 3.94 3.86 3.78 3.70 3.64 3.60 3.55 3.51 3.49 3.46 3.40 3.36 3.34 3.34];
plot(tiempo,temperatura)

%en eje x tiempo. Eje y voltios o temperatura.


Me voy a curvefitting y obtengo lo siguiente:

Código: [Seleccionar]
syms t
a =      3.406;
b =     -0.1962;
c =      0.3603;
d =      0.5446;
yt = a*exp(b*t) + c*exp(d*t)
YS = laplace (yt)



%yt =
 
%(1703*exp(-(981*t)/5000))/500 + (3603*exp((2723*t)/5000))/10000
 
 
%YS =
 
%1703/(500*(s + 981/5000)) + 3603/(10000*(s - 2723/5000))

introduzco la función de tranasferencia multiplicado por 's':

Código: [Seleccionar]
g1=tf([1703 0],[500 500* 981/5000])
g2=tf([3603 0],[10000 -(10000*( 2723/5000))])
g=g1+g2
%rltool(g)
step(g)

y resulta un sistema inestable, tiene un polo en positivo.

Para obtener la función de la planta he puesto tensión en las resistencias, he esperado que se calienten, y luego he puesto en marcha el ventilador y cada 10 segundos he tomado un valor de voltaje en la resistencia de 3k3, es correcto ¿no? ¿alguna idea?

Saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 23 de Junio de 2014, 13:07:39
Bueno, he modelado mi planta como he podido segun dice Blackcat al inicio de este hilo (faltan imagenes, el post es antiguo  :D), y he obtenido esta funcion de transferencia que es estable:

Código: [Seleccionar]
K =0.94116;
 
Tp1 = 6.2583e-05;
 
Tp2 =1.9424;
 
num = K;
 
den = conv([Tp1 1],[Tp2 1]);
 
sys = tf(num,den)

%sys =
 
%            0.9412
%  ---------------------------
%  0.0001216 s^2 + 1.942 s + 1

Lo que ocurre es que mi sistema al ser de enfriamiento es inverso, y si hago un step(sys) la respuesta es creciente, va de 0 a 1, en lugar de 1 a 0, ó ¿es correcto y tiene que ser de 0 a 1?

Saludos!!
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 25 de Junio de 2014, 18:09:56
Creo que no lo estoy haciendo bien... segun dice blackcat hace falta una señal de entrada, una de salida y una base de tiempo, cual serian estos en mi sistema:

- Entrada: ¿Valores aumentando el voltaje del ventilador?

- Salida: ¿La lectura de temperatura?

- Base de tiempo: ¿tiempos entre los que cambio-mido voltaje-temperatura?

Y, ¿tendria que esperar a que se estabilice la temperatura para cada incremento de voltaje?

Saludos!!
Título: Re: PID Digital (paso a paso)
Publicado por: jhozate en 25 de Junio de 2014, 19:23:36
hola , no he leido el post completo, pero cuando tuve que identificar una planta de nivel de agua usando matlab tuve que hacer lo siguiente:
-tomar como T0(tiempo cero) el tanque vacio y medir el voltaje de salida de mi sensor
-empezar a llenar hasta cierto nivel, y tomar el tiempo que tardó en llegar a ese nivel y medir el voltaje de salida del sensor
-así mismo para las siguientes muestras

Matlab modela con parámetros en el dominio del tiempo, asi que usé el comando "Ident" y le pase los parametros en forma de vector del tiempo y el voltaje



Título: Re: PID Digital (paso a paso)
Publicado por: Picuino en 26 de Junio de 2014, 07:40:15
¿No puedes ajustar el PID a mano? Creo que será más sencillo.

Un problema que te vas a encontrar en el ventilador, es que su comportamiento no es lineal. ¿Lo estás controlando con tensión o con PWM?

Saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: QIQE en 26 de Junio de 2014, 08:14:56
ojo, que con los sistemas por aire, en ocasiones hay que aplicar soluciones anti WIND-UP.
un ejemplo.

Click Click (http://www.elai.upm.es/webantigua/spain/Asignaturas/ControlProcesos/archivos/Practicas/Practica_1.pdf)
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 26 de Junio de 2014, 14:59:01
hola , no he leido el post completo, pero cuando tuve que identificar una planta de nivel de agua usando matlab tuve que hacer lo siguiente:
-tomar como T0(tiempo cero) el tanque vacio y medir el voltaje de salida de mi sensor
-empezar a llenar hasta cierto nivel, y tomar el tiempo que tardó en llegar a ese nivel y medir el voltaje de salida del sensor
-así mismo para las siguientes muestras

Matlab modela con parámetros en el dominio del tiempo, asi que usé el comando "Ident" y le pase los parametros en forma de vector del tiempo y el voltaje

Sí, pero en la herramienta ident pide tres variables: entrada, salida y tiempo (mira la imagen adjunta)

Yo tengo como salida el array de temperatura, y como tiempo desde 0 en pasos de 10seg. ¿que pongo como entrada? sin array de entrada no se puede ejecutar "process models".

¿No puedes ajustar el PID a mano? Creo que será más sencillo.

Un problema que te vas a encontrar en el ventilador, es que su comportamiento no es lineal. ¿Lo estás controlando con tensión o con PWM?

Saludos.

La idea es aprender a utilizar ident para encontrar la función de transferencia de una planta y rltool para calcular el controlador.

De momento estoy usando voltaje para controlarlo, luego será un PWM de salida de un micro.

ojo, que con los sistemas por aire, en ocasiones hay que aplicar soluciones anti WIND-UP.
un ejemplo.

Click Click (http://www.elai.upm.es/webantigua/spain/Asignaturas/ControlProcesos/archivos/Practicas/Practica_1.pdf)


Lo tendré en cuenta, de momento necesito la planta.

Saludos!!
Título: Re: PID Digital (paso a paso)
Publicado por: ppyote en 26 de Junio de 2014, 15:13:30
Yo probé a hacer un control PID para controlar la temperatura de un disipador de pc y acabé volviendome loco
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 26 de Junio de 2014, 15:17:02
Yo probé a hacer un control PID para controlar la temperatura de un disipador de pc y acabé volviendome loco

Yo estoy medio majareta ya  :D :D
Título: Re: PID Digital (paso a paso)
Publicado por: ppyote en 26 de Junio de 2014, 17:07:33
Micro_pepe sí consigues encarrilar el tema, te llevarás un gran aplauso por mi parte :):):)
Título: Re: PID Digital (paso a paso)
Publicado por: jhozate en 27 de Junio de 2014, 13:51:17
bueno, estaba leyendo los otros mensajes y creería que el método para identificar no es el correcto, pienso lo siguiente:
como de entrada se sabe que las resistencias estan calientes , entonces aplicaría por ejemplo 2v al ventilador y tomaría los datos estables, luego aumentaria en 2v el voltaje aplicado al ventilador y tomo datos, y así tomaría N muestras, pienso que ese seria el camino, pero no me aclaro con la toma del tiempo
Título: Re: PID Digital (paso a paso)
Publicado por: Picuino en 27 de Junio de 2014, 14:42:03

Yo tengo como salida el array de temperatura, y como tiempo desde 0 en pasos de 10seg. ¿que pongo como entrada? sin array de entrada no se puede ejecutar "process models".

La idea es aprender a utilizar ident para encontrar la función de transferencia de una planta y rltool para calcular el controlador.


La planta será muy parecida a un sistema con un polo.

Puedes calentar las resistencias hasta que la temperatura sea estable sin tensión en el ventilador  (Vin = 0v)

Luego pones en marcha el ventilador con 6 voltios y tomas medidas cada segundo:

Vin   = [6     6       6      6       6      6      6      6     6      6      6      6       6      ....
Vout = [4     3.8    3.5    3.2    2.9   2.6    2.3   2.1   1.9   1.8    1.7   1.6    1.6    ....


El array de entrada es la tensión del ventilador.

Saludos.
Título: Re: PID Digital (paso a paso)
Publicado por: micro_pepe en 28 de Junio de 2014, 16:46:20

Yo tengo como salida el array de temperatura, y como tiempo desde 0 en pasos de 10seg. ¿que pongo como entrada? sin array de entrada no se puede ejecutar "process models".

La idea es aprender a utilizar ident para encontrar la función de transferencia de una planta y rltool para calcular el controlador.


La planta será muy parecida a un sistema con un polo.

Puedes calentar las resistencias hasta que la temperatura sea estable sin tensión en el ventilador  (Vin = 0v)

Luego pones en marcha el ventilador con 6 voltios y tomas medidas cada segundo:

Vin   = [6     6       6      6       6      6      6      6     6      6      6      6       6      ....
Vout = [4     3.8    3.5    3.2    2.9   2.6    2.3   2.1   1.9   1.8    1.7   1.6    1.6    ....


El array de entrada es la tensión del ventilador.

Saludos.

Muchas gracias a todos!!

Con ese dato he conseguido llegar a buen puerto, o eso creo, el invento mantiene la temperatura al nivel indicado.

Dejo todo esto documentado por si le sirve a alguien  ;-)

Saludos!!

http://www.4shared.com/rar/sAJauyd8ce/PID_Inverso_enfriador.html
Título: Re: PID Digital (paso a paso)
Publicado por: MGLSOFT en 28 de Junio de 2014, 20:40:13

Yo tengo como salida el array de temperatura, y como tiempo desde 0 en pasos de 10seg. ¿que pongo como entrada? sin array de entrada no se puede ejecutar "process models".

La idea es aprender a utilizar ident para encontrar la función de transferencia de una planta y rltool para calcular el controlador.


La planta será muy parecida a un sistema con un polo.

Puedes calentar las resistencias hasta que la temperatura sea estable sin tensión en el ventilador  (Vin = 0v)

Luego pones en marcha el ventilador con 6 voltios y tomas medidas cada segundo:

Vin   = [6     6       6      6       6      6      6      6     6      6      6      6       6      ....
Vout = [4     3.8    3.5    3.2    2.9   2.6    2.3   2.1   1.9   1.8    1.7   1.6    1.6    ....


El array de entrada es la tensión del ventilador.

Saludos.

Muchas gracias a todos!!

Con ese dato he conseguido llegar a buen puerto, o eso creo, el invento mantiene la temperatura al nivel indicado.

Dejo todo esto documentado por si le sirve a alguien  ;-)

Saludos!!

http://www.4shared.com/rar/sAJauyd8ce/PID_Inverso_enfriador.html

No puedo descargarlo ya que no tengo mas cuneta en 4shared y no quiero volver a registrarme...
Lastima!!