01 · Punto de partida
El lazo cerrado
Un lazo de control tiene cuatro piezas: un sensor que mide la variable (la temperatura, la velocidad, el nivel), un controlador que la compara con la consigna (setpoint) deseada, un actuador que actúa sobre el proceso y el proceso mismo, que responde con su propia dinámica. Lo que el controlador calcula es el error:
y de ese error obtiene una salida para el actuador. Si el error es positivo (hace frío), hay que calentar; si es negativo, dejar de hacerlo. Es realimentación negativa: lo que se mide se resta de lo que se desea y el lazo trabaja para anular la diferencia. Lo hace aun cuando cambie el clima, la carga o el estado del equipo, que es la razón por la que el control en lazo cerrado supera a calcular una vez cuánta potencia hace falta. Es el lazo que ya vimos con el motor del tema 31, con el posicionador del 34 y con el termostato del tema 40.
Dos ejemplos conductores acompañan todo el tema:
- Un horno eléctrico de 100 W con una masa térmica de 2000 J/K y una pérdida de 0,5 K por vatio (en reposo a 40 °C con 15 °C de ambiente pierde 50 W). Su constante de tiempo es de τ = 1000 s y un sensor que reacciona 20 s tarde. Con 100 W a pleno llegaría a 65 °C; para mantener 40 °C necesita el 50 % de la potencia.
- Un motor o un servo, donde la variable es la velocidad o el ángulo y los tiempos son milisegundos (la misma lógica, escalas distintas).
02 · La ley más simple
Control todo o nada
El control todo o nada (on/off o bang-bang) solo conoce dos órdenes: actuar a pleno o no actuar. Es el termostato de una plancha, de un refrigerador, de un calefón. Se implementa con una condición, cuesta casi nada, funciona con actuadores que solo admiten esos dos estados (un relé, una electroválvula, tema 29) y es robusto. Su comportamiento natural es una oscilación sostenida (un ciclo límite) alrededor de la consigna:
- Con la salida encendida, la temperatura sube; al pasar la consigna se apaga.
- Con la salida apagada, la temperatura baja; al cruzar la consigna se enciende.
En régimen, el sistema nunca queda quieto: la temperatura media coincide con la consigna (porque el tiempo encendido compensa la pérdida) y la potencia media es la que la planta necesita, pero la variable se mueve en una banda cuya amplitud depende de dos cosas: lo que el controlador se «retrasa» en reaccionar (la histéresis) y lo que la variable sigue moviéndose por la inercia después de la orden (el retardo del sensor y del proceso).
Con el horno del ejemplo, a 40 °C la temperatura sube a 25 mK/s con el calentador encendido y baja a 25 mK/s apagado. La oscilación de pico a pico es:
Con una histéresis de ±0,5 °C y 20 s de retardo, la oscilación es de 2,0 °C (2 × 0,5 + 0,050 × 20), el período de 160 s y los ciclos, 22,5 por hora. La simulación del horno da 1,97 °C y 157 s: la fórmula alcanza. Una consecuencia importante: el retardo fija un piso a la oscilación. Aun con una histéresis de cero, la temperatura oscila 1,0 °C, porque durante los 20 s en que el sensor «no se entera» la temperatura sigue subiendo o bajando.
03 · Dos umbrales
Histéresis, ruido y desgaste
La histéresis son dos umbrales en lugar de uno: se enciende por debajo de consigna − h y se apaga por encima de consigna + h; entre ambos, la salida conserva su estado anterior. Es un interruptor con memoria (un disparador de Schmitt por software, tema 7). Sin ella, el controlador decide con un solo umbral y la salida cambia en cuanto la medida cruza la consigna, lo cual en la práctica significa cuando el ruido la hace cruzar.
| Ruido σ | h = 0 | h = ±0,05 °C | h = ±0,1 °C | h = ±0,5 °C |
|---|---|---|---|---|
| 0 (ideal) | 90 | 82 | 75 | 46 |
| 0,1 °C | 432 | 228 | 109 | 50 |
| 0,2 °C | 1024 | 735 | 444 | 58 |
Con 0,2 °C de ruido (un sensor analógico sin filtrar, tema 5) y sin histéresis, el relé conmuta más de mil veces por hora: el actuador «vibra» (chattering). Con una histéresis de ±0,5 °C, esto es, 2,5 veces el ruido, las conmutaciones vuelven a 58 por hora, casi las 46 del caso sin ruido. La regla práctica: histéresis de al menos 2,5 a 3 veces la desviación típica del ruido, que se complementa con filtrar la medida (tema 5) antes de decidir.
La histéresis también protege al actuador. Cada conmutación de un relé electromecánico cuesta un ciclo de su vida, que ronda los 100 000 ciclos eléctricos con carga plena (valor típico: depende del modelo):
| Histéresis | Oscilación | Período | Ciclos por hora | Vida |
|---|---|---|---|---|
| ±0,1 °C | 1,2 °C | 96 s | 37,5 | 2667 h (0,30 años) |
| ±0,5 °C | 2,0 °C | 160 s | 22,5 | 4444 h (0,51 años) |
| ±1,0 °C | 3,0 °C | 240 s | 15,0 | 6667 h (0,76 años) |
| ±2,0 °C | 5,0 °C | 400 s | 9,0 | 11 111 h (1,27 años) |
Hay un compromiso: una histéresis mayor alarga la vida pero aumenta la oscilación, y ni siquiera una de ±2 °C alcanza el año. Para una planta rápida como esta, un relé electromecánico es la salida equivocada para el control todo o nada: se usa un relé de estado sólido (tema 28), que no se desgasta por ciclos, o un control proporcional con ventana larga (secciones 5 y 6). Además de la histéresis, hay dos protecciones: los tiempos mínimos de encendido y de apagado (un compresor no debe volver a arrancar antes de unos minutos, porque la presión no se equilibró) y el estado seguro ante una medida inválida (tema 40).
04 · Zona sin acción
La banda muerta
La banda muerta (dead band) se confunde con la histéresis, pero es otra cosa. La histéresis tiene memoria: la salida depende de la historia. La banda muerta es una zona sin acción: mientras el error esté dentro de ±db, la salida es cero (o neutra), sin recordar nada. Se usa en tres situaciones:
- Dos actuadores opuestos: un sistema de climatización con calefactor y refrigerador. El calefactor actúa solo por debajo de
consigna − dby el refrigerador solo por encima deconsigna + db. Sin banda muerta, el ruido haría que ambos peleen, consumiendo energía sin lograr nada. - Actuadores con holgura o fricción seca: un servo, un motor con reductor o una válvula que no se mueven con una orden pequeña. Una banda muerta del tamaño de la holgura evita que el control «cace» (hunting) alrededor de la posición sin llegar a ella.
- Sensores ruidosos con salida proporcional: la banda muerta evita que cada centésima de grado mueva el actuador. Se paga con una precisión menor: el sistema acepta cualquier valor dentro de la banda.
Se pueden combinar: un termostato de ambiente con histéresis ±0,5 °C y banda muerta entre calor y frío de ±1 °C. Lo esencial es no mezclar los nombres, porque se ajustan por razones distintas: la histéresis, según el ruido y el desgaste; la banda muerta, según la holgura y los actuadores en conflicto.
05 · Salida graduada
Control proporcional
El todo o nada no puede dar «un poco». El control proporcional (P) hace que la salida sea proporcional al error:
La banda proporcional es el error que lleva la salida de cero a pleno, y se expresa en las unidades de la variable (°C): con BP = 10 °C, un error de 10 °C da el 100 % y uno de 5 °C, el 50 %. La salida satura en 0 % y 100 %: lejos de la consigna el controlador se comporta como el todo o nada, a pleno; al acercarse, va reduciendo la potencia. El sesgo u0 es la salida con error cero (por defecto, 0).
Pero el control proporcional deja un error en régimen (offset): para mantener la consigna hace falta potencia, y para tener potencia con u = Kp e tiene que haber error. En el horno, mantener 40 °C requiere el 50 % de la potencia, y con u0 = 0 el error que lo produce es:
| Banda proporcional | Kp (1/°C) | T en régimen | Error | Comportamiento |
|---|---|---|---|---|
| 20 °C | 0,05 | 32,86 °C | 7,14 °C | Suave, muy lejos de la consigna |
| 10 °C | 0,10 | 35,83 °C | 4,17 °C | Suave |
| 4 °C | 0,25 | 38,15 °C | 1,85 °C | Suave |
| 2 °C | 0,50 | 39,04 °C | 0,96 °C | Suave |
| 1 °C | 1,00 | 39,51 °C | 0,49 °C | Suave |
| 0,5 °C | 2,00 | ≈ 39,77 °C | ≈ 0,23 °C | Oscila (0,77 °C pico a pico) |
Las dos puntas del compromiso están a la vista: más ganancia reduce el error, pero lleva al límite de la oscilación. En el límite (ganancia infinita, banda cero), el control proporcional es el todo o nada. Para eliminar el error sin subir tanto la ganancia hace falta algo más (el término integral del PID, tema 43), o agregar un sesgo que ponga la salida cerca de lo necesario.
06 · Actuadores reales
La salida proporcional en la práctica
La ley P calcula un número entre 0 y 1; el actuador tiene que ejecutarlo:
- Actuadores continuos: un PWM de un MOSFET o un servo (temas 27 y 32) reciben el valor directamente (con corrección gamma si es luz, tema 35).
- Un relé o una electroválvula solo tienen dos estados: se emula la potencia con control proporcional en el tiempo (time-proportional o PWM lento): una ventana de tiempo fija (por ejemplo 60 s) en la que la salida está encendida la fracción u. Con u = 0,3 y una ventana de 60 s, el relé está 18 s encendido y 42 s apagado, un ciclo por ventana. La ventana debe ser muy corta frente a la constante de tiempo del proceso (para que la temperatura promedie el pulso: 60 s frente a 1000 s) y larga frente al desgaste del actuador (60 ciclos por hora gastan los 100 000 ciclos de un relé en 1667 h, tema 40).
- Resolución: el actuador no distingue potencias menores que la resolución de su salida (un PWM de 8 bits son 0,39 %; el relé con ventana de 60 s y un lazo de 1 s son 1,7 %). Un controlador que pide cambios más finos que eso no logra nada.
- Pulsos mínimos: si u es 1 %, el pulso de 0,6 s es demasiado corto para un relé; se impone un tiempo mínimo de encendido y de apagado, o se pasa a un relé de estado sólido.
Dónde vive cada cosa, según la arquitectura del tema 40: el controlador calcula la potencia (0 a 1); la salida (Salida) sabe cómo ejecutarla con su ventana y sus protecciones.
07 · Dinámica
Retardo, ganancia y oscilación
Un lazo oscila cuando la corrección llega tarde y es demasiado grande: se actúa sobre un estado que ya cambió, se pasa de largo y se corrige en sentido contrario. Dos fenómenos del proceso producen ese «llegar tarde»:
- Retardo puro (tiempo muerto): el sensor está lejos de la fuente de calor, el aire tarda en llegar, la señal se filtra o se promedia (tema 5). En el horno son 20 s.
- Inercia (constante de tiempo): la masa térmica integra la potencia: 1000 s en el horno.
Para el control proporcional hay una ganancia crítica a la cual el lazo queda oscilando sin amortiguarse. Para un proceso de primer orden con retardo, aparece donde el desfasaje total llega a 180°: en el horno, a una frecuencia de 0,079 rad/s (un período de 79 s) y una ganancia crítica de Ku = 1,58 por °C, es decir una banda proporcional crítica de 0,63 °C. Por debajo de esa banda, el sistema oscila (el último renglón de la tabla anterior, con 0,5 °C, ya lo hace); por encima, converge. Una regla segura es trabajar con una banda al menos dos o tres veces la crítica.
- El retardo es el enemigo: la ganancia crítica es inversamente proporcional al retardo (tiempo muerto) y, junto con él, determina la rapidez posible. Si el lazo oscila, antes que bajar la ganancia a ciegas hay que preguntarse si el sensor puede acercarse al punto de actuación.
- El período de muestreo debe ser mucho menor que la constante de tiempo y del orden del retardo o menor: de 1 s para un horno de 1000 s. Un período de 60 s con 20 s de retardo agregaría otro retardo y haría oscilar al lazo.
- El ruido se multiplica por Kp en la salida: con ganancia alta y un sensor ruidoso, la salida tiembla. Se filtra la medida o se baja la ganancia.
08 · El entorno
Perturbaciones y error en régimen
La potencia que mantiene la consigna depende de las condiciones: del ambiente, de la carga, de que alguien abra la puerta del horno. Esos cambios son perturbaciones. Un control todo o nada las absorbe sin mayor problema (cambian las proporciones de tiempo encendido y apagado). El proporcional también, pero con una consecuencia en el error:
| Ambiente | Sin sesgo | Con sesgo del 50 % |
|---|---|---|
| 5 °C (necesita 70 %) | 34,17 °C (error +5,83) | 38,33 °C (error +1,67) |
| 15 °C (necesita 50 %) | 35,83 °C (error +4,17) | 40,00 °C (error 0) |
| 25 °C (necesita 30 %) | 37,50 °C (error +2,50) | 41,67 °C (error −1,67) |
Un sesgo bien elegido elimina el error en un único punto de funcionamiento (ambiente de 15 °C), pero no sigue a las perturbaciones: con el ambiente a 5 °C, el error vuelve (1,67 °C) y a 25 °C se invierte. Es la limitación estructural del control proporcional: solo da la potencia correcta cuando el error es justamente el que la produce. Para que el sesgo se ajuste solo, el controlador necesita recordar el error acumulado (acción integral, tema 43).
Otros puntos del comportamiento:
- Sentido de la acción: en calefacción, el error es
consigna − medida(acción directa en la salida); en refrigeración,medida − consigna(acción inversa). Un signo equivocado hace que el lazo empuje en sentido contrario: la temperatura se aleja de la consigna hasta saturar. - Cambio de consigna: al subir la consigna, el error salta y el proporcional da un golpe de salida; el todo o nada simplemente enciende.
- Arranque: lejos de la consigna ambos saturan a pleno hasta llegar a la banda; el todo o nada puede pasarse de la consigna por el retardo, el proporcional frena al entrar en la banda.
09 · Programación
Código del controlador
Dos controladores con la misma interfaz (tema 40): el todo o nada con histéresis, tiempos mínimos y estado seguro, y el proporcional con banda proporcional, sesgo, saturación y banda muerta. El lazo corre cada segundo sin bloqueos (tema 41) y la salida la ejecuta un driver que sabe de ventanas y protecciones.
// ---------- Interfaz común (tema 40): la aplicación pide potencia entre 0 y 1 ----------
class Controlador {
public:
virtual ~Controlador() {}
virtual float calcular(float consigna, float medida) = 0;
};
// ---------- Todo o nada con histéresis y tiempos mínimos ----------
class TodoONada : public Controlador {
public:
TodoONada(float histeresis, uint32_t minEncendidoMs, uint32_t minApagadoMs, bool accionInversa = false)
: h_(histeresis), minOn_(minEncendidoMs), minOff_(minApagadoMs), inversa_(accionInversa) {}
float calcular(float consigna, float medida) override {
if (isnan(medida)) return apagar(); // sin dato fiable: estado seguro
float error = inversa_ ? medida - consigna : consigna - medida; // refrigeración: acción inversa
bool quiere = encendido_;
if (error > h_) quiere = true; // por debajo de consigna - h: encender
else if (error < -h_) quiere = false; // por encima de consigna + h: apagar
uint32_t ahora = millis();
uint32_t minimo = encendido_ ? minOn_ : minOff_;
if (quiere != encendido_ && (!huboCambio_ || (uint32_t)(ahora - ultimoCambio_) >= minimo)) {
encendido_ = quiere; // el tiempo mínimo protege al compresor o al relé
ultimoCambio_ = ahora;
huboCambio_ = true;
}
return encendido_ ? 1.0f : 0.0f;
}
private:
float apagar() { encendido_ = false; return 0.0f; }
float h_; uint32_t minOn_, minOff_; bool inversa_;
bool encendido_ = false, huboCambio_ = false; uint32_t ultimoCambio_ = 0;
};
// ---------- Proporcional con saturación, sesgo y banda muerta ----------
class Proporcional : public Controlador {
public:
Proporcional(float bandaProporcional, float sesgo = 0.0f, float bandaMuerta = 0.0f, bool accionInversa = false)
: banda_(bandaProporcional), sesgo_(sesgo), muerta_(bandaMuerta), inversa_(accionInversa) {}
float calcular(float consigna, float medida) override {
if (isnan(medida)) return 0.0f;
float e = inversa_ ? medida - consigna : consigna - medida;
if (e > muerta_) e -= muerta_; // fuera de la banda muerta: el error se mide desde su borde
else if (e < -muerta_) e += muerta_;
else e = 0.0f; // dentro: sin acción
return constrain(sesgo_ + e / banda_, 0.0f, 1.0f); // u = sesgo + Kp * e, con Kp = 1 / banda; satura en 0 y 1
}
private:
float banda_, sesgo_, muerta_; bool inversa_;
};
// ---------- Lazo de control: cada segundo, sin bloqueos (tema 41) ----------
Ds18b20 sensor(dallas, 0); // tema 40: lectura por etapas
SalidaRele calefactor(Config::PIN_CALEFACTOR, 60000UL); // ventana de 60 s para la potencia proporcional
Proporcional controlador(10.0f /* banda en °C */, 0.5f /* sesgo */);
void loop() {
static uint32_t proximo = 0;
if ((int32_t)(millis() - proximo) >= 0) {
proximo += 1000; // período del lazo: sin deriva
Lectura l = sensor.leer();
if (l.estado != Estado::OK) calefactor.apagar(); // ante la duda, apagado
else calefactor.establecer(controlador.calcular(Config::CONSIGNA_C, l.valor));
}
calefactor.actualizar();
}
// ---------- Calefacción y refrigeración con banda muerta entre ambas ----------
struct Orden { float calor, frio; };
Orden climatizar(float consigna, float medida, float bandaMuerta, float banda) {
float calor = constrain((consigna - bandaMuerta - medida) / banda, 0.0f, 1.0f); // solo por debajo de consigna - banda muerta
float frio = constrain((medida - consigna - bandaMuerta) / banda, 0.0f, 1.0f); // solo por encima de consigna + banda muerta
return { calor, frio }; // entre ambas, ninguno actúa: nunca pelean
}
El controlador solo calcula una potencia entre 0 y 1; no conoce el relé, el sensor ni el pin. Cambiar de todo o nada a proporcional es cambiar una línea de la raíz de composición.
10 · Verificación
Errores típicos y verificación
| Síntoma | Causa | Defensa |
|---|---|---|
| El relé vibra o conmuta cientos de veces por hora | Sin histéresis, con ruido en la medida | Histéresis ≥ 2,5 a 3 σ; filtrar la medida |
| El relé muere en meses | Ciclos demasiado frecuentes en una planta rápida | Más histéresis, tiempos mínimos, relé de estado sólido o ventana larga |
| El compresor se dispara y se apaga sin parar | Falta tiempo mínimo entre arranques | Tiempos mínimos de encendido y apagado |
| La temperatura nunca llega a la consigna | Error en régimen del control P | Sesgo o acción integral (tema 43); no más ganancia a ciegas |
| Oscilación sostenida con control P | Banda por debajo de la crítica, retardo grande | Ensanchar la banda; acercar el sensor; reducir el muestreo lento |
| El actuador se aleja de la consigna hasta saturar | Signo del error invertido | Probar el sentido con una perturbación manual |
| Calor y frío activos a la vez | Sin banda muerta entre ambos | Banda muerta mayor que el ruido |
| Una medida inválida enciende el calefactor | El controlador no verifica el dato | Estado seguro ante cualquier lectura no válida |
| Mucho zumbido en la salida con alta ganancia | El ruido se multiplica por Kp | Filtrar o bajar la ganancia |
- Probá el sentido: calentá el sensor con la mano: la salida debe bajar.
- Registrá la variable y la salida durante un ciclo completo (unos minutos a pocas horas) y calculá la oscilación, el período y las conmutaciones por hora.
- Medí el ruido del sensor con el sistema quieto: su desviación típica fija la histéresis o la banda muerta mínimas.
- Provocá perturbaciones: abrí la puerta, cambiá la consigna, desconectá el sensor; observá la respuesta y el estado seguro.
- Hacé una cuenta de vida del actuador: ciclos por hora × 8760 h × años frente a los ciclos del relé.
11 · Analogía con programación
Una planta simulada, dos controladores y sus números
Simulamos el horno (potencia de 100 W, capacidad de 2000 J/K, 0,5 K/W de pérdida, retardo del sensor y ruido) en pasos de un segundo y le aplicamos las dos leyes: el todo o nada con distintas histéresis y ruidos, y el proporcional con distintas bandas, ambientes y sesgos. También se calcula la ganancia crítica y la vida del relé.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
import math
# ---- Planta: horno de 100 W, C = 2000 J/K, R = 0,5 K/W (tau = 1000 s) y retardo del sensor ----
P_MAX, CAP, RES = 100.0, 2000.0, 0.5
M32 = 2 ** 32
class Ruido:
def __init__(self, sigma, semilla=12345):
self.sigma, self.x = sigma, semilla
def dato(self):
if self.sigma == 0:
return 0.0
s = 0.0
for _ in range(6):
self.x = (self.x * 1664525 + 1013904223) % M32
s += self.x / M32
return (s - 3) / 0.7071 * self.sigma
def simular(ley, retardo=20, sigma=0.0, consigna=40.0, t_amb=15.0, segundos=10800):
temp, u = t_amb, 0.0
pasado = [temp] * (retardo + 1)
ruido = Ruido(sigma)
historia = []
for _ in range(segundos):
medida = pasado[0] + ruido.dato()
u = ley(medida, u)
temp += (P_MAX * u - (temp - t_amb) / RES) / CAP
pasado.append(temp)
pasado.pop(0)
historia.append((temp, u))
return historia
def ultima_hora(historia):
resto = historia[-3600:]
temps = [t for t, _ in resto]
conmutaciones = sum(1 for (_, a), (_, b) in zip(resto, resto[1:]) if a != b)
return sum(temps) / len(temps), max(temps) - min(temps), conmutaciones
def todo_o_nada(consigna, h):
def ley(medida, u):
if medida < consigna - h:
return 1.0
if medida > consigna + h:
return 0.0
return u
return ley
def proporcional(consigna, banda, sesgo=0.0):
kp = 1 / banda
return lambda medida, u: min(1.0, max(0.0, sesgo + kp * (consigna - medida)))
print("Control todo o nada (consigna 40 °C, retardo del sensor 20 s, sin ruido):")
print("histéresis media oscilación (pico a pico) conmutaciones/h período")
for h in (0.1, 0.5, 1.0, 2.0):
media, pp, conm = ultima_hora(simular(todo_o_nada(40, h)))
periodo = 3600 / (conm / 2) if conm else float("inf")
print(f"±{h:3.1f} °C {media:6.2f} {pp:6.2f} °C {conm:5d} {periodo:6.0f} s")
print()
print("Fórmula: oscilación = 2h + (v_calentando + v_enfriando) x retardo; ciclo = oscilación x (1/v_c + 1/v_e)")
v_c = (P_MAX - (40 - 15) / RES) / CAP
v_e = ((40 - 15) / RES) / CAP
print(f"velocidades de cambio en 40 °C con 15 °C de ambiente: {v_c * 1000:.1f} mK/s calentando y {v_e * 1000:.1f} mK/s enfriando")
for h in (0.1, 0.5, 1.0, 2.0):
osc = 2 * h + (v_c + v_e) * 20
periodo = osc * (1 / v_c + 1 / v_e)
print(f" h = ±{h:3.1f} °C: oscilación {osc:4.2f} °C, período {periodo:6.0f} s, {3600 / periodo:5.1f} ciclos por hora")
print()
print("Ruido del sensor sobre la medición (retardo 20 s, ±0,5 °C de histéresis o menos):")
print("ruido (σ) histéresis conmutaciones/h")
for sigma in (0.0, 0.1, 0.2):
for h in (0.0, 0.05, 0.1, 0.5):
_, _, conm = ultima_hora(simular(todo_o_nada(40, h), sigma=sigma))
print(f"{sigma:5.2f} °C ±{h:4.2f} °C {conm:8d}")
print()
print("Control proporcional (sin retardo de cálculo, retardo del sensor 20 s):")
print("banda Kp (1/°C) T final error fórmula sobreimpulso oscilación final")
for banda in (20, 10, 4, 2, 1, 0.5):
hist = simular(proporcional(40, banda))
temps = [t for t, _ in hist]
final = sum(temps[-600:]) / 600
pico = max(temps)
osc = max(temps[-1800:]) - min(temps[-1800:])
formula = (40 - 15) / (1 + (P_MAX * RES) / banda)
print(f"{banda:5.1f} {1 / banda:6.2f} {final:7.2f} {40 - final:6.2f} {formula:6.2f} {max(0, pico - 40):6.2f} {osc:6.3f}")
print()
print("Ganancia crítica del lazo (planta de primer orden con retardo):")
tau, theta, k_planta = RES * CAP, 20.0, P_MAX * RES
w = 0.05
for _ in range(60):
w = (math.pi - math.atan(w * tau)) / theta
ku = math.sqrt(1 + (w * tau) ** 2) / k_planta
print(f" frecuencia de cruce {w:.3f} rad/s (período {2 * math.pi / w:.0f} s); Ku = {ku:.2f} 1/°C, es decir una banda proporcional crítica de {1 / ku:.2f} °C")
print()
print("Error en régimen y perturbaciones (banda de 10 °C):")
for t_amb in (5, 15, 25):
for sesgo in (0.0, 0.5):
hist = simular(proporcional(40, 10, sesgo), t_amb=t_amb)
final = sum(t for t, _ in hist[-600:]) / 600
print(f" ambiente {t_amb:2d} °C, sesgo {sesgo:3.1f}: T final {final:6.2f} °C (error {40 - final:+5.2f} °C)")
print()
print("Vida de un relé de 100 000 ciclos con control todo o nada (ciclos por hora de la fórmula):")
for h in (0.1, 0.5, 1.0, 2.0):
osc = 2 * h + (v_c + v_e) * 20
ciclos_h = 3600 / (osc * (1 / v_c + 1 / v_e))
horas = 100_000 / ciclos_h
print(f" h = ±{h:3.1f} °C: {ciclos_h:5.1f} ciclos por hora -> {horas:7.0f} h ({horas / 24 / 365:4.2f} años)")
Resultado: con el todo o nada y 20 s de retardo, una histéresis de ±0,1 °C da 1,20 °C de oscilación y 75 conmutaciones por hora; ±0,5 °C, 1,97 °C, 157 s de período y 46 conmutaciones; ±2 °C, 4,94 °C y 18 conmutaciones; la fórmula da 1,20, 2,00 y 5,00 °C. Con 0,2 °C de ruido, sin histéresis el relé conmuta 1024 veces por hora y con ±0,5 °C, 58. Con el proporcional, la banda de 10 °C deja 4,17 °C de error (35,83 °C), la de 2 °C, 0,96 °C y la de 1 °C, 0,49 °C; con 0,5 °C el lazo oscila (0,77 °C pico a pico). La banda proporcional crítica es de 0,63 °C (Kᵤ = 1,58 por °C, período de 79 s). Con banda de 10 °C y sesgo del 50 %, el error es 0 con 15 °C de ambiente, +1,67 °C con 5 °C y −1,67 °C con 25 °C. Un relé de 100 000 ciclos con ±0,5 °C dura 0,51 años (22,5 ciclos por hora) y con ±2 °C, 1,27 años.
12 · Exploración interactiva
Todo o nada, proporcional, curvas y relé
Los dos primeros instrumentos simulan el horno del tema con el mismo modelo del programa de Python (la consigna es de 40 °C). El tercero dibuja las curvas de decisión de los distintos controladores y el cuarto calcula, con las fórmulas de la sección 2, la vida del relé según la histéresis.
Instrumento 1: control todo o nada
Instrumento 2: control proporcional
Instrumento 3: curvas de decisión
Instrumento 4: histéresis y vida del relé
Recorrido guiado
- Con ±0,5 °C, 20 s de retardo y sin ruido: media de 40,00 °C, oscilación de 1,97 °C y 46 conmutaciones por hora (período de unos 157 s). Pasá a ±2 °C: 4,94 °C y 18 conmutaciones; a ±0,1 °C: 1,20 °C y 75. Con histéresis cero la oscilación sigue en 1,0 °C: es el piso del retardo.
- Subí el ruido a 0,2 °C con histéresis cero: más de mil conmutaciones por hora (chattering) y el estado lo avisa. Con ±0,5 °C vuelven a unas 58.
- Cambiá la salida a relé electromecánico con ±0,5 °C: 23 ciclos por hora, medio año de vida; el estado avisa del desgaste. Con histéresis de 2 °C la vida llega a algo más de un año.
- En el proporcional, con banda de 10 °C, ambiente de 15 °C y sin sesgo: 35,83 °C y un error de 4,17 °C, aunque la temperatura es estable. Estrechá la banda a 2 °C: 0,96 °C. A 0,5 °C, el lazo oscila.
- Con banda de 10 °C y sesgo del 50 %: el error es 0 con 15 °C de ambiente. Bajá el ambiente a 5 °C: 1,67 °C de error; subilo a 25 °C: −1,67 °C. El sesgo no sigue a las perturbaciones.
- En las curvas, con h = ±1 °C, banda muerta de ±1 °C, banda proporcional de 8 °C y 39,5 °C: el todo o nada da 1 si venía encendido y 0 si venía apagado (zona de memoria); el proporcional, 6 %; con banda muerta, ni calor ni frío. Bajá la temperatura a 36 °C: el proporcional da un 50 %.
- En el cuarto instrumento, con ±0,5 °C y 20 s de retardo: 25 mK/s en cada sentido, 2,0 °C de oscilación, 160 s de período, 22,5 ciclos por hora y 0,51 años de vida. Para 5 años con un relé de 100 000 ciclos haría falta una histéresis de unos ±9,4 °C.
- Cambiá la vida a 1 000 000 de ciclos: unos 5 años. Con estado sólido, el desgaste por ciclos deja de ser el problema. Subí el retardo a 60 s: la oscilación crece por el retardo, pero los ciclos por hora bajan (el período se alarga).
Desafío: climatizar un invernadero con calor y frío
Un invernadero de consigna 22 °C tiene un calefactor y un ventilador que expulsa aire (refrigeración). El sensor tiene 0,15 °C de ruido y las salidas son dos relés. ¿Qué leyes y parámetros? Con todo o nada en ambos y una banda muerta entre ellos: el calefactor enciende por debajo de 22 − 1 − h y el ventilador por encima de 22 + 1 + h, con h = 0,5 °C (más de tres veces el ruido), de modo que nunca estén activos a la vez y haya una zona de ±1,5 °C sin acción. Se agregan tiempos mínimos de encendido y apagado de 2 minutos para proteger los relés. La refrigeración usa acción inversa (error = medida − consigna). Si el calefactor es de potencia graduable, un proporcional con banda de 4 °C evita ciclos, con el error en régimen de unos pocos décimos como precio; para eliminarlo se recurre a la acción integral del tema 43. Y ante una lectura inválida del sensor (tema 40), ambos se apagan.
13 · Método de trabajo
Cómo elegir y ajustar un controlador
- Definí la consigna, la tolerancia que se acepta y los límites de seguridad antes de elegir la ley.
- Caracterizá la planta: cuánto tarda en reaccionar (retardo), cuánto en moverse (constante de tiempo), cuánta potencia necesita en régimen y cuánto ruido tiene el sensor.
- Si la tolerancia es amplia y el actuador es de dos estados, usá todo o nada con histéresis (≥ 2,5 a 3 σ), tiempos mínimos y un actuador que soporte los ciclos.
- Si el actuador es graduable o hace falta menos oscilación, usá proporcional, con una banda al menos dos o tres veces la crítica y un sesgo cercano a la potencia necesaria.
- Conocé el error en régimen que deja el proporcional y decidí si es aceptable; si no, el tema 43.
- Resolvé el sentido de la acción y la banda muerta si hay dos actuadores o holgura.
- Protegé: estado seguro ante datos inválidos, saturación, tiempos mínimos, vida del actuador.
- Verificá con perturbaciones y registrá la variable y la salida; ajustá de a un parámetro por vez.
Si el relé vibra, falta histéresis; si el relé se gasta, sobran ciclos; si la variable nunca llega a la consigna, es el error del proporcional; si oscila, la banda es estrecha para el retardo; si empuja al revés, el signo.
14 · Comprensión
Confusiones frecuentes
«La histéresis y la banda muerta son lo mismo»
La histéresis tiene memoria: la salida depende del estado anterior. La banda muerta es una zona de salida nula, sin memoria. Se ajustan por razones distintas (ruido y desgaste frente a holgura y actuadores en conflicto).
«Una histéresis menor siempre da mejor control»
Reduce la oscilación hasta el piso que fija el retardo, pero aumenta las conmutaciones y el desgaste, y con ruido hace vibrar la salida. Más histéresis protege al actuador a costa de más oscilación.
«Con el proporcional, subir la ganancia no tiene inconvenientes»
Reduce el error en régimen, pero acerca el lazo a la oscilación, sobre todo con retardo, y amplifica el ruido del sensor.
«Si la temperatura es estable, está en la consigna»
El proporcional se estabiliza con un error en régimen: 35,83 °C con consigna de 40 °C en el ejemplo, y estable. La estabilidad no es precisión.
«El sesgo corrige el error del proporcional»
Solo en un punto de funcionamiento. Con otro ambiente o carga, el error reaparece, y con un sesgo mal puesto, se invierte.
«Un relé se puede manejar como un PWM rápido»
Su vida es de unos 100 000 ciclos: un control proporcional en el tiempo con ventana de segundos lo gasta en semanas. La ventana de un relé debe ser de decenas o cientos de segundos, o se usa un relé de estado sólido.
15 · Práctica guiada
Predecí antes de comprobar
1. Histéresis
Una cámara fría con consigna de 4 °C e histéresis de ±1 °C está apagada y la temperatura sube lentamente. ¿A qué temperatura se enciende el compresor y a cuál se apaga después?
Ver solución
Se enciende al superar 5 °C (consigna + h, acción inversa) y se apaga al bajar de 3 °C (consigna − h). Entre 3 y 5 °C conserva su estado.
2. Oscilación
Un proceso sube 20 mK/s encendido y baja 30 mK/s apagado, con 15 s de retardo y una histéresis de ±0,4 °C. ¿Qué oscilación, qué período y cuántos ciclos por hora hay?
Ver solución
Oscilación = 2 × 0,4 + (0,020 + 0,030) × 15 = 0,8 + 0,75 = 1,55 °C. Período = 1,55 × (1/0,020 + 1/0,030) = 1,55 × (50 + 33,3) = 129 s → 3600 / 129 ≈ 28 ciclos por hora.
3. Ruido
Un sensor tiene una desviación típica de 0,12 °C. ¿Qué histéresis mínima usás?
Ver solución
Entre 2,5 y 3 σ: de 0,30 a 0,36 °C de cada lado (se elige ±0,4 °C).
4. Proporcional
Una banda proporcional de 5 °C, consigna de 60 °C y medida de 58 °C. ¿Qué salida da sin sesgo y con un sesgo del 30 %?
Ver solución
Error = 2 °C; Kp = 1/5 = 0,2 por °C → u = 0,4 (40 %). Con un sesgo del 30 %, 70 %.
5. Error en régimen
Un horno con K = 50 °C, consigna de 40 °C y ambiente de 15 °C se controla con una banda de 4 °C. ¿Qué error y qué temperatura en régimen se esperan?
Ver solución
Kp = 0,25; e = 25 / (1 + 0,25 × 50) = 25 / 13,5 = 1,85 °C; T = 38,15 °C (coincide con la tabla del tema).
6. Diagnóstico
Un calefactor de un acuario, controlado con todo o nada sin histéresis, hace «clic» cada pocos segundos y el relé se recalienta. El sensor es un NTC con ruido. ¿Qué cambiás?
Ver solución
El ruido cruza la consigna una y otra vez. Se agrega una histéresis de 2,5 a 3 veces el ruido (por ejemplo ±0,3 a ±0,5 °C), se filtra la medida (promedio o filtro exponencial, tema 5) y se agrega un tiempo mínimo entre cambios (por ejemplo 30 s). Con un acuario, que tiene una constante de tiempo de horas, hasta ±0,5 °C es imperceptible.
16 · Síntesis
Ideas para recordar
- Un lazo cerrado compara la medida con la consigna (error = consigna − medida) y actúa para anularlo: realimentación negativa.
- El todo o nada oscila en régimen alrededor de la consigna: oscilación = 2h + (vsubida + vbajada) × retardo; el retardo fija un piso que la histéresis no baja.
- La histéresis son dos umbrales con memoria: debe ser de al menos 2,5 a 3 veces el ruido para evitar la vibración de la salida y protege al actuador.
- Un relé electromecánico (~100 000 ciclos) no sirve para un todo o nada rápido: 22,5 ciclos por hora lo gastan en medio año; se usa estado sólido o ventana larga.
- La banda muerta es una zona sin acción y sin memoria, para actuadores opuestos o con holgura; no es lo mismo que la histéresis.
- El proporcional da u = u₀ + Kp·e, con banda proporcional BP = 1/Kp y saturación en 0 y 1; deja un error en régimen = (consigna − ambiente) / (1 + Kp·K).
- Más ganancia reduce el error pero acerca el lazo a la oscilación (banda crítica de 0,63 °C en el ejemplo) y amplifica el ruido; el retardo es lo que limita.
- El sesgo elimina el error solo en un punto de funcionamiento; para que siga a las perturbaciones hace falta la acción integral (tema 43). Siempre: sentido correcto, estado seguro y tiempos mínimos.
¿Listo para el tema 43?
Antes de avanzar, calculá la oscilación de un todo o nada con histéresis de ±0,3 °C si el proceso sube y baja a 20 mK/s con 10 s de retardo, explicá por qué un control proporcional puro deja un error en régimen y decí por qué agregar ganancia no lo elimina sin riesgo. Si podés justificar las tres respuestas, ya sabés por qué hace falta un PID.
En el próximo tema completamos el controlador con los términos integral y derivativo: el control PID, con la saturación, el anti-windup y el ajuste de ganancias.