Está en la página 1de 12

NOMBRE: FABIÁN JOSÉ OJEDA PEÑA

COD: 22181025

SOLUCIÓN:

1)
Para diseñar el compensador en adelanto con las especificaciones requeridas, fue necesario utilizar
el método de la bisectriz:

Cálculos método Bisectriz.


Se obtuvo un ángulo de deficiencia de: 75.89°(De Solidworks).

Para calcular los valores del polo y el cero de la ecuación general del compensador, fue necesario
apoyarse en el software SolidWorks con los valores obtenidos de los cálculos:

Ec. Compensador.

Resultado Solidworks.

Zc=1.92

Pc=7.5

Para llegar a este resultado, primer se ubicó el punto al que se desea llegar, el cual está a -2.66
+2.71i, luego se trazó el vector hacia el punto desde el origen, en este caso desde el origen debido a
que allí se encuentra uno de los polos de la función de transferencia, posterior a ello, se ubicó el
segundo polo de la función el cual se encuentra en -1; se acotaron los ángulos de ambos vectores y
se calculó el ángulo de deficiencia y posterior a ello luego de trazar una línea horizontal en el punto
a llegar, se ubicó la bisectriz con el ángulo de deficiencia/2 y se tomaron las dos medidas resultantes.

Para calcular la constante Kc se utilizó el software Matlab, realizando la igualación y reemplazando


para S= -2.66 +2.71i y los valores de Zc y Kc:
Cálculo de Kc.

Kc=2.3844.

2)
Al reconfigurar los elementos de proteus, se reemplazó la manera para obtener el valor de
referencia, en este caso por un potenciómetro que cuando está en 0v representa -0.6RAD de
referencia y cuando está en 5v representa 0.6RAD; Esto por facilitar la manera de comprobar la
referencia y no estar introduciendo valores decimales de voltaje de 0 a 5v:

Referencia y retroalimentación.

En las especificaciones del problema se pedía una entrada (0 5v) que representaba un valor de -135
y +135 grados, pero, al final se requiere comprobar el sistema para un valor de 0.6 y -0.6 rad, y se
debe calcular el equivalente en voltaje de 0 a 5v para representar dichos valores en radianes; por
esto se implementó el potenciómetro.

Modificación Código Arduino.

Se modificaron las dos entradas del Arduino, en este caso, lo que se hacía con varios amplificadores,
ahora solo se realiza mapeando la señal; para el valor de retroalimentación, solo basta con leer el
voltaje y ponerlo en la ecuación para normalizarlo y a la vez escalarlo a un valor en radianes que
está entre 2.356 y +2.356 radianes; lo mismo se realiza con el valor de referencia, pero en este caso,
no se escala a un valor entre -2.35 y +2.35 rad, sino que (como se especificó arriba) se dejó un valor
entre -0.6 y +0.6 rad, donde 0 representa -0.6 y 5 representa +0.6 (potenciómetro).
Por otro lado, para el cálculo del error solo basta con realizar una resta entre ambos valores (ref-
retro).

NOTA: el factor de escala de 1.6 se utilizó para mejorar el resultado de la salida.

Como el valor del error es un valor que se encuentra entre -1 y +1 ya no es necesario utilizar los
condicionales iniciales para extraer el valor de PWM; El valor del error antes estaba entre 0 y 5v,
donde 2.5 representaba 0% de error; ahora el 0 representa 0% de error y el -1 y +1 representan el
100%, y solo basta con escoger si es mayor o menor que cero:

Explicación de Modificación (Error en voltaje vs % Error).

Modificación de condicionales.

NOTA: Cuando el error es cero se escoge 0 de PWM.

Estas fueron las modificaciones iniciales de la planta para que se comportara tal cual como
aparecía en el modelo analógico (Con amplificadores).

3)
Para implementar la estrategia de control, se empezó analizando el bloque Gc (Ec. Compensador)
planteándolo como una ganancia de salida sobre entrada; posterior a ello, se optó por discretizar
el bloque por medio del método de la transformada Z:
Transformada Z.

NOTA: U(s) representa la salida del bloque de control (Gc) y e(s) es el error que entra al bloque.

Transformada Inversa Z.

Al hacer la transformada inversa Z, se obtiene una función discretizada que es implementable por
el controlador (Arduino), donde:

U[k]=Error modificado (salida del bloque).

U[k-1]= Error modificado Anterior.

E[k]=Error (Entrada del bloque).

E[k-1]= Error Anterior.

T=Periodo de muestreo

NOTA: El periodo de muestreo se calcula cada que se repite el loop.


IMPLEMENTACIÓN EN ARDUINO

Declaración de variables

Calculo de tiempo de muestreo y de constantes

NOTA: El tiempo de muestreo se calcula en 3 pasos (toma de tiempo actual, cálculo de delta de
tiempo, reasignación de variable anterior) debido a que se están utilizando variables flotantes y hay
problemas con ellas; por otro lado, las constantes K1 y K2 son valores que aparecen en la ecuación
discretizada y se calculan por aparte debido a la misma razón del uso de variables flotantes.

Ecuación discretizada

Para terminar la implementación, el valor que se utilizará para calcular el PWM es el valor U [0] el
cual representa la salida del controlador, por otro lado, se realiza una reasignación de variables
luego de haber realizado el cálculo; esto debido a que la ecuación requiere de los valores anteriores.

