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