En esta prctica decidimos implementar un control PID para la planta que en este caso es nuestro
motor, utilizando la librera PID que es utilizada para el software ENERGIA.
A continuacin se muestra el sistema con retroalimentacin.
Cabe mencionar para la eleccin de las constantes Kp, Ki, y Kd fueron calculadas en otros proyectos similares en donde utilizamos un motor con potencimetros como sensores. Es as que se llego a las siguientes constantes: Kp = 1.0 Ki = 0.8 Kd = 0.05
El cdigo generado es el siguiente: #include <PID_v1.h> //Se agrega la Libreria PID const int referencia = 0; // Se define el pin analogo 0 para el potenciometro de referencia const int sensor = 1; // Se define el pin analogo 0 para el potenciometro sensor const int pwm = 3; // se define el pin con PWM double lightLevel; //variable auxiliar para mapeo INPUT int sentido1 = 2; // Se define variable sentido de giro 1 int sentido2 = 4; // Se define variable sentido de giro 2 double Setpoint, Input, Output; //Variables (Setpoint = Valor deseado, Input = Sensor , Output = Valor de salida PWM PID myPID(&Input, &Output, &Setpoint, 1, 0.8, 0.05, DIRECT); // Se inicializa controlador PID const int sampleRate = 1; // Variable que determina la rapidez con que el PID se ejecuta // Communication setup const long serialPing = 500; //Determina la Frecuencia que el PID se ejecuta unsigned long now = 0; //Seguimiento del Tiempo unsigned long lastMessage = 0; //Seguimiento de cuando nuestro bucle habl por ltima vez a serie
void setup(){ pinMode(sentido1, OUTPUT);//control1 es una variable de salida pinMode(sentido2, OUTPUT);//control2 es una variable de salida Serial.begin(9600); //Se inicializa el monitor serial myPID.SetMode(AUTOMATIC); //Enciende el PID myPID.SetSampleTime(sampleRate); //Establece la Frecuencia de Muestreo Serial.println("INICIO"); // Imprimir en el monitor Serial lastMessage = millis(); // timestamp }
void loop(){ else if (analogRead(referencia) > analogRead(sensor)) { digitalWrite(sentido1, LOW); //El pin de sentido 1 lo manda a 1 lgico (5 Volts) digitalWrite(sentido2, HIGH); // El pin de sentido 2 lo manda a 0 lgico (0 Volts) Setpoint = map(analogRead(referencia), 0, 1024, 0, 255); // Mapea el valor del potenciometro referencia lightLevel = analogRead(sensor); //Asigna el valor analogo leido en el sensor a lightLevel Input = map(lightLevel, 0, 1024, 0, 255); //Mapea el valor del sensor myPID.Compute(); //Enciende el bucle de PID analogWrite(pwm, Output); //Escribe el valor de PID con PWM , hacie el motor
now = millis(); //Keep track of time } else if (analogRead(sensor) > analogRead(referencia))//Condicional si el valor leido en el sensor es mayor que el valor leido en el pot referencia { digitalWrite(sentido1, HIGH);//El pin de sentido 1 lo manda a 0 lgico (0 Volts) para el control del puente H digitalWrite(sentido2, LOW);//El pin de sentido 2 lo manda a 1 lgico (5 Volts)para el control del puente H Setpoint = map(analogRead(sensor), 0, 1024, 0, 255); // lightLevel = analogRead(referencia); //Asigna el valor analogo leido en el pot referencia a lightLevel Input = map(lightLevel, 0, 1024, 0, 255); //Mapea el valor del pot referencia myPID.Compute(); //Enciende el bucle de PID analogWrite(pwm, Output); //Escribe el valor de PID con PWM , hacie el motor now = millis(); //Keep track of time lastMessage = now; //update the time stamp. } }