You are on page 1of 25

CÓDIGO: SGC.DI.

505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

DEPARTAMEN ELÉCTRICA Y CARRER ELECTRÓNICA E


TO: ELECTRÓNICA A: INSTRUMENTACIÓN
PERíODO
CONTROL
ASIGNATURA: LECTIVO 2017 20 NIVEL: VII
DIGITAL
:
PRÁCTICA
DOCENTE: ING. FABRICIO PÉREZ NRC: 1745 1
N°:
LABORATORIO DONDE SE DESARROLLARÁ LA
PRÁCTICA
TEMA DE LA
PRÁCTICA:
INTEGRANTES:
 Moreno Geovanny
 Ortega Hugo
 Toalombo Julio
 Vásquez André
 Richard Tandalla
 Michael Guerra
 Cristian Yánez
 Alex Chancúsig
 Bladimir Herrera

OBJETIVOS:
Objetivo General:

Objetivos específicos:

HIPÓTESIS:

Hipótesis General:

 El control de una planta de temperatura requiere una sintonización del control PID mediante un software
apropiado.

Hipótesis Operativa:

METAS:
Metas a corto plazo:

Metas A largo plazo:

MARCO TEÓRICO:
Modelamiento
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Ilustración 1. Esquema de modelo matemático


La obtención del modelo matemático se realiza mediante la teoría de Euler-Lagrange

Analisis Cinemático: La posición de un punto P sobe el péndulo puede ser descrito por el vector

𝑟𝑧 (𝑟𝑎 , 𝑟𝑝 ) = 𝑟𝑝 𝑐𝑜𝑠𝜃 (1)

Donde la variable ra representa la posición radial del brazo y rp es la posición radial del péndulo. Las distancias
radiales son medidas desde el centro de rotación de los cuerpos al derivar se obtiene la velocidad

𝑣𝑧 (𝑟𝑎 , 𝑟𝑝 ) = −𝑟𝑝 𝑠𝑖𝑛𝜃. 𝜃̇ (2)

Expresión de energía

La energía cinética es obtenida mediante

1 (3)
𝑇 = ∫ 𝑣 2 𝑑𝑚
2

La energía potencial a resolver es

(4)
𝑉 = 𝑔 ∫ 𝑟𝑧 𝑑𝑚

Pilar central

2𝑇𝑐 = 𝐽𝜑 2 (5)
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

𝑉𝑐 = 0 (6)

Brazo Horizontal
𝑙𝑎 (7)
2𝑇𝑐 = ∫ 𝑣 2 (𝑠, 0)𝑚𝑎 /𝑙𝑎 𝑑𝑠
0

1 (8)
2𝑇𝑐 = 𝑚 𝑙 2𝜑2
3 𝑎𝑎
𝑉𝑎 = 0 (9)

Brazo Pendular
𝑙𝑝 (10)
2𝑇𝑝 = ∫ 𝑣 2 (𝑟𝑎 , 𝑠)𝑚𝑝 /𝑙𝑝 𝑑𝑠
0

(11)

1 (12)
𝑉𝑝 = 𝑚 𝑔𝑙 𝑐𝑜𝑠𝜃
2 𝑝 𝑝
1 (13)
= 𝑚𝑝 𝑔𝑙𝑝 𝑐𝑜𝑠𝜃
2

La energía cinética total del péndulo invertido rotacional está dada por

𝑇 = 𝑇𝑐 + 𝑇𝑎 + 𝑇𝑝 (14)

Y la energía potencial total por

𝑉 = 𝑉𝐶 + 𝑉𝑎 + 𝑉𝑃 (15)

Ecuaciones de movimiento

Lagrangiano

𝐿 =𝑇−𝑉 (16)

Las ecuaciones de movimiento están dadas por:


CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

𝜕 𝑑𝐿 𝑑𝐿
( )− = 𝜏∅
𝜕𝑡 𝑑∅̇ 𝑑∅

(17)

𝜕 𝑑𝐿 𝑑𝐿
( )− =0
𝜕𝑡 𝑑𝜃̇ 𝑑𝜃

Siendo 𝜏∅ el torque externo aplicado al brazo horizontal. Las derivadas parciales son:

