Control de Temperatura con PID.
Enviado por tolero • 27 de Febrero de 2018 • 1.613 Palabras (7 Páginas) • 404 Visitas
...
}
El algoritmo final de control:
const float Kp =10;//ganancia proporcional como una constante q´puede tener decimales
const float Ki =.5;//ganancia integral
const float Td =0;//ganancia derivativa
const int referencia=26;// referencia o set-point constante entera
float temperatura = 0;
unsigned long lastTime;//variable de tiempo auxiliar para muestreos uniformes
float erroractual=0;// el error del sistema
float errorAcum=0;
float ultimoerror=0;
int T=10; // periodo de muestreo T deseado en milisegundos
int actuador=9; // el pin9 de salida "analogica" se llamará actuador
int actuador2=8; // el pin8 de salida
int inputPin = A0; // el pin A1 de entrada analogica se llamará inputPin
const int numReadings = 20;
int readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
int total = 0; // the running total
double average = 0; // the average
void setup()
{
// inicializar comunicación seria con la pc:
Serial.begin(9600);
for (int thisReading = 0; thisReading
readings[thisReading] = 0;
//initialize the variables we're linked to
}
void loop() {
//subtract the last reading:
total= total - readings[index];
//read from the sensor:
readings[index] = analogRead(inputPin);
//add the reading to the total:
total= total + readings[index];
//advance to the next position in the array:
index = index + 1;
// if we're at the end of the array...
if (index >= numReadings)
// ...wrap around to the beginning:
index = 0;
// calculate the average:
average = total / numReadings;
int sensor=average;
sensor = (5.0 * sensor*100.0)/1023.0;
Serial.println (sensor); //escribe la temperatura en el serial
delay (500); //espera 3 segundos para la siguiente medicion
unsigned long now = millis(); //now sera el tiempo transcurrido desde el arranque
int timeChange=(now-lastTime); // tiempo transcurrido
if(timeChange>=T){ //hasta que el tiempo transcurrido sea >T se calcula el resto
erroractual=referencia-sensor; // calculo del error
errorAcum+=erroractual;//+ultimoerror;
float diferror=erroractual-ultimoerror;
int uP=(erroractual)*Kp+(errorAcum)*Ki+(diferror)*Td;//calculo de ley de controll proporcional al error,a la sumatoria del error (integral) y al cambio del error;
if (erroractual>0)
{
//then pin 9)
uP=constrain(uP,0,255);
analogWrite(actuador,uP);
}
else (erroractual
{
//then pin 8 )
uP=constrain(uP,0,255);
analogWrite(actuador2,uP);
}
Serial.println(sensor);
ultimoerror=erroractual;
lastTime=now;}// grabar el ultimo tiempo medido en la variable lastime
}
---------------------------------------------------------------
GRAFICA DEL CONTROL PID.
Grafica con control proporcional:
[pic 8]
Como podemos observar, en esta acción presenta un error en estado estable.
Grafica con control proporcional-integral:
[pic 9]
---------------------------------------------------------------
PROCEDIMIENTOS
El proceso elegido es el control de temperatura. Para ello un bulbo incandescente de corriente directa genera el calor y un ventilador actúa como control para la refrigeración. Un sensor resistivo de tipo NTC se encarga de registrar la temperatura del habitáculo, en este caso se utilizó el dispositivo electrónico LM-35.
Se ha instalado el sensor de temperatura junto a la lampara para que el proceso disponga de la menor inercia posible, y así se comporte más rápido ante cambios de la entrada.
Los objetivos del proyecto usando Arduino han sido:
...