Está en la página 1de 4

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.
}
}

También podría gustarte