𝑑𝐿
=0
𝑑∅
𝑑𝐿 1 1 1
= (𝐽 + ( 𝑚𝑎 + 𝑚𝑝 ) 𝑙𝑎2 + 𝑚𝑝 𝑙𝑝2 𝑠𝑒𝑛2 𝜃) ∅̇ + 𝑚𝑝 𝑙𝑎 𝑙𝑝 𝑐𝑜𝑠𝜃𝜃̇
𝑑∅̇ 3 3 2

𝑟𝑧 (𝑟𝑎 , 𝑟𝑝 ) = 𝑟𝑝 𝑐𝑜𝑠𝜃 (18)

𝑑𝐿 1 1 1
= 𝑚𝑝 𝑙𝑝2 𝑐𝑜𝑠𝜃 𝑠𝑒𝑛𝜃 ∅̇2 − 𝑚𝑝 𝑙𝑎 𝑙𝑝 𝑠𝑒𝑛𝜃∅̇𝜃̇ + 𝑚𝑝 𝑔𝑙𝑝 𝑠𝑒𝑛𝜃
𝑑𝜃 3 2 2

𝑑𝐿 1 1 ̇
= 𝑚𝑝 𝑙𝑎 𝑙𝑝 𝑐𝑜𝑠𝜃∅ + 𝑚𝑝 𝑙𝑝2 𝜃̇
𝑑𝜃̇ 2 3

Insertando (18) en (17) e introduciendo.

1 1
𝛼 = 𝐽 + ( 𝑚𝑎 + 𝑚𝑝 ) 𝑙𝑎2 𝛽 = 𝑚𝑝 𝑙𝑝2
3 3
(19)

1 1
𝛾= 𝑚 𝑙 𝑙 𝛿 = 𝑚𝑝 𝑔𝑙𝑝
2 𝑝𝑎𝑝 2
Resultan las ecuaciones del movimiento para el sistema:

(𝛼 + 𝛽𝑠𝑒𝑛2 𝜃)∅̈ + 𝛾𝑐𝑜𝑠𝜃𝜃̈ + 2𝛽𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃∅̇𝜃̇ − 𝛾𝑠𝑒𝑛𝜃 𝜃̇ 2 = 𝜏∅

(20)

𝛾𝑐𝑜𝑠𝜃∅̈ + 𝛽𝜃̈ − 𝛽𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃 ∅̇2 − 𝛿𝑠𝑒𝑛𝜃 = 0

Teniendo en cuenta que el par de control se genera por un motor de corriente continua controlado por voltaje:
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

𝜕𝑖 𝑉 𝐾𝑒 . ∅ (21)
𝑉 = 𝑅. 𝐼 + 𝐿 + 𝐾𝑒 . ∅ → 𝐼 = −
𝜕𝑡 𝑅 𝑅

Donde R, 𝐾𝑒 y L corresponden a las constantes eléctricas del motor.

En la expresión anterior se desprecia el efecto inductivo en el motor (por ser muy pequeño) para simplificar el
modelo.

Considerando que el par es proporcional a la corriente:

𝐾𝑒 𝐾𝑒 2 (22)
𝜏∅ = 𝐾𝑡 . 𝐼 → 𝜏 = .𝑉 − . ∅̇
𝑅 𝑅

Debido a que en los motores de corriente de continua el valor de Kt y el valor de Ke son casi idénticos, se
reemplaza Kt por Ke en la expresión anterior.

Representación en espacio de estado

Introduciendo las variables de estado. 𝑥1 = ∅, 𝑥2 = ∅, 𝑥3 = 𝜃, 𝑥1 = 𝜃, las ecuaciones de movimiento (18)


pueden reescribirse de una forma apropiada para integración y para el diseño de controladores en el espacio de
estado:

𝑥̇ 1 = 𝑥2

(𝛼 + 𝛽𝑠𝑒𝑛2 𝜃)∅̈ + 𝛾𝑐𝑜𝑠𝜃𝜃̈ + 2𝛽𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃∅̇𝜃̇ − 𝛾𝑠𝑒𝑛𝜃 𝜃̇ 2 = 𝜏∅

(23)

𝛾𝑐𝑜𝑠𝜃∅̈ + 𝛽𝜃̈ − 𝛽𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃 ∅̇2 − 𝛿𝑠𝑒𝑛𝜃 = 0

𝛽𝛾(𝑠𝑒𝑛2 𝜃 − 1)𝑠𝑒𝑛𝜃𝜑̇ 2 − 2𝛽 2 𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃𝜑̇ 𝜃 −̇ 𝛾𝛿 𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃 + 𝛽𝜏∅


