Autor Tema: Controlador en adelanto implementado en un microcontrolador  (Leído 6670 veces)

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

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Controlador en adelanto implementado en un microcontrolador
« en: 17 de Mayo de 2012, 19:59:10 »
Hola a todos, junto con saludarlos quisiera pedir ayuda sobre como pasar un controlador digital (modelado en el plano Z)  a codigo en C, por ejemplo, suponiendo que mi controlador digital representado por :

z-0.98
--------
z-0.6

quisiera implementarlo en un microcontrolador, específicamente un PIC 18f2550

Como debo hacerlo?

Saludos

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #1 en: 17 de Mayo de 2012, 20:22:01 »
Y esa función de transferencia en el dominio del tiempo como sería? Con eso y estableciendo una frecuencia de muestreo puede que te des una idea de como implementarlo.
No contesto mensajes privados, las consultas en el foro

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #2 en: 21 de Mayo de 2012, 17:50:55 »
estimado


en el caso del tiempo y en forma generica, el controlador seria;

s+a
------
s+b

por lo que se divide en dos expresiones

1)

   a
-------
  s+b

que corresponde en el dominio del tiempo  a una exponencial de la forma:

a*e^(-bt)

pero mi duda es la inversa de laplace de :

2)

  s
-----
s + b

ya que en matlab me arroja deltas de Dirac y funciones que no logro entender



Saludos

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #3 en: 21 de Mayo de 2012, 19:26:39 »
Pero de forma discreta y puntual para este caso como sería? Porque por ahi faltan los conceptos básicos, que habria que tenerlos claro antes de encarar algo  :tongue:
No contesto mensajes privados, las consultas en el foro

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #4 en: 21 de Mayo de 2012, 19:32:16 »
Hola a todos, junto con saludarlos quisiera pedir ayuda sobre como pasar un controlador digital (modelado en el plano Z)  a codigo en C, por ejemplo, suponiendo que mi controlador digital representado por :

z-0.98
--------
z-0.6

quisiera implementarlo en un microcontrolador, específicamente un PIC 18f2550

Como debo hacerlo?

Saludos

La función es:

Vo / Vi = 12.9876 · (z - 0.9942) / (z - 0.6597)


Creo que se programa así (si estoy equivocado que me corrijan):

22/05/2012: Corrijo el programa:

Código: [Seleccionar]
// Inicializar variables
Vo_1 = 0;
Vo_1 = 0;

for( ; ; )  {

   // Desplazar en el tiempo las señales
   Vo_0 = Vo_1;
   Vi_0 = Vi_1;


   // Leer entradas analógicas
   Vi_1 = adc_read();


   // Calcular la función de transferencia
   Vo_1 =  12.9876 * (Vi_1 - 0.9942*Vi_0) + 0.6597*Vo_0;


   // Escribir salidas analógicas
   pwm_write(Vo[1]);


   // Esperar tiempo de ciclo T (sampling time)
   delay_ms(20);

}


Saludos.
« Última modificación: 25 de Mayo de 2012, 17:55:45 por Picuino »

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #5 en: 21 de Mayo de 2012, 21:14:00 »
ok Suky

te cuento, el controlador es un PD con filtro derivativo que a fin de cuenta funciona como un compensador en adelanto.

La Ft en el dominio de tiempo es:

Transfer function:

12.9876 (s+0.2888)
------------------
     (s+20.8)


Luego al discretizar con un periodo de 20ms, obtengo la siguiente funcion en plano Z:

Zero/pole/gain:
12.9876 (z-0.9942)
--------------------------
(z-0.6597)
 

Sampling time: 0.02



Respondo con esto a tu sugerencia suky?

Saludos

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #6 en: 21 de Mayo de 2012, 21:21:04 »
No, no sirve... Porque para pensarlo como implementarlo en un microcontrolador necesitas y(k.t)=..-..+u(k.t) Después tienes que estudiar que rangos debe tener la señal de control para un determinado error,  porque si tu control es acotado vas a tener problemas.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #7 en: 22 de Mayo de 2012, 03:54:50 »
Debes aplicar la transformada Z inversa.

es decir

invZ(F(z)*z^-k))=f[n-k]

de esta manera si tienes

z-0.98
--------
z-0.6

debes convertirlo a la forma

V(z)        1-0.98 z^-1
-----  =  ---------------
E(z)          1-0.6 z^-1

