CMU
UM

Ejemplo Tutorial: Realimentación de Estados para un Control de Posición de un Motor de Corriente Continua

(Traducido de uno de los Ejemplos Tutoriales de Control de la Carnegie Mellon University.)

Diseño del controlador por realimentación de estados
Respuesta a perturbaciones
Agregado de acción integral

Las ecuaciones dinámicas en espacio de estados del motor son las siguientes:

Con una referencia de 1 radian agregada al sistema, los criterios de diseño son:

Editemos un nuevo archivo-m con los siguientes comandos:

J=3.2284E-6;              
b=3.5077E-6;              
K=0.0274;
R=4;
L=2.75E-6;

A=[0 1 0
   0 -b/J K/J
   0 -K/L -R/L];
B=[0 ; 0 ; 1/L];
C=[1 0 0];
D=[0]; 

Diseño del controlador por realimentación de estados

Como todas las variables de estado en nuestro problema son muy fáciles de medir (un amperímetro para la corriente, un taquímetro para la velocidad, y un potenciómetro para la posición), podemos diseñar un controlador por realimentación de estados completo sin preocuparnos por estimar ningún estado con observador. El esquema para la realimentación de estados es:


Recordemos que el polinomio característico para este sistema a lazo cerrado es el determinante de (sI-(A-BKc)) donde s es la variable de Laplace. Como las matrices A y B*Kc son las dos 3x3, debe haber 3 polos para el sistema. Mediante realimentación de estados podemos mover estos polos a voluntad. Vamos a tratar primero de colocarlos en -100 + 100i y -100-100i (que corresponden a un sistema de segundo orden con un amortiguamiento zeta = 0.5, que da un sobrevalor de 16%, y un sigma = 100 que da un tiempo de establecimiento de 0.04 segundos). Una vez que elegimos los polos que queremos, Matlab nos va a hallar la matriz Kc. Simplemente agregamos lo siguiente al final del archivo-m
p1=-100+100i;
p2=-100-100i;
p3=-200;
Kc=place(A,B,[p1,p2,p3]);
Volvamos al esquema de arriba. Vemos que una vez incorporada la matriz K al sistema, las ecuaciones de estado pasan a ser:

Podemos ver la respuesta del lazo cerrado simplemente agregando la siguiente línea al final del archivo-m:
t=0:0.001:.05;
step(A-B*Kc,B,C,D,1,t)
Corriendo el archivo-m en la ventana de comandos de Matlab, deberíamos obtener la siguiente figura:

Respuesta a Perturbaciones

Para obtener la respuesta a una perturbación tenemos que incluir una entrada adecuada al sistema. Físicamente, una perturbación es un torque que actúa sobre la inercia del motor. Un torque actúa como un término aditivo en la segunda ecuación de estados (que queda dividido por J, como los demás términos en esta ecuación). Podemos simular esta perturbación simplemente modificando la matriz de entrada de lazo cerrado, B, para que tenga 1/J en la segunda fila. Agreguemos la siguiente línea a nuestro archivo-m y corrámoslo nuevamente.
step(A-B*Kc,[0;1/J;0],C,D,1,t)

Esta no es una respuesta con error estático cero, así que vamos a tener que compensar.

Agregado de Acción Integral

Sabemos que si ponemos un integrador extra en serie con la planta va a eliminar el error estático a una entrada. Si el integrador viene antes del punto de inyección de la perturbación, cancelará la perturbación en régimen permanente. Esto cambia la estructura de control, que queda ahora de la forma siguiente:

Podemos modelar el integrador aumentando nuestras ecuaciones de estado con un estado extra que es la salida del integrador. Esto agrega una ecuación extra que establece que la derivada de la integral de theta es theta. Colocaremos esta ecuación encima de nuestras matrices. La entrada, r, ahora entra al sistema antes del integrador, asi que aparece en la recientemente agregada ecuación de arriba. La salida del sistema queda igual.

Estas ecuaciones representan la dinámica del sistema antes de cerrar el lazo. Denotaremos las matrices en esta ecuación como Aa, Ba, Ca, y Da. Denotaremos el vector de estados del sistema aumentado como xa. Notar que la referencia, r, no afecta los estados (excepto por el estado del integrador) o la salida de la planta - lo que es obvio pues no hay ninguna conexión entre la referencia y la entrada de la planta, u, sin implementar la matriz de realimentación de estados Kc.

Para hallar las ecuaciones de lazo cerrado tenemos que examinar cómo afecta la entrada, u, a la planta. En este caso es exactamente de la misma forma que en las ecuaciones aumentadas. Por lo tanto, existe un vector, llamémoslo Bau, que reemplaza Ba cuando tomamos a u como la entrada. Éste no es más que nuestro viejo vector B con un cero extra agregado en la primer fila. Como u=Kc*xa es la entrada a la planta para el lazo cerrado, pero r es la entrada al sistema a lazo cerrado, las ecuaciones de lazo cerrado dependen de ambas Bau and Ba. Las ecuaciones de lazo cerrado entonces quedan:


Ahora, la integral de la salida se realimenta, y va a ser usada por el controlador para eliminar el error estático originado por la perturbación. Ahora podemos rediseñar nuestro controlador. Como tenemos que ubicar un polo a lazo cerrado por cada polo en la planta, vamos a ubicar otro polo en -300, que va a ser más rápido que el resto de los polos. Como la matriz del sistema a lazo cerrado depende de Bau, vamos a usar Bau en el comando place en vez de Ba. Agregamos los siguiente a nuestro archivo-m.
Aa=[0 1 0 0
    0 0 1 0 
    0 0 -b/J K/J
    0 0 -K/L -R/L];
Ba=[ -1 ; 0 ; 0 ; 0];
Bau=[0 ; 0 ; 0 ; 1/L ];
Ca=[0 1 0 0];
Da=[0]; 

p4=-300;
Kc=place(Aa,Bau,[p1,p2,p3,p4]);

t=0:0.001:.05;
step(Aa-Bau*Kc,Ba,Ca,Da,1,t)
Corriendo el archivo-m (o sólo estas nuevas líneas) obtenemos la siguiente salida.

Para ver la respuesta a la perturbación, usamos una matriz B similar a la que usamos antes cuando simulamos la respuesta a la perturbación.
step(Aa-Bau*Kc,[0 ; 0 ; 1/J ; 0] ,Ca,Da,1,t)

Vemos que todas los criterios de diseño han sido satisfechos por este controlador.