4) Para demostrar la correcta implementación se utilizó una referencia de 0.6 radianes (5v
potenciómetro):

Ref.
SIMULINK

También se realizó el montaje del circuito en SIMULINK, con los valores obtenidos del bloque del
compensador (Kc, Zc, Pc):

Bloques SIMULINK.

Existen 2 sistemas con la misma referencia (0.6 rad) pero uno de ellos está sin el bloque de control
Gc; como se puede observar, el bloque del compensador tiene los valores calculados en el primer
punto (Zc=1.92, Pc=7.5, Kc=2.3844) de resto, ambas plantas son las mismas:

Respuesta SIMULINK (Con y sin compensador) para ref=0.6.


MATLAB

Resultados sobrepuestos (SIMULINK y PROTEUS) para ref=0.6rad (34.4°).

Resultados sobrepuestos (SIMULINK y PROTEUS) para ref=-0.6rad (-34.4°).


5) CONCLUSIONES:
Ambas respuestas se relacionan bastante, en los mismos tiempos, pero, en algunas zonas no se
obtiene el mismo resultado:

PROBLEMA

Esto se puede deber a que al trabajar en tiempos discretos es muy complicado obtener un
resultado 100% real al valor en tiempo continuo, esto debido a que siempre se están tomando
muestras cada cierto tiempo.

Al utilizar el factor de escala del error (1.6 ) se presenta una mejoría en la salida a diferencia de no
utilizarlo:

Sin factor de escala en el error.


CÓDIGO ARDUINO:

#include <LiquidCrystal.h>
#include <Time.h>
#include <arduino-timer.h>

//Timer<1, micros> timer; // create a timer with 1 task and microsecond resolution
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
int Pin_aref=A0, Pin_aretro=A1;
float val_ref,val_retro,val_tope,gap=0.0; // gap para el comparador
const int PWM_Pin_IN1 = 5, PWM_Pin_IN2 = 3, EN_Pin = 4;
byte PWM_1_Duty = 0, PWM_2_Duty = 0;

float e[2]={0.0,0.0};//Para el error, e[0]=Error actual, e[1]=Error anterior


float u[2]={0.0,0.0};//Salida del compensador, u[0]=Salida actual, u[1]=Salida anterior
const float Kc=2.3844;
const float Zc=1.92;
const float Pc=7.5;
float T=0.0;
float T2=0.0;//Periodo de muestreo
float K1=0.0,K2=0.0; //K1 indice error actual, K2 indice de Salida
//ECUACIÖN EN DIFERENCIAS
float T1=0.0;
unsigned long time1=0,time2=0;
int PWM=0,PWM_ref=0;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
//timer.every(100, COMPENSATOR); //CADA 1000 microsegundos (1 ms)
pinMode(EN_Pin,OUTPUT); //Enable del l293d
digitalWrite(EN_Pin, HIGH);
lcd.clear();
lcd.begin(16, 4);
lcd.print("Control Motor DC");
}
void loop() {

T2=micros()*1.0e-6;
T=T2-T1;
T1=T2;
K1 = Kc*(1.0+Zc*T);
K2 = (1.0+Pc*T);
//digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // toggle the LED
val_retro=analogRead(Pin_aretro)/1023.0*4.7123889-2.3561944; //ENTRADA DEL
POTENCIÓMETRO(-135 y 135) (MAPEO)
val_ref=(analogRead(Pin_aref)/1023.0)*1.2-0.6; //CUANDO ES 5V INDICA 6RAD Y CUANDO ES 0
INDICA -6RAD (MAPEO)
e[0] = -(val_ref - val_retro)/1;

//Cálculo de Compensador en

u[0] = ( (e[0]*K1 - Kc*e[1]) + u[1] )/(K2);


u[1] = u[0];
e[1] = e[0];
if(u[0]>(0)){//&& Enew<=(1+gap)
//proporcional
PWM_ref=u[0]*(255);
PWM=PWM_ref;
}//((255.0-0.0)/(5.0-2.5))*(Enew-2.5)+0.0
else if(u[0]<(0)){
//proporcional
PWM_ref=u[0]*(255);
PWM=PWM_ref;
//if(PWM<255){
// PWM=255;
//}

}else if(u[0]==0){
PWM=0;
}
if (PWM>0){
analogWrite(PWM_Pin_IN1, PWM); //Tabla de estados datasheet l293d
analogWrite(PWM_Pin_IN2, 0); //Tabla de estados datasheet l293d
}
else if (PWM<0){
analogWrite(PWM_Pin_IN1, 0); //Tabla de estados datasheet l293d
analogWrite(PWM_Pin_IN2, -PWM); //Tabla de estados datasheet l293d
}else if (PWM==0){
analogWrite(PWM_Pin_IN1, 0); //Tabla de estados datasheet l293d
analogWrite(PWM_Pin_IN2, 0); //Tabla de estados datasheet l293d
}

lcd.setCursor(0,1); //lcd.setCursor(col, row) with 0 being the first column or row


lcd.print(u[0],3);
lcd.print(" ");
lcd.setCursor(0,2); //lcd.setCursor(col, row) with 0 being the first column or row
lcd.print(T,4);
lcd.print(" ");
lcd.setCursor(0,3); //lcd.setCursor(col, row) with 0 being the first column or row
lcd.print(K2,4);
lcd.print(" ");
}
PLANTA PROTEUS

También podría gustarte