𝑥̇ 2 =
𝛼𝛽 − 𝛾 2 + (𝛽 2 + 𝛾 2 )𝑠𝑒𝑛2 𝜃

𝑥̇ 3 = 𝑥4

𝑥̇ 4
̇
𝛽(𝛼 + 𝛽𝑠𝑒𝑛2 𝜃)𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃𝜑̇ 2 + 2𝛽𝛾(1 − 𝑠𝑒𝑛2 𝜃)𝑠𝑒𝑛𝜃𝜑 − 𝛾 2 𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃𝜃 ̇ 2 + 𝛿(𝛼 + 𝛽𝑠𝑒𝑛2 𝜃)𝑠𝑒𝑛𝜃 − 𝛾𝑐𝑜𝑠𝜃𝜏∅
=
𝛼𝛽 − 𝛾 2 + (𝛽 2 + 𝛾 2 )𝑠𝑒𝑛2 𝜃

Puntos de equilibrio

Igualando las derivadas de las variables de estado en la representación (21), se obtiene el siguiente sistema de
ecuaciones simultáneas no lineales:
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

0 = 𝑥2

0 = 𝑐𝑜𝑠𝜃𝑠𝑒𝑛𝜃

(24)

0 = 𝑥4

0 = (𝛼 + 𝛽𝑠𝑒𝑛2 𝜃)(𝛿𝑠𝑒𝑛𝜃)

Por lo tanto, los puntos de equilibrio del sistema son 𝑥1 ,0,𝜃0 ,0)

Linealización

Sea

𝑑𝑥 (25)
= 𝑓(𝑥, 𝜏)
𝑑𝑡

Con f definida de forma apropiada. El modelo linealizado en el punto de equilibrio.

𝑥0 = (∅0 , ∅0 , 𝜃0 , 𝜃0 ), 𝜏0 = (0,0) (26)

Se obtiene a partir de.

𝑑(𝛿𝑥) 𝛿𝑓 𝛿𝑓 (27)
= |0 𝛿𝑥 + | 𝜏 = 𝐴𝛿𝑥 + 𝐵𝜏
𝑑𝑡 𝛿𝑥 𝛿𝑥 0

Con 𝛿𝑥 = 𝑥 − 𝑥0

Para 𝑥0 = (0,0,0,0) lo anterior origina.

(28)

Con valores propios

(29)
𝛼𝛿
{0,0, ±√ }
𝛼𝛽 − 𝛾 2
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

El sistema linealizado posee un valor propio en la parte derecha del semi-plano complejo. Basado en el método
de linealización de Lyapunov se puede concluir que el punto de equilibrio 𝑥0   0,0,0,0) es inestable.

Para 𝑥0   0,0, 𝜋, 0) lo anterior origina.

(30)

Con valores propios

(31)
𝛼𝛿
{0,0, ±√ }
𝛼𝛽 − 𝛾 2

El sistema linealizado posee cuatro valores propios sobre el eje j , así que no se puede llegar a una conclusión
sobre la estabilidad de este punto de equilibrio a partir de la aproximación lineal.

DESARROLLO
PROGRAMACION ENCODER

volatile int contador=0; // Declaramos como 'volatile' las variables que participan dentro y fuera de la interrupción.

byte ant=0, act=0; // Sólo se utiliza los dos primeros bits de estas variables. ant=anterior, act=actual.

int n=0; // Variable auxiliar para notar cambios en el contador.

void setup()

Serial.begin(115200); // Dará la posición por el terminal serie.

/*

pinMode(2, INPUT); // No es necesario declarar pinMode, "attachInterrupt" se encarga de convertir en entrada,


pero

pinMode(3, INPUT); // los puedes poner si quieres. Los pines 2 y 3 es donde va conectado el encoder incremental.

*/

attachInterrupt(digitalPinToInterrupt(2), encoder, CHANGE); // En cualquier flanco ascendente o descendente


CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

attachInterrupt(digitalPinToInterrupt(3), encoder, CHANGE); // en los pines 2 y 3 actúa la interrupción.

void loop()

if(n != contador) // Sólo cuando la variable contador cambie de valor se transmite dicho valor.

n=contador;

Serial.println(contador);

void encoder()

ant=act; // Guardamos 'act' para convertirlo en pasado.

