Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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.
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.
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).
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:
Modificación de condicionales.
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:
T=Periodo de muestreo
Declaración de variables
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:
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:
#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;
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
}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
}