01 · Punto de partida
Del todo o nada al término medio
El control on/off del Tema 29 tiene un límite de nacimiento: el actuador solo conoce dos estados. Cerca de la consigna sigue encendiendo y apagando con el mismo vigor que lejos, y la temperatura oscila dentro de una banda. Un conductor humano no maneja así: acelera a fondo cuando está lejos de la velocidad deseada y levanta el pie cuando se acerca. El control proporcional hace exactamente eso: la potencia aplicada es proporcional al error.
Una escena típica. Pasaste el termostato del Tema 29 a control proporcional con la misma estufa y el mismo NTC. El rizado desapareció: la temperatura se asienta en un valor fijo. Pero ese valor es 18,6 °C, no 20. Subís la ganancia y se acerca (19,7 °C), la subís más y, cuando el sensor tiene algo de inercia, la estufa empieza a oscilar por sí sola. Las dos cosas son consecuencias directas de una ecuación de una línea, y se pueden calcular antes de tocar nada.
Para un programador es la diferencia entre un if con umbral y un controlador de lazo cerrado: la misma idea que un backoff exponencial, un regulador de tasa de reintentos o el ajuste de tamaño de una cola. Este tema es una introducción honesta al PID: sin el aparato matemático, pero con las cuentas que explican por qué cada término existe.
- ¿Cómo se calcula la potencia a partir del error?
- ¿Qué es el error permanente y cuánto vale?
- ¿Por qué más ganancia no es siempre mejor?
- ¿Cómo se entrega una potencia intermedia con un pin digital?
- ¿Qué agregan los términos I y D, y qué peligros traen?
- ¿Cuándo alcanza el on/off y cuándo hace falta más?
02 · Ley P
La ley proporcional y su droop
Con la consigna Tset y la temperatura medida T, el error es e = Tset − T. La ley proporcional entrega una fracción de la potencia máxima:
Con Kp = 20 %/°C, un error de 5 °C o más da el 100 % (a fondo); un error de 1 °C da el 20 %; un error nulo, el 0 %. La banda proporcional es el rango de error donde el control es lineal: 100/20 = 5 °C. Fuera de ella el actuador está saturado y el controlador se comporta como un on/off. Con Kp → ∞ la banda se reduce a cero y el control proporcional es el on/off.
Ahora el punto que sorprende. En régimen, el calor entregado debe igualar las pérdidas. Pero la ley P solo entrega calor si hay error. Para compensar las pérdidas hay que mantener un error. Con el modelo del Tema 29 (a = 0,01 °C/s, k = 0,000333 s−1):
Con Kp = 0,2 °C⁻¹, la consigna de 20 °C y 10 °C afuera: e∞ = 0,00333/(0,002 + 0,000333) = 1,43 °C: el ambiente se asienta en 18,57 °C con un 28,6 % de potencia. Es el droop (caída) del control proporcional. No es un defecto del diseño sino una consecuencia de la ley.
| Kp | Banda prop. | Exterior 0 °C | Exterior 10 °C | Exterior 15 °C |
|---|---|---|---|---|
| 5 %/°C | 20 °C | 8,00 °C (40 %) | 4,00 °C (20 %) | 2,00 °C (10 %) |
| 20 %/°C | 5 °C | 2,85 °C (57 %) | 1,43 °C (29 %) | 0,71 °C (14 %) |
| 100 %/°C | 1 °C | 0,64 °C (65 %) | 0,32 °C (32 %) | 0,16 °C (16 %) |
| 300 %/°C | 0,33 °C | 0,22 °C (66 %) | 0,11 °C (33 %) | 0,05 °C (17 %) |
Tres observaciones. La potencia de régimen (entre paréntesis) apenas depende de Kp: la fija el clima, como el duty del on/off. Kp solo decide cuánto error hace falta para producirla. Segunda: el error crece cuando hace más frío, porque hace falta más potencia con el mismo Kp. Tercera: el droop depende de la perturbación —el clima—, así que una consigna «bien ajustada» en verano deja de serlo en invierno.
03 · Estabilidad
Retardos y estabilidad: el techo de Kp
La tabla sugiere subir Kp hasta que el droop sea despreciable. El límite aparece con los retardos del Tema 29. Con el ambiente como único elemento (primer orden), el proporcional es estable para cualquier Kp: no puede oscilar. Pero el sensor tiene inercia (τs) y el calefactor también (τh). Con tres retardos en serie en el lazo —el ambiente de 50 min, un sensor de 300 s y un calefactor de 120 s—, el desfase total puede llegar a 180° a alguna frecuencia, y si la ganancia a esa frecuencia todavía es mayor que 1, la corrección llega en el momento exacto para empeorar el error: oscilación sostenida.
Para este lazo (τ = 3003 s, τs = 300 s, τh = 120 s y una ganancia estática de 30 °C por unidad de potencia) el cálculo da una ganancia crítica Ku ≈ 134 %/°C y un período de oscilación Tu ≈ 18,6 min. En la simulación completa (con la saturación de la potencia) el lazo se asienta con Kp = 100 %/°C y oscila de forma sostenida a partir de ≈ 150 %/°C. La saturación limita la amplitud (la potencia no pasa del 100 %) pero no evita la oscilación.
| τ sensor | τ calefactor | Ku | Tu |
|---|---|---|---|
| 300 s | — (ninguno) | nunca oscila (dos retardos no alcanzan −180°) | — |
| 300 s | 120 s | 134 %/°C | 18,6 min |
| 120 s | 120 s | 180 %/°C | 12,1 min |
| 300 s | 60 s | 225 %/°C | 13,3 min |
En la práctica nunca se opera cerca de Ku: un lazo que oscila apenas amortiguado es inaceptable. La regla clásica usa una fracción: la mitad de Ku da una respuesta con sobrepico moderado; menos todavía, más suave y con más droop.
04 · PWM
Potencia intermedia con un pin digital
Un microcontrolador solo tiene salidas digitales: 0 o 5 V. Para entregar «el 29 % de la potencia» se alterna entre encendido y apagado muy rápido, de modo que el promedio sea el valor deseado. Es la modulación por ancho de pulso (PWM): una frecuencia fija y un ciclo de trabajo (duty) variable. La carga promedia lo que le llega por su propia inercia: térmica, óptica, mecánica o eléctrica (un filtro).
| Carga | Frecuencia | Por qué | Driver |
|---|---|---|---|
| Calefactor con SSR | Ventana de 1 a 10 s | La inercia térmica es de minutos; el SSR conmuta a cruce por cero (cada 10 ms) | SSR con cruce por cero |
| Calefactor con relé | Ventana de 5 a 10 min | El relé se desgasta por ciclo (ver abajo) | Relé con diodo |
| LED | ≥ 1 kHz | Sin parpadeo visible | MOSFET + R serie |
| Motor de continua | ≈ 20 kHz | Fuera del oído: sin silbido | Puente H + diodos |
| PWM filtrado como DAC | 1 a 100 kHz | Cuanto más alta, menos rizado con el mismo filtro | Filtro RC |
La trampa del relé: control por ventana de tiempo
Con un calefactor y un relé el «PWM» se hace por ventana de tiempo (time-proportioning): cada ventana de W segundos el calefactor está encendido el duty·W y apagado el resto. Cada ventana es un ciclo del relé. El mismo relé de 100 000 operaciones del Tema 29 da:
| Ventana | Ciclos/día | Vida del relé | Veredicto |
|---|---|---|---|
| 1 s (1 Hz) | 86 400 | 1,2 días | Imposible con relé |
| 10 s | 8 640 | 11,6 días | Solo para SSR |
| 60 s | 1 440 | 69 días | No |
| 10 min | 144 | 1,9 años | Aceptable |
Fijate el efecto: el PWM de 1 Hz con relé —que parece una frecuencia modesta— lo destruye en días. Un relé solo sirve con ventanas largas; para ventanas cortas hace falta un SSR (sin desgaste mecánico). Con una constante térmica de 50 minutos, una ventana de 10 minutos ya se promedia suficiente y el rizado de temperatura sigue siendo despreciable.
El PWM filtrado: un DAC de un pin
Un filtro RC pasa-bajos convierte el promedio en una tensión continua: un DAC casi gratis. El costo es el rizado residual y el tiempo de asentamiento. Con RC grande respecto del período T = 1/f:
| f | R | C | RC | Rizado pp | Asentamiento |
|---|---|---|---|---|---|
| 1 kHz | 10 kΩ | 0,1 µF | 1 ms | ≈ 1,22 V | 5 ms |
| 1 kHz | 100 kΩ | 1 µF | 100 ms | 12,5 mV | 0,5 s |
| 20 kHz | 10 kΩ | 0,1 µF | 1 ms | 62,5 mV | 5 ms |
| 20 kHz | 100 kΩ | 1 µF | 100 ms | 0,63 mV | 0,5 s |
El compromiso es evidente: menos rizado o respuesta más rápida, no las dos a la vez con un RC; para ganar en ambas, subir la frecuencia del PWM o usar un filtro de dos polos. Un PWM de 8 bits tiene pasos de 5/256 = 19,5 mV: no tiene sentido un rizado mucho menor que eso. Y la resolución del duty limita la del control: un temporizador de 8 bits da pasos de 0,39 % de potencia.
05 · Acción integral
La acción integral: borrar el error
El droop existe porque P necesita un error para producir potencia. La solución es un término que acumule el error en el tiempo: mientras el error no sea cero, el integral sigue creciendo y empuja la potencia hasta que el error desaparece. Es la ley PI:
En régimen el error es exactamente cero y toda la potencia la aporta el integral (la memoria del clima: 33 % con 10 °C afuera). Cambia el clima y el integral se reacomoda solo, sin que nadie reajuste nada: de ahí que el PI sea la ley más usada en la industria. Con el ambiente del tema, hay una elección natural: Ti = τ (3003 s) cancela el polo lento del ambiente y el lazo se comporta como un primer orden con constante τ/(Kp·Kdc) = 3003/(0,2 × 30) = 500 s: sin sobrepico y sin error permanente.
| Control | Error en régimen | Sobrepico | Asentamiento ±0,5 °C |
|---|---|---|---|
| P | −1,43 °C (droop) | ninguno | nunca entra en ±0,5 °C |
| PI, Ti = 3000 s, con anti-windup | 0,00 °C | 0,00 °C | 48 min |
| PI, Ti = 3000 s, sin anti-windup | 0,00 °C | +0,26 °C | 24 min |
| PI, Ti = 600 s, con anti-windup | 0,00 °C | +0,71 °C | 43 min |
| PI, Ti = 600 s, sin anti-windup | 0,00 °C | +3,91 °C | 55 min |
El windup
Al arrancar en frío el error es grande y la potencia está saturada al 100 %. El actuador no puede entregar más, pero el integral sigue sumando error: se «carga» muchísimo más allá de lo útil. Cuando la temperatura por fin llega a la consigna, el integral acumulado mantiene la potencia alta y el ambiente se pasa varios grados (hasta 3,9 °C en el ejemplo con Ti = 600 s). Es el windup (embalamiento) del integral.
La defensa estándar es el anti-windup: no integrar mientras la salida está saturada y el error empuja más hacia la saturación (integración condicional), o descargar el integral en proporción al exceso (back-calculation). Con la integración condicional el sobrepico de 3,91 °C baja a 0,71 °C con el mismo Ti. Es una línea de código y es obligatoria en cualquier PI con un actuador que satura, es decir, en todos.
06 · Acción derivativa
La acción derivativa: frenar a tiempo
El término derivativo reacciona a la velocidad de cambio del error: si la temperatura sube muy rápido hacia la consigna, reduce la potencia antes de llegar, y si cae rápido, la aumenta. Anticipa y amortigua el sobrepico que los retardos tienden a producir:
Dos detalles de implementación que se aprenden a golpes. Primero, se deriva la medida, no el error: si la consigna cambia de golpe, derivar el error produce un pico enorme («patada derivativa»); derivar la medida lo evita. Segundo, derivar es un pasa-altos: amplifica el ruido sin piedad. Un sensor con σ = 0,05 °C de ruido, derivado sin filtro cada 2 s con Kp = 0,8 °C⁻¹ y Td = 140 s, produce una oscilación de la potencia con σ ≈ 4,0, es decir ±400 %: el actuador salta de 0 a 100 % en cada muestra.
Con el filtro, el ruido en la salida es Kp·N·σ, independiente de Td: con N = 10, Kp = 0,8 y σ = 0,05 °C, σu = 0,4 (40 % de la escala); con N = 3, 0,12. Más filtro, menos ruido, pero también menos anticipación. Por eso el D es el más delicado de los tres, y en procesos lentos y ruidosos como un termostato se omite con frecuencia: PI es el control del 90 % de los lazos.
07 · Sintonía
Sintonizar sin perder una tarde
Hay un método de campo que solo requiere el sistema funcionando, el de Ziegler y Nichols (1942). Se anulan I y D, se sube Kp hasta la oscilación sostenida y se anotan dos números: la ganancia crítica Ku y el período de oscilación Tu. Con ellos, las reglas de tablas clásicas dan un punto de partida:
| Control | Kp | Ti | Td | Aquí |
|---|---|---|---|---|
| P | 0,5·Ku | — | — | 67 %/°C |
| PI | 0,45·Ku | Tu/1,2 | — | 60 %/°C, 930 s |
| PID | 0,6·Ku | Tu/2 | Tu/8 | 80 %/°C, 558 s, 140 s |
| Control | Error final | Sobrepico | Asentamiento ±0,5 °C |
|---|---|---|---|
| P, Kp = 20 | −1,43 °C | — | no asienta |
| P, Kp = 60 (≈ 0,45 Ku) | −0,53 °C | +1,46 °C | no asienta |
| PI, Kp = 20, Ti = τ (3003 s) | 0,00 °C | +0,12 °C | 68 min |
| PI ZN (60 %/°C, 930 s) | 0,00 °C | +1,58 °C | 88 min |
| PI ZN sin anti-windup | 0,00 °C | +7,36 °C | 180 min |
| PID ZN (80 %/°C, 558 s, 140 s) | 0,00 °C | +1,24 °C | 33 min |
Tres lecciones de la tabla. Primera: las reglas de Ziegler-Nichols son agresivas (diseñadas para amortiguar un cuarto por ciclo); sirven de punto de partida, no de resultado, y el PI con Ti = τ y poca ganancia fue más suave. Segunda: el D acelera mucho (33 min contra 88 con el PI ZN) porque frena el sobrepico que los retardos tienden a causar. Tercera: sin anti-windup, un PI «bien sintonizado» se pasa 7,4 °C. Ninguna sintonía compensa el windup.
- Receta práctica
- 1) Solo P, empezando bajo; subir hasta que oscile; anotar Ku y Tu (o medir el período). 2) Bajar a la mitad de Ku. 3) Agregar un I lento (Ti de unas Tu) hasta borrar el droop. 4) D solo si queda un sobrepico rebelde, siempre con filtro.
- Siempre antes de sintonizar
- Arreglar el hardware: un sensor en el lugar equivocado o lento limita cualquier control (sección 3). Ningún algoritmo supera un lazo con la información atrasada.
- Muestreo en un microcontrolador
- Con un lazo de constante de tiempo de 50 minutos, muestrear cada 1 a 5 segundos sobra. La regla: al menos 10 muestras por constante de tiempo del lazo más rápido.
08 · Decisión
¿On/off o proporcional?
El proporcional no es siempre mejor. Cada estrategia tiene su lugar:
| Criterio | On/off con histéresis | Proporcional (P) | PI / PID |
|---|---|---|---|
| Rizado de la variable | Sí (la banda, más sobrepico) | No | No |
| Error medio | ≈ 0 (promedio centrado) | Droop = urég/Kp | 0 |
| Actuador | Relé: sufre ciclos | Exige potencia graduable (PWM) | Ídem |
| Estabilidad con retardos | Siempre (limita el ciclo) | Kp < Ku | Kp < Ku y anti-windup |
| Sintonía | Una banda | Un parámetro | Dos o tres |
| Ejemplos | Heladera, estufa, bomba de tanque | Velocidad de ventilador, nivel sin precisión | Horno de laboratorio, impresora 3D, drones |
La regla de decisión: si un rizado de ±1 °C es aceptable y el actuador es un relé, el on/off del Tema 29 es mejor (más simple, más robusto). Si hace falta estabilidad fina (±0,1 °C) y el actuador es graduable, PI. Si además hay un retardo molesto y el sensor es limpio, PID. El control proporcional puro tiene un lugar acotado: donde el droop se tolera o se compensa a mano.
09 · Simuladores
Dos experimentos: el lazo cerrado y el PWM filtrado
El primero simula el ambiente del Tema 29 con un controlador P, PI o PID, con y sin retardos, con y sin anti-windup y con una perturbación a las 4 horas: ves cómo responde la temperatura y la potencia. El segundo muestra un PWM pasando por un filtro RC: el rizado, el promedio y cuánto tarda en asentarse.
Lazo cerrado P, PI y PID
u = K_p·[e + (1/T_i)∫e dt − T_d·dT/dt]
Recorrido guiado (10 minutos)
- 1Pestaña ①, «P, Kp 20».
La temperatura sube desde 10 °C y se asienta en 18,57 °C con la potencia al 29 %: el droop de 1,43 °C que calculó la fórmula. La franja de ±0,5 °C alrededor de la consigna nunca se alcanza.
- 2Pasá a «P, Kp 100».
El droop baja a 0,32 °C y la temperatura llega a la franja a los 20 minutos. La potencia de régimen (32 %) casi no cambió: la fija el clima.
- 3Pasá a «P 150 con retardos (oscila)».
Con el sensor de 300 s y el calefactor de 120 s, Kp = 150 supera la ganancia crítica (134): la temperatura oscila de forma sostenida con la potencia saturada de 0 a 100 %. Es el techo de Kp.
- 4Pasá a «PI con Ti = τ».
El integral borra el droop: la temperatura llega a 20,00 °C sin sobrepico, y la potencia se asienta en 33 %, el valor que pide el clima. Probá cambiar la temperatura exterior: el PI se reacomoda solo.
- 5Pasá a «PI sin anti-windup».
Con Ti = 600 s el integral se carga mientras la potencia está al 100 % y la temperatura se pasa casi 4 °C. Cambiá «Anti-windup» a «Sí»: el sobrepico baja a unos 0,7 °C.
- 6Pasá a «PID Ziegler-Nichols».
Con retardos, el D frena el sobrepico y el asentamiento baja a ≈ 33 minutos contra 88 del PI de Ziegler-Nichols. Fijate en la potencia: el D la hace un poco nerviosa.
- 7Pasá a «PI con perturbación».
A las 4 horas el exterior cae 8 °C (una puerta abierta). El PI cae hasta ≈ 18,6 °C y vuelve a 20,00 °C. Cambiá el control a P: el nuevo droop es de ≈ 2,6 °C y no se corrige.
- 8Pestaña ②, «1 kHz, 100 kΩ, 1 µF».
La salida del filtro es casi un continuo de 2,5 V: el rizado es de 12,5 mV, menor que un paso de 8 bits (19,5 mV). Pero tarda 0,5 s en asentarse.
- 9Pasá a «1 kHz, 10 kΩ, 0,1 µF» y «20 kHz, 10 kΩ, 0,1 µF».
Con RC de 1 ms la respuesta es rápida (5 ms) pero el rizado a 1 kHz es de más de 1 V. Subiendo el PWM a 20 kHz baja a 62,5 mV con la misma respuesta. «20 kHz, 100 kΩ, 1 µF» deja 0,6 mV pero vuelve a los 0,5 s.
Preguntas para pensar
- En ①, con P y Kp = 20, ¿qué temperatura exterior da un droop de 2,85 °C? ¿Por qué es mayor?
- En ①, con retardos, ¿entre qué Kp de la lista el lazo P pasa de asentarse a oscilar?
- En ①, ¿qué hace falta (además del I) para que el PI de Ti = 600 s no se pase de la consigna al arrancar?
- En ②, ¿cómo se logra un rizado menor que un paso de 8 bits sin esperar medio segundo?
Ver respuestas sugeridas
- Con 0 °C afuera (2,85 °C, potencia de régimen 57 %): más frío exige más potencia con el mismo Kp, y el error es potencia/Kp.
- Entre 100 (asienta) y 150 (oscila sostenido); la ganancia crítica calculada es 134. En el límite, el lazo está apenas amortiguado y casi nunca se opera cerca.
- El anti-windup (integración condicional). Reduce el sobrepico de ≈ 3,9 a ≈ 0,7 °C con el mismo Ti. Otra opción es subir Ti (integrar más lento).
- Subiendo la frecuencia del PWM: a 20 kHz con RC de 1 ms el rizado es de ≈ 62 mV y el asentamiento de 5 ms; con un filtro de dos polos se baja mucho más sin perder velocidad. Con un solo RC, el rizado y el asentamiento se compran el uno con el otro.
10 · En código
El control, calculado y simulado en Python
Cuatro herramientas: el error permanente con la fórmula cerrada frente a la simulación, la ganancia crítica con los retardos, el PI y el PID con y sin anti-windup, y los números del PWM (ventana del relé, rizado del RC y ruido de la derivativa).
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar. Ejecutalos en orden.
Paso 1: el droop, fórmula contra simulación
import math
import random
import statistics
A, K = 0.01, 0.000333 # °C/s con el calefactor al 100 %; 1/s de pérdida
TAU = 1 / K
def droop(kp_pct, tamb, tset=20.0):
kp = kp_pct / 100
return K * (tset - tamb) / (A * kp + K) # e = k·(Tset - Tamb) / (a·Kp + k)
def simular(kp_pct, tamb, tset=20.0, ts_lag=0.0, th_lag=0.0, ti=0.0, td=0.0, aw=True,
dt=2.0, horas=8, t0=None, dist=None, n_d=10):
kp = kp_pct / 100
t = tamb if t0 is None else t0
ts = tsf = t
h = integ = 0.0
salida = []
for i in range(int(horas * 3600 / dt)):
ta = tamb + (dist[1] if dist and i * dt >= dist[0] else 0.0)
e = tset - ts
d = 0.0
if td > 0: # derivada de la medida, filtrada con tau_f = Td/N
previo = tsf
tsf += (ts - tsf) / (td / n_d) * dt
d = -kp * td * (tsf - previo) / dt
crudo = kp * e + integ + d
u = min(max(crudo, 0.0), 1.0)
if ti > 0 and (not aw or not ((crudo > 1 and e > 0) or (crudo < 0 and e < 0))):
integ += kp / ti * e * dt # integración condicional (anti-windup)
h += (u - h) / th_lag * dt if th_lag else (u - h)
t += (A * h - K * (t - ta)) * dt
ts += (t - ts) / ts_lag * dt if ts_lag else (t - ts)
salida.append((i * dt, t, u))
return salida
print("Error permanente: fórmula cerrada frente a simulación (consigna 20 C)")
print(" Kp exterior fórmula simulado potencia de régimen")
for kp in (5, 20, 100, 300):
for tamb in (0, 10, 15):
e = droop(kp, tamb)
s = simular(kp, tamb)
print(f" {kp:3d} {tamb:2d} C {e:5.2f} C {20 - s[-1][1]:5.2f} C {s[-1][2]:4.0%}")
La fórmula y la simulación coinciden a la centésima: 4,00, 1,43 y 0,32 °C con 10 °C afuera para Kp = 5, 20 y 100. La potencia de régimen apenas se mueve con Kp (20 %, 29 %, 32 %, 33 % a 10 °C): la fija el clima. Probá droop(20, -5): ¿cuánto vale el error con 5 grados bajo cero?
Paso 2: ganancia crítica con retardos
def ganancia_critica(taus, kdc=30.0):
# busca la frecuencia donde la fase del lazo vale -180 grados
lo, hi = 1e-5, 1.0
for _ in range(80):
m = math.sqrt(lo * hi)
fase = -sum(math.atan(m * t) for t in taus)
lo, hi = (m, hi) if fase > -math.pi else (lo, m)
w = lo
modulo = kdc
for t in taus:
modulo /= math.sqrt(1 + (w * t) ** 2)
return 100 / modulo, 2 * math.pi / w # Ku en %/C, Tu en s
for taus in ((TAU, 300, 120), (TAU, 120, 120), (TAU, 300, 60)):
ku, tu = ganancia_critica(taus)
print(f"retardos {taus[1]:3d} s y {taus[2]:3d} s: Ku = {ku:5.0f} %/C, Tu = {tu / 60:4.1f} min")
print("Lazo P con sensor de 300 s y calefactor de 120 s (amplitud de la oscilación, última hora):")
for kp in (20, 60, 100, 150, 300):
o = simular(kp, 10, ts_lag=300, th_lag=120, horas=12, t0=19.5)
ultimas = [x[1] for x in o[-1800:]]
print(f" Kp = {kp:3d}: oscila {max(ultimas) - min(ultimas):5.2f} C")
Ku = 134 %/°C y Tu = 18,6 min con sensor de 300 s y calefactor de 120 s; subiendo la velocidad del sensor y del calefactor, Ku sube a 180 y 225. La simulación lo confirma: con Kp ≤ 100 el lazo se asienta (0,00 °C de oscilación) y con 150 o más oscila entre 1 y 2 °C (limitado por la saturación).
Paso 3: PI, PID y windup
def resumen(nombre, o, tset=20.0):
sobrepico = max(x[1] for x in o) - tset
entra = None
for x in reversed(o):
if abs(x[1] - tset) > 0.5:
entra = x[0]
break
asentamiento = "no asienta" if entra is None or entra > o[-1][0] - 120 else f"{entra / 60:5.0f} min"
print(f" {nombre:36s}: error final {tset - o[-1][1]:+5.2f} C, sobrepico {max(sobrepico, 0):4.2f} C, asentamiento {asentamiento}")
print("Arranque en frío, sin retardos, Kp = 20:")
resumen("P", simular(20, 10))
resumen("PI Ti=3000 s con anti-windup", simular(20, 10, ti=3000))
resumen("PI Ti=3000 s sin anti-windup", simular(20, 10, ti=3000, aw=False))
resumen("PI Ti=600 s con anti-windup", simular(20, 10, ti=600))
resumen("PI Ti=600 s SIN anti-windup", simular(20, 10, ti=600, aw=False))
print("Con sensor de 300 s y calefactor de 120 s:")
lag = dict(ts_lag=300, th_lag=120)
resumen("PI Kp=20 Ti=3003 s", simular(20, 10, ti=TAU, **lag))
resumen("PI Ziegler-Nichols (60, 930 s)", simular(60, 10, ti=930, **lag))
resumen("PI Ziegler-Nichols sin anti-windup", simular(60, 10, ti=930, aw=False, **lag))
resumen("PID Ziegler-Nichols (80, 558, 140)", simular(80, 10, ti=558, td=140, **lag))
o = simular(20, 10, ti=TAU, dist=(4 * 3600, -8), **lag)
p = simular(20, 10, dist=(4 * 3600, -8), **lag)
mitad = int(4 * 3600 / 2)
print(f"Perturbación de -8 C a las 4 h: PI baja hasta {min(x[1] for x in o[mitad:]):.2f} C y vuelve a {o[-1][1]:.2f} C | P queda en {p[-1][1]:.2f} C")
Sin retardos, el PI con Ti = 3000 s no sobrepasa nada y no deja error; con Ti = 600 s el windup cuesta 3,91 °C de sobrepico contra 0,71 con anti-windup. Con retardos, el PI de Ziegler-Nichols sin anti-windup se pasa 7,4 °C; el PID asienta en 33 min contra 88 del PI. Y ante la perturbación de −8 °C, el PI baja a 18,6 °C y vuelve a 20,0 °C, mientras el P se queda 2,6 °C abajo.
Paso 4: PWM, relé y derivativa
print("Vida de un relé de 100 000 ciclos según la ventana del PWM:")
for ventana_s in (1, 10, 60, 600):
ciclos_dia = 86400 / ventana_s
dias = 100000 / ciclos_dia
print(f" ventana {ventana_s:3d} s: {ciclos_dia:7.0f} ciclos/dia -> {dias:7.1f} dias ({dias / 365:4.1f} años)")
def rizado_rc(vcc, duty, f, r, c):
# régimen permanente exacto del filtro RC con PWM: dos tramos exponenciales
tau, per = r * c, 1 / f
a, b = math.exp(-duty * per / tau), math.exp(-(1 - duty) * per / tau)
v0 = vcc * (1 - a) * b / (1 - a * b) # mínimo (final del tramo apagado)
v1 = v0 / b # máximo (final del tramo encendido)
return v1 - v0, vcc * duty * (1 - duty) / (f * tau)
print("PWM de 5 V al 50 % con filtro RC (un paso de 8 bits = 19,5 mV):")
for f, r, c in ((1e3, 1e4, 0.1e-6), (1e3, 1e5, 1e-6), (2e4, 1e4, 0.1e-6), (2e4, 1e5, 1e-6)):
exacto, aprox = rizado_rc(5.0, 0.5, f, r, c)
print(f" f={f / 1000:4.0f} kHz R={r / 1000:3.0f}k C={c * 1e6:4.1f}uF: rizado {exacto * 1000:7.2f} mV (fórmula {aprox * 1000:7.2f}), asentamiento {5 * r * c * 1000:6.0f} ms")
print("Brillo percibido de un LED con duty (exponente 2,2):", [f"{d}% -> {(d / 100) ** (1 / 2.2) * 100:.0f}%" for d in (10, 22, 50)])
print("Ruido de la derivativa (sensor con sigma = 0,05 C, Kp = 0,8, Td = 140 s, muestreo de 2 s):")
random.seed(30)
for n_d in (None, 3, 10, 30):
medidas = [20 + random.gauss(0, 0.05) for _ in range(3000)]
tsf, us = medidas[0], []
for x in medidas[1:]:
previo = tsf
tsf = x if n_d is None else tsf + (x - tsf) / (140 / n_d) * 2
us.append(-0.8 * 140 * (tsf - previo) / 2)
print(f" N = {str(n_d):4s}: sigma_u = {statistics.pstdev(us):5.2f} (fórmula Kp·N·sigma = {'-' if n_d is None else f'{0.8 * n_d * 0.05:.2f}'})")
Un relé de 100 000 ciclos dura 1,2 días con una ventana de 1 s y 1,9 años con una de 10 min. El rizado del RC de 20 kHz, 100 kΩ y 1 µF es de 0,63 mV; el de 1 kHz, 10 kΩ y 0,1 µF, de 1,22 V (la fórmula aproximada da 1,25 V: sobrestima cuando RC no es mucho mayor que T). A duty 22 % un LED se percibe como ≈ 50 %. Y la derivativa: sin filtro, σu ≈ 4,0; con N = 30, 1,4; con N = 10, 0,4; con N = 3, 0,12: coincide con Kp·N·σ (las diferencias en N grande vienen del muestreo).
11 · Analogía de programador
Control de crucero y autoscaling
| En software y en la ruta | En el control |
|---|---|
| Pisar a fondo o soltar el acelerador (dos estados) | On/off con histéresis |
| Acelerar en proporción a cuánto falta para la velocidad deseada | P: u = Kp·e |
| Quedarse siempre un poco por debajo de la velocidad porque en la subida hace falta pie para mantenerla | El droop: la carga exige potencia y la potencia exige error |
| Recordar cuánto tiempo llevás por debajo y apretar más | I: acumula el error hasta anularlo |
| Apretar tanto en una cuesta larga que después te pasás de largo | Windup: el integral crece con la salida saturada |
| Aliviar antes de llegar porque ves que te acercás rápido | D: reacciona a la velocidad del error |
| Un velocímetro ruidoso que tembla y hace que el pie se mueva sin parar | D sin filtro: amplifica el ruido de la medida |
| Autoscaling con retardo de arranque de instancias: sobre-escala y luego sobre-recorta | Ganancia demasiado alta con retardos: oscilación sostenida |
| Modular la tasa de peticiones con un porcentaje del tiempo en lugar de abrir y cerrar | PWM: potencia promedio con un pin digital |
La fila del autoscaling es la más reveladora: cualquier sistema con retardo entre la acción y su efecto sobre la métrica tiene el mismo techo de ganancia. Una política de escalado agresiva sobre una métrica que tarda en reflejar el cambio oscila, igual que un termostato con un sensor lento. La solución es siempre la misma: reducir el retardo, reducir la ganancia o anticipar.
12 · Comprensión
Confusiones frecuentes
«El control proporcional lleva el error a cero»
P necesita un error para producir potencia, y las pérdidas exigen potencia: queda el droop, urégimen/Kp. Solo el término integral lo anula. Subir Kp lo achica, no lo elimina.
«Más Kp siempre es mejor»
Hasta la ganancia crítica. Con un sensor de 300 s y un calefactor de 120 s, 134 %/°C ya es el límite; con 150 el lazo oscila sin parar. Sintonizar a la mitad de Ku.
«PWM de 1 Hz con un relé está bien»
Cada ventana es un ciclo del relé: 86 400 por día lo destruyen en 1,2 días. Con relé, ventanas de minutos; con ventanas cortas, SSR.
«El integral es gratis»
Sin anti-windup, un PI se pasa de la consigna varios grados al arrancar (hasta 7,4 °C en el ejemplo con Ziegler-Nichols). El anti-windup es obligatorio con actuadores que saturan.
«D adivina el futuro»
Extrapola la pendiente actual. Con ruido, extrapola disparates: σu ≈ Kp·N·σruido. Siempre sobre la medida y con filtro; en procesos lentos y ruidosos, mejor sin D.
«Las reglas de Ziegler-Nichols dan la sintonía final»
Dan un punto de partida agresivo (sobrepicos del 25 % o más). El PI con Ti = τ y poca ganancia fue más suave en el ejemplo. Se afina mirando la respuesta.
«PWM es una señal analógica»
El promedio sí; los pulsos siguen siendo plenos. Para un calefactor no importa; para un altavoz, sí. Como DAC, el rizado y el asentamiento se compran el uno con el otro: se mejora subiendo la frecuencia del PWM.
13 · Práctica guiada
Ejercicios de matiz
Ejercicio 1: droop a mano
Consigna 20 °C, exterior 10 °C, Kp = 50 %/°C. Calculá el error permanente, la temperatura de régimen y la potencia, sin simular. Verificalo con droop(50, 10).
Ver solución razonada
e = k·(Tset − Tamb)/(a·Kp + k) = 0,00333/(0,005 + 0,000333) = 0,625 °C. T de régimen = 19,375 °C y la potencia, u = Kp·e = 0,5 × 0,625 = 31,3 %. Comprobación: k·(19,375 − 10)/a = 0,000333 × 9,375/0,01 = 31,2 %. ✓
Ejercicio 2: ¿cuánto Kp para un droop de 0,2 °C?
Con exterior de 0 °C y consigna de 20 °C. ¿Qué Kp hace falta? ¿Es aceptable si Ku = 134 %/°C?
Ver solución razonada
De e = k·ΔT/(a·Kp + k): a·Kp = k·ΔT/e − k = 0,000333 × (20/0,2 − 1) = 0,033. Kp = 3,3 °C⁻¹ = 330 %/°C, más del doble de Ku = 134: el lazo oscilaría. Para un droop tan chico hay que cambiar de estrategia: agregar el integral (que da droop cero con un Kp modesto).
Ejercicio 3: el calefactor con relé
Querés controlar un calefactor de 1 kW con relé en modo proporcional, con una ventana de 30 s. ¿Cuánto dura el relé de 100 000 ciclos? ¿Qué ventana mínima garantiza 5 años?
Ver solución razonada
Una ventana de 30 s son 2880 ciclos por día: 100 000/2880 = 34,7 días. Para 5 años = 1825 días, hace falta 100 000/1825 = 54,8 ciclos por día, es decir una ventana de ≈ 26 minutos. Como el calefactor se promedia con la inercia térmica de 50 minutos, es una ventana viable pero ya lenta; la alternativa es un SSR con ventana de 5 a 10 s.
Ejercicio 4: LED y PWM
Un LED de 20 mA a 5 V se maneja con un MOSFET desde un pin PWM de 5 kHz. ¿R serie? ¿Qué duty da «la mitad del brillo percibido»? ¿Y qué duty para el 25 % percibido?
Ver solución razonada
R = (5 − 2)/0,02 = 150 Ω (para un LED con 2 V de caída). Con la percepción ≈ duty1/2,2: el duty para la mitad percibida es 0,52,2 = 22 %; para el 25 %, 0,252,2 = 4,7 %. Un duty lineal del 50 % se ve como ≈ 73 %.
Ejercicio 5: DAC con PWM
Con un PWM de 8 bits a 4 kHz, 5 V, ¿qué R y C usás para un rizado menor que un paso (19,5 mV) en el peor caso (50 %)? ¿Cuánto tarda en asentarse?
Ver solución razonada
Rizado ≈ 5 × 0,25/(f·RC) ≤ 19,5 mV → R·C ≥ 1,25/(4000 × 0,0195) = 16 ms. Por ejemplo 16 kΩ y 1 µF (E24: 15 kΩ + 1 µF = 15 ms, rizado 20,8 mV; 16 kΩ queda justo). El asentamiento es de ≈ 5·RC = 80 ms. Para respuesta más rápida con el mismo rizado, subir la frecuencia: a 40 kHz el RC baja a 1,6 ms.
Ejercicio 6: diagnosticar síntomas
(a) La estufa con control P se asienta 2 °C abajo de la consigna y en invierno 3 °C. (b) Al subir Kp, la temperatura empieza a oscilar con un período de ≈ 18 minutos. (c) El PI se pasa 6 °C cada vez que se enciende en frío. (d) La potencia con PID salta de 0 a 100 % sin parar aunque la temperatura es estable.
Ver solución razonada
(a) Droop: urégimen/Kp, mayor con más frío. Agregar integral o subir Kp. (b) Se superó la ganancia crítica: el período de ≈ 18 min es el Tu del lazo con sus retardos; bajar Kp a la mitad o acelerar el sensor. (c) Windup: integración condicional (anti-windup) o integrar solo cerca de la consigna. (d) Derivativa sin filtro amplificando el ruido de la medida: derivar la medida, filtrar con N ≈ 5–10 o eliminar el D.
14 · Síntesis
Ideas para recordar
- Ley P: u = Kp·e saturada entre 0 y 100 %; la banda proporcional es 100/Kp. Con Kp → ∞ es el on/off.
- Droop: e∞ = k·(Tset − Tamb)/(a·Kp + k) = urégimen/Kp. La potencia de régimen la fija el clima; Kp reparte cuánto error cuesta producirla.
- Los retardos fijan el techo de Kp: con sensor de 300 s y calefactor de 120 s, Ku ≈ 134 %/°C y Tu ≈ 18,6 min. Se opera a la mitad.
- PWM: el promedio es la potencia. Con relé, ventanas de minutos (cada ventana es un ciclo); con ventanas cortas, SSR. Como DAC, rizado ≈ Vcc·D(1 − D)/(f·RC): rizado y asentamiento se compran entre sí.
- PI: el integral borra el droop. Ti = τ cancela el polo del ambiente y el lazo queda de primer orden. Sin anti-windup, hasta +3,9 °C de sobrepico (+7,4 °C con retardos).
- D: frena el sobrepico (asentamiento de 88 a 33 min), pero amplifica el ruido: σu ≈ Kp·N·σ. Se deriva la medida y con filtro, o se omite.
- Sintonía: P hasta oscilar, anotar Ku y Tu; Ziegler-Nichols como punto de partida (agresivo); afinar mirando la respuesta; antes, arreglar el hardware.
- On/off si un rizado es tolerable y el actuador es un relé; PI cuando se necesita error nulo; PID cuando además hay un retardo molesto.
¿Listo para el Tema 31?
Podés avanzar si sos capaz de responder esto sin mirar:
- Calcular el error permanente de un control proporcional y explicar de qué depende.
- Explicar por qué los retardos limitan Kp y qué es la ganancia crítica.
- Dimensionar el PWM según la carga: ventana para el relé, frecuencia para un filtro RC.
- Describir el efecto del integral, el windup y el anti-windup.
- Explicar por qué el derivativo se aplica a la medida y con filtro.
- Elegir entre on/off, P, PI y PID para un caso dado.
Con el sensor amplificado, filtrado, calibrado y con un lazo de control que decide, el curso tiene todas sus piezas. En el próximo tema las juntamos en un proyecto: una estación de temperatura con alarma, de punta a punta y documentada.