if(digitalRead(2)==1) bitSet(act,0); else bitClear(act,0); // Seteamos los dos primeros bits de la variable 'act' con

if(digitalRead(3)==1) bitSet(act,1); else bitClear(act,1); // el valor de este instante, como un número de dos bits.

if(ant==3 && act==1) contador++;

if(ant==1 && act==0) contador++;

if(ant==0 && act==2) contador++;

if(ant==2 && act==3) contador++;

if(ant==1 && act==3) contador--;

if(ant==0 && act==1) contador--;

if(ant==2 && act==0) contador--;

if(ant==3 && act==2) contador--;

Una manera de leer el encoder de forma más eficiente sería hacerlo en paralelo en vez de comprobar bit a bit.
La función/interrupción encoder() quedaría así:

void encoder()

{
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

ant=act; // Guardamos el valor 'act' en 'ant' para convertirlo en pasado.

act=PIND & 12; // Guardamos en 'act' el valor que hay en ese instante en el encoder y hacemos un

// enmascaramiento para aislar los dos únicos bits que utilizamos para esta finalidad.

if(ant==12 && act==4) contador++;

if(ant==4 && act==0) contador++;

if(ant==0 && act==8) contador++;

if(ant==8 && act==12) contador++;

if(ant==4 && act==12) contador--;

if(ant==0 && act==4) contador--;

if(ant==8 && act==0) contador--;

if(ant==12 && act==8) contador--;

volatile int contador=0; // Declaramos como 'volatile' las variables que participan dentro y fuera de la interrupción.

byte ant=0, act=0; // Sólo se utiliza los dos primeros bits de estas variables. ant=anterior, act=actual.

int n=0; // Variable auxiliar para notar cambios en el contador.

void setup()

Serial.begin(115200); // Dará la posición por el terminal serie.

/*

pinMode(2, INPUT); // No es necesario declarar pinMode, "attachInterrupt" se encarga de convertir en entrada,


pero

pinMode(3, INPUT); // los puedes poner si quieres. Los pines 2 y 3 es donde va conectado el encoder incremental.

*/

attachInterrupt(digitalPinToInterrupt(2), encoder, CHANGE); // En cualquier flanco ascendente o descendente

attachInterrupt(digitalPinToInterrupt(3), encoder, CHANGE); // en los pines 2 y 3 actúa la interrupción.

void loop()

{
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

if(n != contador) // Sólo cuando la variable contador cambie de valor se transmite dicho valor.

n=contador;

Serial.println(contador);

void encoder()

ant=act; // Guardamos 'act' para convertirlo en pasado.

if(digitalRead(2)==1) bitSet(act,0); else bitClear(act,0); // Seteamos los dos primeros bits de la variable 'act' con

if(digitalRead(3)==1) bitSet(act,1); else bitClear(act,1); // el valor de este instante, como un número de dos bits.

if(ant==3 && act==1) contador++;

if(ant==1 && act==0) contador++;

if(ant==0 && act==2) contador++;

if(ant==2 && act==3) contador++;

if(ant==1 && act==3) contador--;

if(ant==0 && act==1) contador--;

if(ant==2 && act==0) contador--;

if(ant==3 && act==2) contador--;

Una manera de leer el encoder de forma más eficiente sería hacerlo en paralelo en vez de comprobar bit a bit.
La función/interrupción encoder() quedaría así:

void encoder()

ant=act; // Guardamos el valor 'act' en 'ant' para convertirlo en pasado.

act=PIND & 12; // Guardamos en 'act' el valor que hay en ese instante en el encoder y hacemos un

// Enmascaramiento para aislar los dos únicos bits que utilizamos para esta finalidad.
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

if(ant==12 && act==4) contador++;

if(ant==4 && act==0) contador++;

if(ant==0 && act==8) contador++;

if(ant==8 && act==12) contador++;

if(ant==4 && act==12) contador--;

if(ant==0 && act==4) contador--;

if(ant==8 && act==0) contador--;

if(ant==12 && act==8) contador--;

Tabla de mediciones del Enconder.

Encoder Angulo Encoder Angulo


0 0 0 0
380 90 -340 -90
784 180 -748 -180
1135 270 -1140 -270
1534 360 -1614 -360

Angulo Positivo
400

350 y = 0.2353x - 0.4059

300

250

200

150

100

50

0
0 200 400 600 800 1000 1200 1400 1600 1800
-50

Figura N° 1 Grafica Angulo Positivo


CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Angulo Negativo
0
-1800 -1600 -1400 -1200 -1000 -800 -600 -400 -200 0
-50
y = 0.2227x - 8.8423
-100

-150

-200

-250

-300

-350

-400
Figura N° 2 Grafica Angulo Negativo

 Una vez que se obtuvo el modelo matemático se procede a la realización de la sintonización de control
PID, para este caso lo más recomendable es la utilización del criterio de la ganancia límite. A
continuación se detalla minuciosamente como se ejecuta este criterio:

1) Verificar que el sistema esté en lazo cerrado


2) Hacer que el parámetro de control solo actúe como proporcional

