Electrónica Analógica · Tema 30

Control proporcional

Del todo o nada al término medio. La potencia en proporción al error, por qué queda un error permanente (el droop) y exactamente cuánto vale, qué lo vuelve inestable, cómo se entrega una potencia intermedia con un solo pin (el PWM y sus trampas con el relé) y qué agregan las acciones integral y derivativa. El PID, visto desde adentro y con números.

≈ 90 minutos El mismo ambiente del Tema 29 con control P, PI y PID Incluye 2 simuladores y Python

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.

Error permanente (°C) y potencia de régimen (%) según Kp y la temperatura exterior; consigna 20 °C (calculado).
KpBanda prop.Exterior 0 °CExterior 10 °CExterior 15 °C
5 %/°C20 °C8,00 °C (40 %)4,00 °C (20 %)2,00 °C (10 %)
20 %/°C5 °C2,85 °C (57 %)1,43 °C (29 %)0,71 °C (14 %)
100 %/°C1 °C0,64 °C (65 %)0,32 °C (32 %)0,16 °C (16 %)
300 %/°C0,33 °C0,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.

Ganancia crítica según los retardos del lazo (calculado; ambiente de 50 min).
τ sensorτ calefactorKuTu
300 s— (ninguno)nunca oscila (dos retardos no alcanzan −180°)—
300 s120 s134 %/°C18,6 min
120 s120 s180 %/°C12,1 min
300 s60 s225 %/°C13,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).

La frecuencia del PWM la decide la carga, no el microcontrolador.
CargaFrecuenciaPor quéDriver
Calefactor con SSRVentana de 1 a 10 sLa 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 minEl relé se desgasta por ciclo (ver abajo)Relé con diodo
LED≥ 1 kHzSin parpadeo visibleMOSFET + R serie
Motor de continua≈ 20 kHzFuera del oído: sin silbidoPuente H + diodos
PWM filtrado como DAC1 a 100 kHzCuanto más alta, menos rizado con el mismo filtroFiltro 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:

Vida de un relé de 100 000 ciclos según la ventana del PWM (calculado).
VentanaCiclos/díaVida del reléVeredicto
1 s (1 Hz)86 4001,2 díasImposible con relé
10 s8 64011,6 díasSolo para SSR
60 s1 44069 díasNo
10 min1441,9 añosAceptable

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:

PWM de 5 V al 50 %: rizado exacto y asentamiento según f, R y C (calculado).
fRCRCRizado ppAsentamiento
1 kHz10 kΩ0,1 µF1 ms≈ 1,22 V5 ms
1 kHz100 kΩ1 µF100 ms12,5 mV0,5 s
20 kHz10 kΩ0,1 µF1 ms62,5 mV5 ms
20 kHz100 kΩ1 µF100 ms0,63 mV0,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.

Arranque en frío (10 °C → consigna 20 °C), Kp = 20 %/°C, sin retardos de sensor (simulado).
ControlError en régimenSobrepicoAsentamiento ±0,5 °C
P−1,43 °C (droop)ningunonunca entra en ±0,5 °C
PI, Ti = 3000 s, con anti-windup0,00 °C0,00 °C48 min
PI, Ti = 3000 s, sin anti-windup0,00 °C+0,26 °C24 min
PI, Ti = 600 s, con anti-windup0,00 °C+0,71 °C43 min
PI, Ti = 600 s, sin anti-windup0,00 °C+3,91 °C55 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:

