Un controlador PID es un algoritmo que calcula una acción de control a partir del error combinando tres términos: proporcional, integral y derivativo.
En este artículo vamos a empezar por los dos primeros, la acción proporcional (P) y la acción integral (I). Son las dos piezas que más vas a usar en sistemas reales, porque con un simple PI se controlan hornos, motores, fuentes de alimentación, depósitos, bombas y media industria.
La idea de fondo es muy sencilla. Medimos lo que queremos controlar, lo comparamos con el objetivo y calculamos el error:
Donde r(t) es la referencia o setpoint, e y(t) es la salida real medida por el sensor. A partir de ese error, el controlador decide cuánto empujar.
La acción proporcional
La acción proporcional es la parte del controlador que responde directamente al error actual. Si el error es grande, empuja mucho. Si el error es pequeño, empuja poco.
Matemáticamente es la parte más simple del PID:
Kp es la ganancia proporcional. Es, literalmente, cuánta fuerza aplicamos por cada unidad de error.
Si estamos controlando la temperatura de un horno y queremos 200 °C, pero medimos 180 °C, tenemos un error de 20 °C. Con Kp = 5, el controlador mandará una acción proporcional de 100 unidades de salida, siempre que las unidades de Kp sean coherentes.
float error = setpoint - temperatura_actual;
float salida_p = Kp * error;Hasta aquí, cero misterio. Es el típico “cuanto más lejos estoy, más fuerte acelero”.
Qué consigue la P
La acción proporcional hace que el sistema reaccione rápido. Subir Kp suele provocar que la planta llegue antes al objetivo, porque el controlador empuja con más ganas.
Pero tiene un límite. Si Kp es demasiado pequeña, el sistema será perezoso y tardará mucho en llegar. Si Kp es demasiado grande, empezará a pasarse, oscilar, e incluso puede volverse inestable.
Subir Kp no es una solución universal. Al principio parece que todo mejora, hasta que un poquito más de ganancia convierte tu motor en una batidora nerviosa.
La P es rápida, intuitiva y barata de calcular. Por eso es la primera acción que se prueba casi siempre.
El problema del error permanente
Ahora viene el detalle puñetero. Un controlador solo proporcional puede dejar error en régimen permanente.
Supongamos que queremos mantener un motor a cierta velocidad. Cuando el motor se acerca al objetivo, el error se hace pequeño. Como la salida proporcional es Kp * error, la acción de control también se hace pequeña.
Puede llegar un punto en el que el motor necesite, por ejemplo, un 20% de PWM solo para vencer la fricción. Pero si el error ya es pequeño, la P no manda suficiente fuerza. Resultado: el sistema se queda cerca del objetivo, pero no llega del todo.
Queríamos 1000 rpm, pero se queda en 970 rpm.
Y lo peor es que se queda tan ancho. Para la acción proporcional, ese pequeño error es justo lo que necesita para seguir generando la fuerza que compensa la carga.
La acción integral
La acción integral es la parte del controlador que acumula el error a lo largo del tiempo. Si existe un error pequeño pero persistente, la integral lo va sumando hasta que se vuelve suficientemente grande como para corregirlo.
Matemáticamente se escribe así:
La integral es la memoria del controlador. La P mira el presente. La I mira el pasado y pregunta: “¿cuánto tiempo llevamos equivocándonos?”
integral_acumulada += error * dt;
float salida_i = Ki * integral_acumulada;Gracias a esto, si el sistema se queda por debajo del objetivo durante mucho rato, la integral crece poco a poco hasta añadir la fuerza que faltaba. Por eso decimos que la acción integral elimina el error en régimen permanente.
El lado peligroso de la integral
La integral es muy útil, pero tiene carácter. Como acumula error, también puede acumular problemas.
Si Ki es demasiado alta, la integral crece demasiado rápido. El sistema llega al objetivo, pero la integral trae tanta “inercia acumulada” que sigue empujando cuando ya debería parar. Entonces aparece el overshoot y las oscilaciones.
La integral corrige el error permanente, pero también suele aumentar el sobrepaso y el tiempo de asentamiento. Es una herramienta estupenda, pero no conviene echarla con pala.
Además, cuando el actuador satura, la integral puede seguir creciendo aunque el hardware ya no pueda entregar más potencia. Ese problema se llama Integral Windup, y lo veremos con calma más adelante.
Control P vs PI
Un controlador proporcional puro tiene esta forma:
Un controlador PI añade la memoria del error:
En la práctica, el PI es una combinación muy habitual porque reparte bien el trabajo:
- P aporta reacción rápida frente al error actual.
- I elimina el error permanente que la P no consigue quitar.
Para sistemas térmicos, control de velocidad, presión, caudal o nivel, un PI bien ajustado suele ser suficiente. No siempre hace falta meter la D, y de hecho muchas veces se evita porque es sensible al ruido.
Implementación básica de un PI
Un controlador PI discreto, para Arduino o ESP32, puede verse así:
float Kp = 2.0;
float Ki = 0.5;
float integral_acumulada = 0.0;
float calcularPI(float setpoint, float medida, float dt) {
float error = setpoint - medida;
float P = Kp * error;
integral_acumulada += error * dt;
float I = Ki * integral_acumulada;
return P + I;
}Este código es sencillo, pero ya contiene la idea principal. En cada ciclo calculamos el error, aplicamos la acción proporcional y sumamos un pequeño rectángulo de error a la integral.
Fíjate en dt. Debe representar el tiempo real entre muestras y ser siempre positivo. Si el periodo varía mucho o usamos un valor incorrecto, la integral deja de representar bien el área y el controlador cambia de comportamiento.
La acción proporcional es la parte que dice “cuanto más lejos estoy, más empujo”. Es rápida, simple y muy efectiva, pero puede dejar error permanente.
La acción integral dice “si llevamos mucho tiempo fallando, voy a corregirlo”. Gracias a ella eliminamos el error en régimen permanente, aunque pagamos el precio de más sobreoscilación y posibles problemas de saturación.