𝐾𝐷 = 0 𝑇𝐷 = 0

𝐾𝐼 = 0 𝑇𝐼 = ∞

3) A la primera damos una entrada escalón unitario


4) Incremento la ganancia proporcional
5) Damos la perturbación
6) Observar, esperar, si se estabiliza
7) Incremento la ganancia
8) Doy la perturbación
9) Observar, esperar, si se estabiliza repito el proceso 4) y 5). Si el sistema empieza a oscilar.
10) Hallo la Ganancia crítica 𝐾𝑃𝐶 y el periodo crítico 𝑇𝑃𝐶
11) Elijo el criterio de sintonización
12) Damos valores de 𝐾𝑃 , 𝑇𝐷 , 𝑇𝐼 según la tabla.
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Figura N° 3 Tabla para el cálculo de constantes del control PID


CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Figura N° 4 Diagrama de flujos del criterio de ganancia límite

 En la siguiente tabla se muestra los valores iniciales que se añadió para obtener oscilaciones
constantes.

Valor de la ganancia
Oscilación
Crítica Kc
0.20 No oscila
No oscila
0.21
No oscila
0.22
No oscila
0.23
No oscila
0.24
No oscila
0.25
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

No oscila
0.26
No oscila
0.27
No oscila
0.28
No oscila
0.29
No oscila
0.30
No oscila
0.31
No oscila
0.32
No oscila
0.33
No oscila
0.34
No oscila
0.35
No oscila
0.36
No oscila
0.37
No oscila
0.38
No oscila
0.39
No oscila
0.40
No oscila
0.41
Oscila
0.42 constantemente

Como ya se consiguió tener las oscilaciones contantes con Kc = 0.423 se procede a calcular Ti y Td basándose
en la Figura N° 1.

PID:

𝐾𝑝 = 0.6 ∗ 𝐾𝑐 = 0.2538

𝑇𝑖 = 0.5 ∗ 𝑇𝑐 = 2.6

𝑇𝑑 = 0.125𝑇𝑐 = 0.65

CONTROLADOR PD.

Balance de control PD
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

En este apartado vamos a controlar el péndulo de Furuta entorno al punto de funcionamiento, es decir, entorno
a la posición vertical del mismo a la vez que vamos a intentar controlar también el ángulo del brazo, phy. Por
tanto se van a controlar dos variables, el ángulo del péndulo y del brazo, con una sola variable de actuación, la
tensión de entrada al motor.

Se va a intentar establecer en que rango entorno al punto de funcionamiento el balance de control PD es capaz
de controlar adecuadamente y se van a discutir los resultados.

Como es sabido, un control PD proporciona una entrada al sistema que es la suma de un término proporcional
y otro derivativo del error, actuando este último fundamentalmente en el régimen transitorio del sistema que es
cuando mayormente varía el error y por tanto la variación del error respecto del tiempo es mayor, como en
régimen permanente apenas varía el error la variación del mismo es prácticamente cero provocando una
actuación insignificante por parte del término derivativo.

Con un solo control PD es imposible controlar dos salidas, por ello la entrada al sistema va a ser la suma de
dos controladores PD, uno aplicado a una de las salidas y el otro PD a la otra salida, de este modo si alcanzamos
la referencia para una de las salidas pero no para la otra seguiremos teniendo una señal de entrada al sistema
hasta que ambas referencias sean alcanzadas.

La tensión de entrada a nuestro modelo es la suma de dos controladores PD, tal como se comentó
anteriormente. El control que se aplica a la posición del ángulo del brazo del péndulo, phy, contiene un término
proporciona Kp con valor -2 y un término derivativo Kd con valor 0.8, previa a la ganancia derivativa podemos
ver un filtro HP con la función de transferencia,