Reglas de Ziegler-Nichols y su aplicación al lazo del tema (Ku = 134 %/°C, Tu = 1117 s).
ControlKpTiTdAquí
P0,5·Ku——67 %/°C
PI0,45·KuTu/1,2—60 %/°C, 930 s
PID0,6·KuTu/2Tu/880 %/°C, 558 s, 140 s
Arranque en frío (10 → 20 °C) con sensor de 300 s y calefactor de 120 s; consigna 20 °C (simulado, con anti-windup salvo indicación).
ControlError finalSobrepicoAsentamiento ±0,5 °C
P, Kp = 20−1,43 °C—no asienta
P, Kp = 60 (≈ 0,45 Ku)−0,53 °C+1,46 °Cno asienta
PI, Kp = 20, Ti = τ (3003 s)0,00 °C+0,12 °C68 min
PI ZN (60 %/°C, 930 s)0,00 °C+1,58 °C88 min
PI ZN sin anti-windup0,00 °C+7,36 °C180 min
PID ZN (80 %/°C, 558 s, 140 s)0,00 °C+1,24 °C33 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:

Cómo elegir el control.
CriterioOn/off con histéresisProporcional (P)PI / PID
Rizado de la variableSí (la banda, más sobrepico)NoNo
Error medio≈ 0 (promedio centrado)Droop = urég/Kp0
ActuadorRelé: sufre ciclosExige potencia graduable (PWM)Ídem
Estabilidad con retardosSiempre (limita el ciclo)Kp < KuKp < Ku y anti-windup
SintoníaUna bandaUn parámetroDos o tres
EjemplosHeladera, estufa, bomba de tanqueVelocidad de ventilador, nivel sin precisiónHorno 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.

SIMULADOR 30

Lazo cerrado P, PI y PID

u = K_p·[e + (1/T_i)∫e dt − T_d·dT/dt]

Temperatura y potencia en ocho horas Arriba, la temperatura del ambiente (verde) con la consigna punteada y la franja de más o menos medio grado; abajo, la potencia entregada al calefactor en porcentaje. TEMPERATURA (VERDE) · CONSIGNA PUNTEADA · POTENCIA ABAJO (NARANJA, 0–100 %)
Temperatura final / error18,57 / −1,43 °C
Sobrepico máximoninguno
Asentamiento ±0,5 °Cno asienta
Potencia final29 %
Oscilación en la última hora0,00 °C
EstadoEstable con droop

Recorrido guiado (10 minutos)

  1. 1
    Pestañ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.

  2. 2
    Pasá 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.

  3. 3
    Pasá 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.

  4. 4
    Pasá 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.

  5. 5
    Pasá 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.

  6. 6
    Pasá 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.

  7. 7
    Pasá 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.

  8. 8
    Pestañ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.

  9. 9
    Pasá 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

  1. En ①, con P y Kp = 20, ¿qué temperatura exterior da un droop de 2,85 °C? ¿Por qué es mayor?
  2. En ①, con retardos, ¿entre qué Kp de la lista el lazo P pasa de asentarse a oscilar?
  3. En ①, ¿qué hace falta (además del I) para que el PI de Ti = 600 s no se pase de la consigna al arrancar?
  4. En ②, ¿cómo se logra un rizado menor que un paso de 8 bits sin esperar medio segundo?
Ver respuestas sugeridas
  1. 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.
  2. 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.
  3. 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).
  4. 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

El mismo oficio, en dos mundos.
En software y en la rutaEn 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 deseadaP: u = Kp·e
Quedarse siempre un poco por debajo de la velocidad porque en la subida hace falta pie para mantenerlaEl droop: la carga exige potencia y la potencia exige error
Recordar cuánto tiempo llevás por debajo y apretar másI: acumula el error hasta anularlo
Apretar tanto en una cuesta larga que después te pasás de largoWindup: el integral crece con la salida saturada
Aliviar antes de llegar porque ves que te acercás rápidoD: reacciona a la velocidad del error
Un velocímetro ruidoso que tembla y hace que el pie se mueva sin pararD sin filtro: amplifica el ruido de la medida
Autoscaling con retardo de arranque de instancias: sobre-escala y luego sobre-recortaGanancia demasiado alta con retardos: oscilación sostenida
Modular la tasa de peticiones con un porcentaje del tiempo en lugar de abrir y cerrarPWM: 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.