Autor Tema: PID Digital (paso a paso)  (Leído 84335 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PID Digital (paso a paso)
« Respuesta #45 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?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #46 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.

« Última modificación: 06 de Marzo de 2010, 15:52:18 por pablomanieri »

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #47 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:

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #48 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PID Digital (paso a paso)
« Respuesta #49 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:


Y tras ejecutar IDENT esto es lo que obtengo:


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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: PID Digital (paso a paso)
« Respuesta #50 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.
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: PID Digital (paso a paso)
« Respuesta #51 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.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PID Digital (paso a paso)
« Respuesta #52 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?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #53 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
« Última modificación: 07 de Marzo de 2010, 08:24:45 por pablomanieri »

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: PID Digital (paso a paso)
« Respuesta #54 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
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: PID Digital (paso a paso)
« Respuesta #55 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.
control de movimiento

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #56 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:



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
« Última modificación: 09 de Marzo de 2010, 08:46:30 por pablomanieri »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PID Digital (paso a paso)
« Respuesta #57 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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: PID Digital (paso a paso)
« Respuesta #58 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')

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PID Digital (paso a paso)
« Respuesta #59 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.


 

anything