Control LQR

En el apartado anterior se controló el sistema entorno al punto de funcionamiento a través de un balance de


control PD, en este apartado se va a emplear un tipo de control óptimo, el control LQR, que nos proporcionará
un término proporcional que nos permitirá controlar el péndulo. Para usar esta estrategia de control previamente
tendremos que linealizar y rescribir en espacio de estados las ecuaciones de movimiento del sistema.
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Linealización de ecuaciones diferenciales

Para poder realizar el control LQR previamente tenemos que linealizar nuestro sistema para pasarlo al espacio
de estados, en este apartado se intentará explicar detalladamente la linealización de ecuaciones diferenciales.

Antes de linealizar ecuaciones diferenciales veremos como linealizar una ecuación algebraica y se comentará
su significado.

Sea la función no lineal 𝑦 𝑡 = 𝑡2, suponiendo que queremos tener una aproximación lineal a dicha función en
𝑡𝑜 = 2, la ecuación que rige dicha función lineal es la siguiente

𝑦(𝑡)𝐿𝐼𝑁 = 𝑦 𝑡𝑜 + 𝜕 𝑦(𝑡) /𝜕𝑡

𝑡=𝑡𝑜 (𝑡 − 𝑡𝑜 )

(𝑡)𝐿𝐼𝑁 = 4 + 4(𝑡 − 2)

Se introduce el término de variable incremental, 𝛼 𝑡 = 𝑡 − 𝑡𝑜. Como se puede ver en la figura 2-32 para que la
aproximación lineal sea válida hemos de estar entorno a 𝑡𝑜, es decir, la variable incremental debe estar
próxima a cero. Además de modelo de variables incrementales a veces también se le puede llamar modelo de
pequeña señal.

Si tenemos más variables entorno a las que linealizar el procedimiento es idéntico, sea la función 𝑓 𝑥, 𝑦 =𝑥𝑦
se quiere linealizar entorno a 𝑥𝑜 = 0 𝑦𝑜 = 0. Se definen las variables incrementales

𝛼 𝑡 = 𝑥 𝑡 − 𝑥𝑜

𝛽 𝑡 = 𝑦 𝑡 – 𝑦𝑜

La linealización responde a la expresión de Taylor,

Que en nuestro caso daría lugar a,


(𝑥, 𝑦)𝐿𝐼𝑁 = 0
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Para linealizar ecuaciones diferenciales básicamente hacemos lo mismo que para ecuaciones algebraicas pero
teniendo en cuenta que:

1) Si hay una parte de la ecuación diferencial que se deriva respecto al tiempo, el primer paso es realizar
dicha derivación total, véase el siguiente ejemplo.

𝐹 𝑡 = 𝑑 𝑎 ∙ 𝐻2(𝑡) → 𝐹 𝑡 = 2 ∙ 𝑎 ∙ 𝐻(𝑡) ∙ 𝐻 (𝑡)𝑑𝑡

2) Hay que tomar la expresión de Taylor, derivar parcialmente, respecto de todas las variables y sus
derivadas, ya que todas tendrán un valor concreto en el punto de funcionamiento.

A continuación se van a linealizar las ecuaciones de movimiento de péndulo de Furuta entorno al punto de
funcionamiento que no es otro que 𝜃𝑜 = 0, 𝜃 𝑜 = 0, 𝜃 0 = 0, 𝜑𝑜 = 0, 𝜑 𝑜 = 0, 𝜑 𝑜 = 0 𝑦 𝑢𝑜 = 0, que sería con el
péndulo en posición vertical hacia arriba con el brazo en un ángulo de cero grados, donde no debe de haber
movimiento, de ahí que las derivadas temporales sean cero, y con tensión aplicada igual a cero voltios.

Las ecuaciones de movimiento, obtenidas son:

Con,

∆= 𝛽 + 𝑠𝑖𝑛2𝜃 − 𝛼2𝑐𝑜𝑠2𝜃

Linealizando la primera ecuación término a término queda que el término de la izquierda de la igualdad se reduce
a (𝛽 − 𝛼2) , el primer, segundo y tercer sumando de la derecha se reducen a cero, al igual que el quinto, mientras
que el cuarto queda como 𝛽𝜃, el sexto queda – 𝛾𝛼𝑢 y el último queda igual al ser ya lineal.