Donde E(z) es el parámetro de salida de la planta, V(z) es el voltaje que se le aplicará a la planta.

Luego realizar multiplicación cruzada

V(z) - 0.98 V(z) z^-1 = E(z) - 0.6 E(z) z^-1

Finalmente aplicamos la transformada inversa de Z invZ(F(z)*z^-k))=f[n-k] obtienes

v(k) - 0.98 v(k-1) = e(k) - 0.6 e(k-1)

despejando v(k) obtienes

v(k) = 0.98 v(k-1) + e(k) - 0.6 e(k-1)

esta última es la ecuación que ingresarás en el microcontrolador recordando que v(k-1) es el valor anterior obtenido del voltaje, e(k) es el valor actual de la planta, y e(k-1) es el valor anterior obtenido de la planta. Por cada medición y cálculo que realices deberás ir almacenando por lo menos un valor.

La programación quedaría algo así si no me equivoco
Código: [Seleccionar]

e[k]=0;
e[k-1]=0;
v[k]=0;
v[k-1]=0;

for( ; ; )  {
   e[k-1] = e[k];

   e[k] = adc_read();      // Leer entrada analógica

   v[k] =  0.98 * v[k-1] + e[k] - 0.6 * e[k-1];

   pwm_write(V_k);      // Escribir salida analógica

   v[k-1] = V[k];


   delay(periodo);
}

Te recomiendo que revises el Control PID de Suky y que revises esto tambien
http://www.todopic.com.ar/foros/index.php?topic=30236.0
« Última modificación: 26 de Mayo de 2012, 17:15:49 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #8 en: 22 de Mayo de 2012, 11:45:19 »
 ((:-)) Claro!

Axel_18, estás estudiando sobre el tema es hobby?
No contesto mensajes privados, las consultas en el foro

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #9 en: 24 de Mayo de 2012, 18:06:24 »
Notable bigluis!
te agradesco

Habia visto un paper sobre el tema pero no lograba entenderlo bien y ahora con tu ejemplo mas claro imposible!!

Sin embargo al estudiar un poco mas detallado sobre el tema llege a lo siguiente, haber si voy bien:

Un controlador en adelanto en el domino del tiempo lo puedo escribir de la forma:

K +    D
      ------         [ 1 ]
       s + n

Donde K es una contante, D una contante y n  un polo

Luego al sumar el controlador queda como:

   s + (nK+D)/(K)
--------------------  * K
       s + n

lo cual es la forma canónica de un controlador en adelanto o atraso.

luego al aplicar la transformada  Z en [ 1 ], obtengo:

K +       1
     -------------------------- * D
     1 -( e^(n*T) )*z^-1

Donde T es el tiempo de muestreo y K,D y N constantes.
 
Hasta el momento de leer el post habia lllegado hasta este punto, pero con el aporte de  Bigluis, entiendo mejor
 



Suky, estoy realizando  el control de un cuadricoptero para  mi tesis y pretendo implementar el control de un "balancín" con dos motores, por lo que estoy estudiando el tema de la transformada Z para implementarlo en un controlador PIC o RRABIT.

Eh realizado pruebas mediante Simulink, al realizar el controlador directamente en el PC y enviar via datos seriales al micro para accionar los motores, luego de una previa identificación del sistema y modelado matematico

Les comentare como  va el código  y la respuesta de la planta


Saludos y Gracias!

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #10 en: 26 de Mayo de 2012, 17:07:53 »
En ese caso te recomiendo que visites las tres siguientes páginas

http://code.google.com/p/gentlenav/wiki/Home?tm=6
http://www.diydrones.com/
http://www.openpilot.org/

En todas ellas verás muchos ejemplos de como crear quadcopters y otros UAV. También verás que todos ellos utilizan un tipo de control PID tipo MIMO. Es decir, necesitarás más que un sistema en adelanto ya que este es muy simple.

Básicamente para controlar un quadcopter necesitarás de 6 variables: Rotación en X (Pitch), Rotación en Y(Roll), Rotación en Z (Yaw), Avance en X, Avance en Y y Avance en Z. Es por ello que se utilizan Giroscopios y acelerómetros de 3 ejes.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Controlador en adelanto implementado en un microcontrolador
« Respuesta #11 en: 28 de Mayo de 2013, 15:47:12 »
También puedes hacer un control  basado en espacio de estado (control moderno) una retro de estado, un control adaptivo, o algo asi.