// Variables para el PID
double Setpoint, Input, Output;
double Kp = 2, Ki = 5, Kd = 1;
unsigned long lastTime;
double ITerm, lastInput;
// Configuración inicial
void setup() {
// Inicializar las variables de entrada y salida
Setpoint = 100; // Valor deseado
Input = analogRead(A0); // Leer la entrada inicial
lastTime = millis(); // Guardar el tiempo inicial
}
// Loop principal
void loop() {
// Leer el valor de entrada
Input = analogRead(A0);
// Calcular el error
double error = Setpoint - Input;
// Calcular el término integral
ITerm += (Ki * error);
// Limitar el término integral para evitar integrador windup
if (ITerm > 255) ITerm = 255;
else if (ITerm < 0) ITerm = 0;
// Calcular el cambio en la entrada
double dInput = (Input - lastInput);
// Calcular la salida PID
Output = Kp * error + ITerm - Kd * dInput;
// Limitar la salida
if (Output > 255) Output = 255;
else if (Output < 0) Output = 0;
// Enviar la salida al actuador
analogWrite(9, Output);
// Guardar el estado actual para la siguiente iteración
lastInput = Input;
lastTime = millis();
// Pequeña pausa para evitar sobrecarga
delay(100);
}