Por otro lado, linealizando la segunda ecuación diferencial queda que ∆𝜑 → (𝛽 − 𝛼2) , 𝛼𝜃 2 sin 𝜃 → 0,−𝛼𝜑 2 sin
𝜃 𝑐𝑜𝑠2𝜃 → 0 , −2𝜃 𝜑 sin 𝜃 cos 𝜃 → 0, −𝛼 sin 𝜃 cos 𝜃 → −𝛼𝜃 y los dos términos restantes ya son lineales.
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Por tanto, obtenemos la siguiente ecuación de movimiento linealizada entorno al punto de funcionamiento:

𝛽 − 𝛼2 𝜃 = 𝛽 𝜃 − 𝛾 𝛼 𝑢 − 𝑐𝑝 𝜃

𝛽 − 𝛼2 𝜑 = −𝛼 𝜃 + 𝛾 𝑢 − 𝑐𝑎 𝜑

Obtención del modelo en espacio de estados

Una vez que tenemos las ecuaciones linealizadas de movimiento vamos a tratar de describirlas en espacio de
estados, esto es, describirlas de la forma siguiente,

𝑥 =𝐴𝑥+𝐵𝑢

El parámetro x es el espacio de estados, que en nuestro caso es,

𝑥 = [𝜑 𝜃 𝜑 𝜃]

La ecuación de movimiento, considerando que α=0.56, β=0.74, γ=2.37, cp=0.5 y ca=0.5, queda como,

𝜃 = 1.737 𝜃 − 3.115 𝑢 − 1.174 𝜃

𝜑 = −1.315 𝜃 + 5.563 𝑢 − 1.174 𝜑

Que escrito en espacio de estados es,

Programación PID Prueba 1

#include <Encoder.h>

#include <PID_v1.h>

#include <TimerOne.h>

#include <SoftwareSerial.h>

#define RxD 8 // Usado para conexion rs232 virtual.

#define TxD 9
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

SoftwareSerial nextion(RxD, TxD);

const int dirA=8;

const int dirB=12;

const int motorPWM=4;

volatile long int prevPosition=0,newPosition;// int calucation is faster than double so

double setPoint, input, output;

double Kp=350.5, Ki=35.15, Kd=55.20;// Gains of the PID controller

PID myPID(&input, &output, &setPoint, Kp, Ki, Kd, DIRECT);

double E;

double reqE=4.2;

volatile double rate;

Encoder myEnc(2,3);

void setup() {

nextion.begin(115200);

nextion.print("cle 1,255\xFF\xFF\xFF");

Serial.print("cle 1,255\xFF\xFF\xFF");

Serial.begin(115200);

//Serial.println("Basic Encoder Test:");

pinMode(dirA,OUTPUT);

pinMode(dirB,OUTPUT);

pinMode(motorPWM,OUTPUT);

Timer1.initialize(10000); // set a timer of length 10000 microseconds (or 10 ms )

Timer1.attachInterrupt(callback); // attach the service routine here

setPoint=3.14;

myPID.SetMode(AUTOMATIC);

myPID.SetOutputLimits(-150, 150);

myPID.SetSampleTime(5);

}
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

