CONSTRUCCIÓN Y CONTROL DE UN PÉNDULO INVERTIDO UTILIZANDO LA PLATAFORMA LEGO MINDSTORMS EV3
Enviado por Rimma • 15 de Enero de 2019 • 1.326 Palabras (6 Páginas) • 452 Visitas
...
Observando la función de trasferencia a simple vista se denota que es inestable y se lo comprueba simulando nuestra función en MATLAB.
[pic 17]
FIG. 3 POLOS Y CEROS DE LA FUNCION
La grafica de polos y ceros de la función describe un sistema inestable ya que tiene un polo en el lado derecho del eje.
- pid
Utilizando Matlab y usando el commando SISOTOOL FIG. 4 realizamos una compensación de la función de transferencia para que el sistema pase a ser estable:
[pic 18]
FIG. 4 COMPENSACION DE FUNCION DE TRASFERENCIA
Luego de realizar la compensación la función de traferencia nos queda de la siguiente manera:
[pic 19]
Y las gráficas FIG. 5 corregidas con la funcion:
[pic 20]
FIG. 5 POLOS CEROS Y RESPUESTA CON FUNCION COMPENSADA
Observamos que los polos se han convertido a críticamente estables y que tenemos una función de trasferencia que se estabiliza en el tiempo, con esta función de transferencia ya podemos encontrar las constantes proporcional, integrativa y derivativa teniendo en cuenta que:
[pic 21]
TABLA 2
[pic 22]
Si bien es cierto se han encontrado el PID de mi sistema, puedo yo aun regularlo para que este lo mas estable posible por lo cual usamos el comando PIDTUNER, y regulamos nuestro pid lo mas estable posible en nuestro caso en particular logramos obtener un sistema casi ideal con los valores de la FIG.6
[pic 23]
FIG. 6 PARAMETROS DE CONTROL PIDTUNER
La grafica con los cambios de kp ki y kd es la que se muestra en la FIG 7.
[pic 24]
FIG. 7 PID SINTONIZADO
- PROGRAMACION ROBOTC
La programación se la realizo en Robotc, en el cual se ingresan los valores PID obtenidos.
#pragma config(Sensor, S4, boton, sensorEV3_Touch)
#pragma config(Motor, motorA, derecha, tmotorEV3_Large, PIDControl, driveRight, encoder)
#pragma config(Motor, motorD, izquierda, tmotorEV3_Large, PIDControl, driveLeft, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
//+++++++++++++++++++++++++++++
//Programa base para un PID
//Fecha:06/19/2017
//Realizado:Carlos Flores
//+++++++++++++++++++++++++++++
//Rutina de Inicializacion=====
float ang_sen = 0.000; //dato de lectura del sensor
float ang_sen_anterior=0; //dato de lectura del sensor anterior
float error_pid = 0;//error del sistema de control
float ang_referencia = 0.000;//angulo de referencia
int valor_pid=0;//Valor calculado en la rutina de pid
float kp=142.276;//Constante proporcional
float ki=1482.898;//Constante de Integracion
float kd=3.4127;//Constante Derivativa
float error_presente=0; //Declaramos una variable llamada "error_presente" con inicializacion 0
float error_pasado=0; //Declaramos una variable llamada "error_pasado" con inicializacion 0
//Rutina de Inicializacion=====
//1. Subrutina Sensor Giroscopo=============
void giro()
{
//ang_sen =getGyroRate(S1);
ang_sen = getGyroHeading(S1);
//ang_sen = getGyroDegrees(S1);
displayBigTextLine(10,"%f",ang_sen);
ang_sen = ang_sen - ang_sen_anterior;
if (ang_sen
{
ang_sen=0.000;
}
displayBigTextLine(12,"%d",ang_sen);
ang_sen_anterior= ang_sen; //EL VALOR DEL ANGULO DEL SENSOR SE LE ASIGNA AL VALOR DEL ANGULO ANTERIOR
}
//1. Subrutina Sensor Giroscopo=============
//2. Subrutina Calculo del Error============
void error()
{
error_pid= ang_referencia;
error_pid= ang_sen-error_pid;
error_presente= error_pid;
displayBigTextLine(14,"%d",error_pid);
}
//2. Subrutina Calculo del Error============
//3. Subrutina PID==========================
void pid()
{
float proporcional=0;
float integral=0;
float derivativa=0;
proporcional= kp*error_presente;
integral
...