Está en la página 1de 3

Ejemplo de sistema de control PID.

En una planta se controla el actuador mediante un


sistema PID como se muestra. El actuador es un motor dc con reductor que abre o cierra
una válvula que permite el paso de vapor a alta temperatura. La señal de salida de la planta
es la temperatura y la señal de entrada o setpoint se establece con un potenciómetro.
Escriba el programa de control para un microcontrolador Arduino, que haga que el dato de
temperatura (0 – 1023) siga al dato de setpoint (0 – 1023) si el error es mayor de 5
unidades.
// constantes y variables
const int pinENA = 3; // pin de pwm
const int pinIN1 = 7; // pines de dir de giro del motor
const int pinIN2 = 8;
double kp = 1.5; // const proporcional
double ki = 0.5; // const integral
double kd = 1; // const derivada
double error; // variables
double lastError;
double elapsedTime;
double input, output, setPoint;
double cumError, rateError;
unsigned long currentTime, previousTime;
void setup()
{
pinMode(pinIN1, OUTPUT); // pines de dir
pinMode(pinIN2, OUTPUT);
pinMode(pinENA, OUTPUT); // pin de PWM
}
void loop()
{
input = analogRead(A0); // lee el dato de temperatura (0 -1023)
setPoint = analogRead(A1); // lee el dato del pot en A1 (0 - 1023)
output = computePID(input, setPoint); // llama a la function PID
pwm = map(output, 0, 1023, 0, 255); // pwm en Arduino es de 8 bits
delay(100); // period del PID
analogWrite(pinENA, pwm); // activa el motor con PWM
}
double computePID(double inp, setPoint) // funcion PID
{
currentTime = millis(); // lee el tiempo desde que inicio el prog
elapsedTime = (double)(currentTime - previousTime); // calcula el tiempo que ha pasado
error = Setpoint - inp; // calcula el error
if (error > 0)
{
digitalWrite(pinIN1, 1); // giro horario
digitalWrite(pinIN2, 0);
}
if (error < 0)
{
digitalWrite(pinIN1, 0); // giro anti-horario
digitalWrite(pinIN2, 1);
}
if (abs(error >= 5))
cumError += error * elapsedTime; // calcula el termino integral
rateError = (error - lastError)/elapsedTime; // calcula el termino derivativo
double out = kp*error + ki*cumError + kd*rateError; // obtiene la accion PID
lastError = error; // guarda el error actual
previousTime = currentTime; // guarda el tiempo actual
return out; // regresa el valor PID
}
else
out = 0;
return out; // el error es menor de 5.
}
}

También podría gustarte