void loop() {

int envia=newPosition*255/6.28;

enviaDato (1,0,envia);

input = newPosition*0.00157; // Since the encoder generates 4000 pulses in 1 revolution 4000 pules= 360 degree Hence,
1 pulse=0.09 degree

//Serial.println(input);

if(input > 2.96 && input < 3.31) balance(); // Switch the controller between 170 and 190 degrees

else

totalEnergy(rate,input); // Finding the energy at particular instant

if((rate<0 && E<reqE) ||(rate>=0 && E>=reqE)){

digitalWrite(dirA,LOW);

digitalWrite(dirB,HIGH);

analogWrite(motorPWM,90);

delay(30);}

else if((rate>=0 && E<reqE) ||(rate<0 && E>=reqE)){

digitalWrite(dirA,HIGH);

digitalWrite(dirB,LOW);

analogWrite(motorPWM,90);

delay(30);

}
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

void balance(){

myPID.Compute();

if(output>=0){

digitalWrite(dirA,HIGH);

digitalWrite(dirB,LOW);

analogWrite(motorPWM,abs(output));

else if(output<0){

digitalWrite(dirA,LOW);

digitalWrite(dirB,HIGH);

analogWrite(motorPWM,output);

void callback()

newPosition = myEnc.read();

rate=((newPosition-prevPosition)*0.00157)/0.01;//0.01 second is the sample time and we are converting the velocity in
radians per second 1 degree=0.01744 radians and 1 pulse=0.09 degree since 360 degree=4000 pulses

if(newPosition>4000)// I am using a 1000 PPR encoder with 4X decoding

newPosition -= 4000;

myEnc.write(newPosition);

else if(newPosition<-4000)

newPosition += 4000;

myEnc.write(newPosition);

}
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

prevPosition=newPosition;

double totalEnergy(double y,double z){

/*This is the energy at any instant*/

E=0.010773*y*y+1.0536*(1+cos(z));

return E;

void enviaDato(int id,int canal, int dato) {

String comando = "add ";

comando += id;

comando += ",";

comando += canal;

comando += ",";

comando += dato;

comando += "\xFF\xFF\xFF";

nextion.print(comando);

Serial.print(comando);

RESULTADOS:
De acuerdo al proceso que se efectuó el control PID del Péndulo de Furuta requiere de una interpretación
minusiosa, es decir, al realizar la oscilación de la masa su movimiento es tridimensional lo cual es necesario
tener ecuaciones en función de estos movimientos, para ello la parte o los parámetros fundamentales en la
oscilación es la posición angular y la velocidad angular de la masa, también para que se efectúe un movimiento
adecuado es necesario tener una masa adecuada para alcanzar la estabilidad en la parte superior.
ANÁLISIS DE RESULTADOS:
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

Para efectuar el movimiento se basó en el movimiento del péndulo simple como se muestra en la Figura a
continuación, se trata de realizar el movimiento de izquierda a derecha lo cual tomando como referencia la
masa en reposo (0,0) sus puntos de movimiento toma valores positivos y negativos como ya se desarrolló en
su modelamiento matemático

Figura N° 5 Movimiento bidimensional del péndulo, representa diferentes fuerzas durante el movimiento lo cual es primordial para el análisis del
cuerpo dinámico.

CONCLUSIONES:
 De acuerdo a la revisión de la parte mecánica del proyecto, las condiciones en que se encuentra son
favorables ya que el péndulo, la base y la masa cuentan con un correcto desempeño y funcionamiento.
Es improbable que el modelo falle mecánicamente.
 En la parte electrónica del proyecto hay una serie de dificultades que radican en la mala selección de los
componentes al momento de la implementación del modelo, es decir, los componentes no cumplen con
los requerimientos necesarios para el adecuado control del péndulo de Furuta. Este ámbito es el que más
fallas puede producir dentro del funcionamiento del proyecto.
 Se debe realizar una redistribución de los elementos del modelo, tomando en cuenta factores como la
protección de los mismos y la factibilidad de su ubicación en el modelo. Hay componentes que no se
encuentran debidamente ubicados y por lo tanto no se puede disponer el modelo de una manera adecuada
para su funcionamiento.
 El control que se debe realizar debe ser una especie de control hibrido dividiendo el proceso en dos partes,
una en que la masa se eleve cerca al punto de estabilidad y otra en que la masa se estabilice dentro de un
rango menor de variabilidad. Este control debe diseñarse de acuerdo a un modelo matemático que sea
fiable y bastante bien adaptado al modelo real del proyecto del péndulo de Furuta.

RECOMENDACIONES:
CÓDIGO: SGC.DI.505
GUIA PARA LAS PRÁCTICAS DE VERSIÓN: 2.0
FECHA ULTIMA REVISIÓN:
LABORATORIO, TALLER O CAMPO. 19/12/2017

 Revisar las conexiones del encoder a la tarjeta Arduino ya que debido al movimiento de la estructura
estos se enredan y se rompen, encontrar una mejor manera de conexión sería lo ideal.
 Proteger la circuitería del ambiente exterior es decir, que posea una estructura que cubra los elementos
que se pueden dañar al estar expuestos a todas las condiciones ambientales.

BIBLIOGRAFÍA:

FIRMAS

F:
F: ………………………………………………
F: ………………………………………… ……
……………………………………… …….
……. Nombre:
Nombre: COORDINADOR/JEFE DE
Nombre: COORDINADOR DE ÁREA DE LABORATORIO
DOCENTE CONOCIMIENTO

You might also like