Modelado y Control de Un Péndulo Invertido
-
Upload
lucia-medina-gomez -
Category
Documents
-
view
150 -
download
5
description
Transcript of Modelado y Control de Un Péndulo Invertido
1
Abstracto— En este informe se presenta el modelado y control
de un péndulo invertido, para los cuales se hace uso del software
de cálculos matemáticos MATLAB y Simulink. El control se basa
en el método de espacio de estados y se establecen los
requerimientos que ha de tener el sistema compensado para
cumplir con condiciones de control satisfactorias.
Índice de términos— Espacio de estados, observador,
discretización, ecuación en diferencias, retroalimentación.
I. INTRODUCCIÓN
Para empezar, el modelado del péndulo invertido se divide en dos
partes: un modelo simple y linealizado, y un modelo no lineal. El
diseño del sistema de control para dicho péndulo se hace tomando
como referencia al modelo simplificado y luego se comprueba su
validez en el modelo no linealizado. Este sistema queda definido por
tres estados: la velocidad del carro, la posición angular y la velocidad
angular del péndulo, de los cuales ni la velocidad del carro ni la
velocidad angular del péndulo son medibles directamente desde la
salida en el sistema real. Para resolver este problema, se diseña un
observador de orden completo que permita estimar dichas variables.
Finalmente, el control digital para el sistema se hace discretizando las
ecuaciones matemáticas que lo definen, para luego implementarlas en
el microcontrolador Arduino utilizando una ecuación en diferencias.
II. NOMENCLATURA
Símbolo Significado Símbolo Significado
K1 Constante del motor
(Torque/corriente) g Aceleración
angular
K2 Constante del motor
(Voltaje/velocidad
angular)
𝜽 Posición angular
l Longitud del péndulo Velocidad
angular
r Radio de la rueda Aceleración
angular
R Resistencia del motor Velocidad lineal
M Masa del carro Aceleración
lineal
m Masa del péndulo 𝒇 Fuerza de
entrada
III. DESCRIPCIÓN DE CONTENIDOS
A. Péndulo invertido: Modelado del sistema
Haciendo uso de las leyes de Newton, se determinan las ecuaciones
que definen el comportamiento del sistema, las cuales se presentan a
continuación:
(𝑀 + 𝑚) + 𝑚𝑙 cos 𝜃 − 2𝑚𝑙 sin 𝜃 = 𝑓
𝑚𝑙 cos 𝜃 + 𝑚𝑙2 − 𝑚𝑔𝑙 sin 𝜃 = 0
Donde:
𝑓 =𝐾1𝑒
𝑅𝑟−
𝐾1𝐾2
𝑅𝑟2
Haciendo la asunción de que el ángulo 𝜃 es muy pequeño y
sustituyendo 𝑓 por las ecuaciones que representan la fuerza del motor,
se obtienen las siguientes ecuaciones linealizadas:
= 𝐾1
𝑀𝑟𝑅𝑒 −
𝐾1𝐾2
𝑀𝑟2𝑅 −
𝑚𝑔
𝑀𝜃
= −𝐾1
𝑀𝑙𝑟𝑅𝑒 +
𝐾1𝐾2
𝑀𝑙𝑟2𝑅 + (
𝑀 + 𝑚
𝑀𝑙) 𝑔𝜃
Modelado y control de un péndulo invertido
Lucia Medina 1053589, Leandro Piña 1053598, Brayand Mora 1050592
Instituto Tecnológico de Santo Domingo (INTEC)
Santo Domingo, República Dominicana [email protected]
Figura 1. Respuesta del modelo no lineal ante una entrada step.
Figura 2. Respuesta del modelo lineal ante una entrada step.
2
B. Parámetros del sistema
A continuación se presentan los parámetros que definen el
sistema:
Parámetro Valor
K1 4.619 N.m/Amp
K2 1.3857 V/rad/s
l 0.9150 m
r 0.0375 m
R 1.2554 Ω
m 0.02959 kg
M 1.86 kg
g 9.81 m/s2
C. Representación del sistema lineal en el espacio de
estados
En primer lugar, se establecen los estados que representan el
sistema:
𝑥1 =
𝑥2 = 𝜃
𝑥3 =
Por tanto, se obtienen las siguientes ecuaciones:
𝑥1 =𝐾1
𝑀𝑟𝑅𝑒 −
𝐾1𝐾2
𝑀𝑟2𝑅𝑥1 −
𝑚𝑔
𝑀𝑥2
𝑥3 = −𝐾1
𝑀𝑙𝑟𝑅𝑒 +
𝐾1𝐾2
𝑀𝑙𝑟2𝑅𝑥1 + (
𝑀 + 𝑚
𝑀𝑙) 𝑔𝑥2
Para este sistema se tiene que el voltaje del motor ‘e’ y el ángulo del
péndulo ‘𝜃’ representan la entrada y salida del sistema
respectivamente. Dicho esto, al sustituir las ecuaciones anteriores con
los parámetros correspondientes, se obtiene la siguiente representación
en el espacio de estados:
= 𝑨𝒙 + 𝑩𝒖
𝒚 = 𝑪𝒙
[
𝑥1
𝑥2
𝑥3
] = [−1.95(103) −0.16 0
0 0 12.13(103) 10.89 0
] [
𝑥1
𝑥2
𝑥3
] + [52.75
0−57.65
] 𝑒
𝑦 = [0 1 0] [
𝑥1
𝑥2
𝑥3
]
D. Diseño del observador de orden completo.
Dado que no todos los estados son directamente medibles desde la
salida – solo lo es la posición angular del péndulo – entonces es
necesario observar los estados no medibles y estimar sus valores
mediante un observador. Para ello se elige un observador de orden
completo, pues los cálculos correspondientes son más sencillos y el
error de estimación es menor que el que se obtiene con un observador
de orden reducido.
Antes de poder implementar un observador de estados en el sistema,
es necesario saber si el mismo es completamente observable, esto se
verifica con la matriz de observabilidad. Si el rango de la matriz es
igual al número de estados del sistema entonces es completamente
observable. Los resultados se muestran a continuación:
𝑀 = [𝐶′ ⋮ 𝐴′𝐶′ ⋮ 𝐴′2𝐶′]
𝑀 = [0 1 0
0 01
2.13(103)
10.890
]
Cuando se obtiene el rango de la matriz, se obtiene que el resultado
es de 3. Puesto que el rango de la matriz M es igual al número de
estados del sistema, entonces se concluye que es completamente
observable y se puede añadir un observador al sistema.
Para el diseño del observador se requiere que este sea entre dos a
cinco veces más rápido que la planta. Para este caso, se eligió que los
polos del observador sean tres veces más rápidos que el polo más
rápido del péndulo invertido. Por ese mismo lado, los polos del
observador tendrán una configuración de filtro Butterworth. Al
determinar los valores propios de la matriz de estados A, se obtienen
los polos del sistema en open loop:
𝑒𝑖𝑔(𝐴) = −1.9492(103); −3.2743 ; 3.2743
Debido a esto, los polos del observador tendrán el siguiente módulo
m:
𝑚 = 3 ∗ 1.9492 ∗ 103
𝑚 = 5.8476(103)
Dado que la ubicación de los polos de un filtro Butterworth están
dadas por la siguiente ecuación:
𝑚 (− sin [𝜋(2𝑘 − 1)
2𝑛] + 𝑗 cos [
𝜋(2𝑘 − 1)
2𝑛]) ; 𝑘 = 1,2 … 𝑛
Entonces los polos deseados para el observador de orden completo
se ubican en: -5.85(103), -2.92(103) ± j5.06(103).
A continuación se procede a determinar la matriz de ganancias K
para el observador. El comando place de MATLAB permite realizar
esto con facilidad:
𝐾 = [
4.87(107)
9.75(103)
4.94(107)
]
Esta matriz de ganancias puede obtenerse también igualando la
ecuación característica del observador con la ecuación característica
que se desea, es decir:
|𝑠𝐼 − 𝐴 + 𝐾𝐶| = 𝐸𝑐. 𝑐𝑎𝑟𝑎𝑐𝑡𝑒𝑟í𝑠𝑡𝑖𝑐𝑎 𝑑𝑒𝑠𝑒𝑎𝑑𝑎
El diagrama de bloques correspondiente al observador se representa
como indica la imagen que sigue:
Figura 3. Matriz de ganancia K del observador de orden completo.
3
E. Diseño del control: Retroalimentación de los estados.
La función de transferencia en open loop es:
𝐺(𝑠) = −57.65𝑠 + 5.02(10−11)
𝑠3 + 1949𝑠2 − 10.89𝑠 − 2.09(104)
Ésta se obtiene utilizando el comando en MATLAB ss2tf(A, B, C,
D) o mediante la ecuación:
𝐻(𝑠) = 𝐶(𝑠𝐼 − 𝐴)−1𝐵
Dado que se tiene un cero en s = 8.707(10-13), el cual es muy cercano
a cero, es necesario entonces que el sistema en lazo cerrado tenga un
polo en el origen. Los polos elegidos para el sistema tendrán una
configuración Butterworth, y con un módulo de 35 se cumplen los
requisitos de diseño planteados con anterioridad de bajo porcentaje de
overshoot y rápido tiempo de asentamiento. Por tanto, los polos
deseados estarán en: s1 = 0, s2,3 = -24.75 ± 24.75.
La matriz de retroalimentación de los estados se obtuvo utilizando
el comando en MATLAB place(A, B,desired), donde desired es una
variable que contiene los polos que se desean colocar. También es
posible obtener dicha matriz utilizando la ecuación que sigue:
|𝑠𝐼 − 𝐴 + 𝐵𝐺| = 𝐸𝑐. 𝑐𝑎𝑟𝑎𝑐𝑡𝑒𝑟í𝑠𝑡𝑖𝑐𝑎 𝑑𝑒𝑠𝑒𝑎𝑑𝑎
En este caso, matriz de ganancia G es:
𝐺 = [−36.95 −21.44 −0.86]
El sistema ahora, con observador de orden completo y
retroalimentación de todos los estados, se representa mediante el
siguiente diagrama de bloques:
Como se observa, ambos sistemas estabilizan en el valor deseado
y tienen una respuesta muy similar.
F. Diseño del control digital: Discretización del
controlador-observador e implementación en Arduino
A continuación se debe discretizar la función de transferencia del
observador-controlador, para poder implementarlo en el
microcontrolador Arduino. Su función de transferencia está dada por
la siguiente ecuación:
𝑌(𝑠)
𝑈(𝑠)= −𝑮(𝑠𝑰 − 𝑨 + 𝑲𝑪 + 𝑩𝑮)−1𝑲
Figura 4. Diagrama de bloques del observador de orden completo.
Figura 5. Respuesta step del sistema lineal en lazo abierto.
Figura 7. Respuesta del sistema lineal con referencia igual a cero y
con una perturbación a step durante 0.5 segundos y valor de 0.05.
Figura 6. Diagrama de bloques con observador de orden completo y
retroalimentación de todos los estados.
Figura 8. Respuesta del sistema no lineal con referencia igual a cero
y con una perturbación a step durante 0.5 segundos y valor de 0.05.
4
Mediante el siguiente código en MATLAB se puede hallar
directamente la función de transferencia del observador-controlador.
De esta manera, la función de transferencia obtenida es:
𝑈(𝑠)
𝑌(𝑠)=
−1.84(109)𝑠2 − 1.73(1011) − 4.27(1012)
𝑠3 + 9795𝑠2 + 4.99(107) − 0.00721
A continuación, sólo es necesario aplicar la transformada Z a la
función de transferencia anterior, para lo cual se elige un tiempo de
muestreo de 0.001 y se utiliza el comando c2d de MATLAB.
Considerando esto, la función de transferencia en el dominio z es:
𝑌(𝑧)
𝑈(𝑧)=
−1042𝑧2 − 1523𝑧 + 2480
𝑧3 − 1.005𝑧2 + 0.005531𝑧 − 5.57(10−5)
Para la implementación en el microcontrolador Arduino, se
requiere escribir la respuesta del controlador-observador en forma de
ecuaciones en diferencia. Por tanto, utilizando la función de
transferencia discretizada se tiene:
(𝑧3 − 1.005𝑧2 + 0.005531𝑧 − 5.57(10−5))𝑌(𝑧)
= (−1042𝑧2 − 1523𝑧 + 2480)𝑈(𝑧)
Llevando la expresión a una ecuación en diferencias, se obtiene:
𝑦𝑘−3 − 1.005𝑦𝑘−2 + 0.0055𝑦𝑘−1 − 5.57(10−5)𝑦𝑘
= −1042𝑢𝑘−2 − 1523𝑢𝑘−1 + 2480𝑢𝑘
G. Comparación del sistema real y el sistema modelado
En la figura 10 se observa cómo se comporta el voltaje entregado
por el potenciómetro cuando el ángulo del péndulo varía entre 0º y 90º.
Cabe destacar que el potenciómetro está conectado a una fuente de 5
V. Considerando que el voltaje es de aproximadamente 2.2 V cuando
el péndulo se halla en 0º, es notorio que a medida que el péndulo cae,
el potenciómetro entrega un voltaje de unos 4.4 V. Esta variación de
voltaje se da en un tiempo un poco mayor a 1 segundo ante una entrada
de corriente directa (DC) a los motores del carro de 10.16 V.
En la figura 10 se puede visualizar el tiempo que tarda en caer el
péndulo cuando a los motores se les aplica una entrada de 10.16 V
según el modelo no lineal que define el sistema. Este tiempo es un poco
superior a 1 segundo, lo cual es semejante a lo obtenido en el modelo
real anteriormente explicado. Cabe destacar que dicha prueba no se
realizó en el modelo lineal debido a que para su creación se asumió
que la variación de ángulo sería muy pequeña.
H. Implementación del control en arduino
Luego de haberse realizado el modelo matemático del control
mediante el sistema discreto, se procede a la implementación de este
modelo en la placa del microcontrolador, la cual en este caso es el
“Arduino Uno”. El control está estructurado de la siguiente manera en
el lenguaje del microcontrolador:
1. Definición de nuestras variables de control de los motores DC.
2. Definición de la variable que almacena el valor del
potenciómetro o valor del voltaje de referencia.
3. Valores de State Vector los cuales son el yk (señal de salida
del sistema) y el uk (señal de entrada menos el error).
4. La asignación del tipo de salida las cuales son A y B del tipo
análogas para el control del motor.
5. Una variable de tipo global para la rotación de los valores de
nuestra entrada uk y yk.
6. Se define el intervalo de valores que representan el 0 o el punto
estable del sistema.
7. Condición de control de los motores DC para la entrada del
voltaje y el sentido de giro de estos.
Básicamente esta sería la secuencia que sigue el código en la
estructura, en cuanto al funcionamiento o la lógica aplicada fue
básicamente un sondeo de la posición del potenciómetro la cual se
obtiene con el voltaje que mide entre dos de sus terminales y se resta
con la referencia del sistema (para colocarlo en uk) y en función de
este valor y los 3 previos de uk y k, se obtiene la yk actual que es la
salida del control y la entrada a la planta, valor que provocará que los
motores DC se muevan hacia delante o hacia atrás, para el caso de
yk>12 se moverá hacia delante, para el caso contrario cuando yk<12
Figura 9. Código en MATLAB para la obtención de la función
de transferencia del observador-controlador.
Figura 8. Comando para discretizar la función de
transferencia.
Figura 10. Variación del voltaje entregado por el potenciómetro a
medida que el ángulo del péndulo varía de 0º a ≈90º.
Figura 11. Tiempo de caída del péndulo ante una
entrada step al sistema no lineal de 10.16.
5
se moverá hacia detrás.
La tabla de verdad que representa el sentido de giro de los
motores y su movimiento en general se presenta a continuación:
I. Etapa de potencia
Para poder cambiarle el sentido de giro a los motores DC del
carro, se recurrió a un puente H con transistores NPN como se
observa en la imagen que sigue obtenida de un foro de Arduino en la
internet:
A diferencia del esquema que se muestra en la imagen anterior, el
Arduino se conectó a las bases del puente H a través de otros 2
transistores BJT debido a que no le podía proporcionar la corriente
suficiente a dichas bases.
J. Implementación del control en el sistema real
Para probar si era posible estabilizar el péndulo invertido
utilizando los motores del carro, se intentó manualmente regular el
voltaje y polaridad del mismo, que recibían los motores para así
controlarlos. Al realizar dicha prueba, se imposibilitó estabilizar el
péndulo debido a que la aceleración de los motores es muy baja.
Cabe destacar que los diagramas mostrados del control del sistema,
no contienen una restricción de qué voltaje colocarle a los motores.
Cuando se restringe dicho sistema a que el mayor voltaje que puede
recibir la planta es +-12V con el control, ocurre lo siguiente:
Como se comprueba con la figura 15, al limitar los voltajes
máximos que pueden colocarse en el motor, es claro que no es posible
controlarlo en la realidad bajo dichas restricciones.
K. Recuento de la participación de los integrantes del
equipo
Participación en común con los demás equipos
Determinación de los parámetros generales del sistema: Manuel
Acosta, Lucía Medina y Gabriel Yeara.
Montaje del carro: Lucía Medina, Leandro Piña, Gabriel Yeara y
Brayand Mora.
Montaje del driver del circuito: Brayand Mora, Manuel Severino,
Leandro Piña, Lucía Medina y Gabriel Yeara.
Montaje del péndulo: Manuel Acosta, Manuel Severino y Julio
Feliz.
Obtención de las partes del equipo: Manuel Severino y Lucía
Medina.
Pruebas del carro con el acelerómetro: Manuel Acosta, Manuel
Severino, Leandro Piña, Lucía Medina, Brayand Mora, Julio Feliz,
Rudy Inoa y Gabriel Yeara.
Participación del equipo individual:
Conexión Arduino-MATLAB para pruebas: Brayand Mora.
Conversión del controlador-observador de continuo a discreto:
Leandro Piña y Lucía Medina.
Creación del reporte escrito: Leandro Piña, Lucía Medina y
Brayand Mora.
Determinación de la matriz de ganancia del observador:
Leandro Piña.
Determinación de la matriz de retroalimentación de todos los
estados: Lucía Medina.
Diseño del control digital en Arduino: Lucía Medina.
Diseño en SolidWorks del sistema: Brayand Mora.
En A B Motor
H L L Paro del motor (no activo)
H L H Mov. hacia delante
(activado)
H H L Mov. hacia atras (activado)
H H H Paro del motor (alta. Imp.)
Figura 12. Fragmento del Código de control en Arduino Uno,
implementación del sistema discreto. (El código completo está
disponible en anexos, para una mejor visualización de éste).
Figura 13. Tabla de verdad de las combinaciones de las salidas A y B
con el Enable para el control del giro de motor DC. (Esta tabla es la que
rige el sentido de cada motor si es hacia delante o hacia atrás, teniendo
en cuenta que el Enable está High todo el tiempo).
Figura 14. Puente H utilizado.
Figura 15. Gráfico del ángulo en el sistema lineal con una pequeña
perturbación y con una restricción del voltaje de +-12V DC.
6
Implementación en Simulink del modelo lineal y no lineal:
Leandro Piña y Lucía Medina.
Prueba de similitud modelo-sistema real: Leandro Piña y Lucía
Medina.
Prueba del sistema con el control digital: Lucía Medina.
Representación y prueba en Simulink y Matlab del control con
el modelo lineal y no lineal: Lucía Medina y Leandro Piña.
Transformación del sistema original de 4 estados a uno de 3
estados observable: Leandro Piña.
IV. CONCLUSIONES
Sin lugar a dudas, controlar un sistema mediante la teoría de
control moderno tiene muchas facilidades debido a que los cálculos
matemáticos a realizar son relativamente sencillos y tiende a ser
repetitivo y no tan analítico respecto al control clásico. Se concluyó,
además, que efectivamente los modelos teóricos creados, a pesar de
asumir e ignorar numerosos factores reales, realizando los ajustes de
lugar pueden llegar a modelar sistemas reales. Finalmente se comprobó
la importancia de realizar pruebas previas al sistema para determinar
si los actuadores del sistema son capaces de controlar lo esperado antes
de realizar el control mismo.
V. REFERENCIAS
Friedland, B. (1986) Control Systems Design: An Introduction to
State-Space Method.
Ogata, K. (2010) Ingeniería de Control Moderna. 5ta edición.
(n.d.) Forum Arduino. Recuperado el 20 de abril de 2015 desde
http://forum.arduino.cc/index.php?topic=279425.0
8
Código Arduino
//Proyecto Final. Sistemas de Control II //Implementación de Sistema Discreto con Transformadas “Z”. //Variables de control de los motores #define A 5 #define B 6 #define Vin A0 //Voltaje del potenciómetro double yk[4]=0,0,0,0; //Senal de salida del control double uk[4]=0,0,0,0; //Senal de entrada control - error void setup() pinMode(A,OUTPUT); //Salidas analogas pinMode(B,OUTPUT); //Salidas analogas pinMode(Vin,INPUT); Serial.begin(9600); void loop() int i; //Variable para la rotacion de los valores uk y yk for(i=3;i>0;i--) uk[i]=uk[i-1]; uk[0]=0; for(i=0;i<21;i++) uk[0]=uk[0]+analogRead(Vin); delayMicroseconds(50); uk[0]=uk[0]*0.0049*0.533/20-3.14159268/2; //Valores probados donde el Sistema es 0 if((uk[0]>=(-0.015)) && (uk[0]<=0.015) ) yk[0]=0; else yk[0]=-5304*uk[1]+5270*uk[2]-91.88*uk[3]+yk[1]+0.0002626*yk[2]+2.99E-08*yk[3]; for(i=3;i>0;i--) yk[i]=yk[i-1]; //Ciclo de control de los motores (sentido y voltaje) if(yk[0]>12) analogWrite(A,255); analogWrite(B,0); else if(yk[0]<(-12)) analogWrite(A,0); analogWrite(B,255); else if( (yk[0]==0) ) analogWrite(A,0); analogWrite(B,0); else if( (yk[0]>0) && (yk[0]<12) )
analogWrite(A,0); analogWrite(B,255*yk[0]/12); else if( (yk[0]<0) && (yk[0]>(-12)) ) analogWrite(A,255*yk[0]/12); analogWrite(B,0);
Métodos de medición de parámetros y obtención de datos
Este código lee el puerto serial la data que está enviando el
Arduino y lo muestra en una gráfica la cual imprime el voltaje de
salida del potenciómetro en X ciclos del vector que se encarga de
guardar dichos valores.
9
SolidWorks y Simulink
Modelo físico del péndulo el cual se replicó en SolidWorks
para la importación a Simulink
Bloques generados para la parte de control luego de haber sido
importado el modelo CAD de SolidWorks a Simulink.