TODOPIC
Mecatrónica => Robótica => Mensaje iniciado por: Axel_18 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
-
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.
-
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
-
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:
-
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:
// 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.
-
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
-
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!
-
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
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 (http://www.todopic.com.ar/foros/index.php?topic=30236.0)
-
((:-)) Claro!
Axel_18, estás estudiando sobre el tema es hobby?
-
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!
-
En ese caso te recomiendo que visites las tres siguientes páginas
http://code.google.com/p/gentlenav/wiki/Home?tm=6 (http://code.google.com/p/gentlenav/wiki/Home?tm=6)
http://www.diydrones.com/ (http://www.diydrones.com/)
http://www.openpilot.org/ (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.
-
También puedes hacer un control basado en espacio de estado (control moderno) una retro de estado, un control adaptivo, o algo asi.