← Índice del curso

Robótica y Automatización · Tema 42

Control todo o nada y proporcional

Los dos controladores más simples resuelven la mayoría de los problemas cotidianos, y cada uno falla de una manera distinta. El todo o nada oscila siempre y desgasta el actuador; el proporcional es suave, pero deja un error que ninguna ganancia razonable elimina. Entender esas dos fallas es lo que justifica el PID.

01 · Punto de partida

Dos reglas para cerrar el lazo

En el tema 40 cerramos el lazo con una idea: medir el error y actuar sobre él. En el 41 aprendimos a juzgar el resultado con tiempo de subida, sobreimpulso y estabilidad. Falta decidir cómo se convierte el error en una orden para el actuador, y esa regla es el controlador. Hay dos reglas elementales:

  • Todo o nada (on-off): el actuador está totalmente encendido o totalmente apagado según el signo del error. Es el termostato de una heladera, la bomba de agua de un tanque, el calefactor de una incubadora.
  • Proporcional: la orden es proporcional al error, u = Kp · e. Si el error es grande, la acción es fuerte; si es pequeño, suave.

Para compararlos usamos un sistema donde ambos aparecen en la vida real, un horno (o incubadora, o cama caliente de una impresora) con una constante de tiempo de 120 s. La potencia u va de 0 (apagado) a 1 (máxima) y con potencia máxima el horno llegaría a 100 °C si el ambiente está a 20 °C. Queremos mantenerlo en 60 °C.

Esto prepara el control PID del tema 43: cada limitación que veas acá es la que uno de sus tres términos viene a corregir.

02 · La regla más simple

El control todo o nada

La regla cabe en una línea: si la temperatura está por debajo de la referencia, se enciende; si está por encima, se apaga.

Lazo de un termostatoLa referencia de 60 grados y la temperatura medida llegan a un comparador con histéresis, que enciende o apaga un relé; el relé alimenta una resistencia que calienta el horno, y un sensor devuelve la temperatura al comparador. referencia60 °C Σ+− e Comparadorcon histéresis u (0 ó 1) Relé yresistencia Horno T Sensor

El problema aparece enseguida: si apagara exactamente en 60 °C y encendiera exactamente en 60 °C, el actuador tendría que conmutar infinitas veces por segundo alrededor del valor. Un relé real no puede, y aunque pudiera, se destruiría. La solución es la histéresis: dos umbrales distintos, uno para encender y otro para apagar.

Característica de un comparador con histéresisGráfico de la salida u contra la temperatura medida. Cuando la temperatura sube, u pasa de 1 a 0 al cruzar 61 grados; cuando baja, pasa de 0 a 1 al cruzar 59 grados. u = 1u = 0 60 °C 59 °C61 °C calentando: sigue encendido hasta pasar los 61 °C enfriando: sigue apagado hasta bajar de 59 °C temperatura medida

Con una histéresis h de 2 °C alrededor de 60 °C, el controlador enciende por debajo de 59 °C y apaga por encima de 61 °C. Entre 59 y 61 °C no cambia de estado: recuerda cuál era. Eso significa que el controlador tiene memoria, y el programa tiene que guardar el estado entre una lectura y la siguiente.

Temperatura con control todo o nadaLa temperatura oscila en forma de diente de sierra alrededor de 60 grados, entre 57,4 y 62,6 grados, mientras la señal de control alterna entre encendido y apagado cada pocos segundos.60 °Cencendido por debajo de 59 °C, apagado por encima de 61 °Cu25 min29 mintiempo6555

La figura muestra el régimen estacionario con histéresis de 2 °C y un sensor con 5 s de retardo. La temperatura nunca se queda quieta: sube con el calefactor encendido, baja con él apagado, y el promedio coincide con la referencia. Mientras tanto, la señal de control alterna sin parar.

Dos propiedades hacen valioso a este controlador. Primero, compensa solo los cambios de carga: si baja la temperatura ambiente, el calefactor pasa más tiempo encendido y la temperatura media sigue siendo 60 °C. Con 5 s de retardo e histéresis de 2 °C, el tiempo de encendido pasa del 49,7 % al 62,1 % cuando el ambiente baja de 20 a 10 °C, y la temperatura media apenas se mueve (59,99 y 59,63 °C). Segundo, no hace falta saber nada de la planta: basta con que el actuador pueda mover la variable en los dos sentidos.

03 · Cuánto separar los umbrales

Histéresis y banda muerta

La histéresis es un compromiso entre la precisión y el esfuerzo del actuador. Con el horno sin retardo en el sensor, la oscilación es casi igual a la histéresis y cada conmutación es un desgaste:

Todo o nada sin retardo y sin ruido: oscilación y conmutaciones del horno (régimen, de los 30 a los 60 min).
Histéresis hPico a picoConmutaciones por horaPeríodo
0,5 °C0,53 °C22503 s
2,0 °C2,03 °C59212 s
8,0 °C8,01 °C15048 s

Cuadruplicar la histéresis cuadruplica la oscilación y divide por cuatro la frecuencia de conmutación. Un relé electromecánico se especifica por el orden de 100 000 ciclos (un ciclo es encender y apagar, es decir, dos conmutaciones) en su vida útil. Con 592 conmutaciones por hora, que son 296 ciclos, se agotaría en unas 340 horas: unos 14 días de funcionamiento continuo. Con 2250 conmutaciones por hora, en menos de cuatro días. Un relé de estado sólido no tiene desgaste mecánico, pero sí calienta y genera interferencia en cada conmutación.

El ruido y el rebote

El sensor real no es perfecto: la lectura tiembla. Si el umbral de encendido y el de apagado casi coinciden, ese temblor cruza el umbral decenas de veces por minuto aunque la temperatura real esté quieta. Esto se llama rebote (chattering). Con un ruido de 0,3 °C de desvío estándar en la lectura:

Todo o nada con ruido de 0,3 °C en el sensor (sin retardo).
HistéresisTiempo mínimo entre cambiosConmutaciones por horaPico a pico
0 °Cninguno18 8720,69 °C
0,5 °Cninguno85160,86 °C
1,0 °Cninguno31481,19 °C
2,0 °Cninguno9022,11 °C
2,0 °C30 s1209,95 °C

Sin histéresis, el relé conmutaría más de 18 000 veces por hora: unas 10 horas de vida con un contacto mecánico. Subir la histéresis lo arregla a cambio de oscilar más. Hay una segunda defensa, el tiempo mínimo entre conmutaciones (protección contra ciclado corto): después de cambiar, el controlador ignora al sensor durante, por ejemplo, 30 s. Reduce el desgaste a 120 conmutaciones por hora, pero tiene un costo grande: mientras espera, el horno sigue calentando o enfriando, y la oscilación crece a casi 10 °C. Es la protección que traen los compresores de las heladeras y los aires acondicionados, donde un arranque demasiado seguido los daña.

La banda muerta

La banda muerta es un concepto vecino pero distinto. Es una zona alrededor de la referencia donde el controlador no hace nada, ni en un sentido ni en el otro. Aparece cuando hay dos actuadores opuestos, como un calefactor y un ventilador, o un motor que puede ir hacia delante y hacia atrás:

  • Error mayor que +1 °C: encender el calefactor.
  • Error entre −1 y +1 °C: ambos apagados (la banda muerta).
  • Error menor que −1 °C: encender el ventilador.

Sin banda muerta, ambos actuadores se pelearían alrededor de la referencia, gastando energía para nada. La histéresis evita que un actuador conmute demasiado; la banda muerta evita que dos actuadores trabajen uno contra otro. Las dos se pueden combinar. En un control proporcional, la banda muerta se usa para que el actuador deje de moverse con errores pequeños, a cambio de aceptar un error de hasta esa magnitud.

04 · Lo que el sensor no sabe

Retardo, oscilación y desgaste

Hasta ahora el sensor medía la temperatura al instante. Pero un sensor real está dentro de una masa que tarda en calentarse, o lejos de la resistencia, o promedia varias lecturas. El efecto es el mismo que vimos en el tema 41: el controlador reacciona a una temperatura que ya no es la actual. El todo o nada sigue calentando durante esos segundos, y cuando por fin el sensor «se entera», la temperatura real ya se pasó.

Todo o nada con retardo del sensor (sin ruido): el retardo domina a la histéresis.
RetardoHistéresisPico a picoConmutaciones por horaPeríodo
0 s0,5 °C0,53 °C22503 s
0 s2,0 °C2,03 °C59212 s
0 s8,0 °C8,01 °C15048 s
5 s0,5 °C3,77 °C31823 s
5 s2,0 °C5,19 °C23031 s
5 s8,0 °C10,97 °C10866 s
10 s0,5 °C6,89 °C17441 s
10 s2,0 °C8,27 °C14450 s
10 s8,0 °C13,77 °C8683 s
20 s0,5 °C12,73 °C9277 s
20 s2,0 °C13,99 °C8685 s
20 s8,0 °C19,07 °C62117 s

La tabla enseña tres cosas. Primero, con retardo la histéresis deja de ser lo que manda: con 10 s, una histéresis de 0,5 °C oscila 6,9 °C. Segundo, bajar la histéresis ayuda poco: pasar de 8 °C a 0,5 °C con 10 s de retardo reduce la oscilación de 13,8 a 6,9 °C, pero no la elimina, y el relé conmuta el doble (de 86 a 174 por hora). Tercero, la oscilación mínima está fijada por el retardo y por la velocidad con que el horno sube o baja: a 60 °C, unos 0,33 °C por segundo en cada sentido (con potencia máxima, (80 − 40) / 120; apagado, −40 / 120). Con 10 s de retardo la temperatura se pasa unos 3 °C a cada lado antes de que el controlador reaccione.

Observá la analogía con el tema 41: allá el retardo destruía el amortiguamiento de un sistema proporcional; acá fija una oscilación permanente en un sistema todo o nada. En ambos casos, la forma de mejorar es reducir el retardo: acercar el sensor al elemento calefactor, usar un sensor de respuesta más rápida o promediar menos lecturas. Antes de tocar el controlador, hay que mirar el lazo físico.

05 · Una acción a medida

El control proporcional

El proporcional corrige con una fuerza que crece con el error: u = Kp · (r − T), saturada entre 0 y 1 porque el calefactor no puede entregar menos que nada ni más que la potencia máxima. Con un horno a 20 °C y una referencia de 60 °C, el error es de 40 °C: con Kp = 0,5, el cálculo pide 20 veces la potencia máxima, y se entrega el 100 %.

Característica del controlador proporcional con saturaciónGráfico de la salida u contra el error. Es cero para errores negativos o nulos, crece en línea recta hasta alcanzar 1 cuando el error vale la inversa de Kp, y se mantiene en 1 para errores mayores. u = 1u = 0 banda proporcional = 1 / Kp e = 0e = 1/Kp saturado: el calefactor está a plena potencia u = Kp · e error e = r − T

La banda proporcional es el rango de error en que el controlador actúa de manera proporcional: va de 0 a 1/Kp. Fuera de esa banda, el actuador está saturado. Con Kp = 0,5 la banda es de 2 °C: con el horno por debajo de 58 °C está a plena potencia, y entre 58 y 60 °C la potencia baja linealmente. Los controladores industriales de temperatura suelen especificar la banda proporcional en lugar de la ganancia: una banda estrecha es una ganancia alta.

Ya lo usaste en el seguidor de línea del tema 31, donde el giro era proporcional a la desviación. Es una regla muy distinta de la del todo o nada. Cerca de la referencia, la potencia baja suavemente a medida que se acerca, y el horno llega sin pasarse y se queda quieto:

Temperatura del horno con control proporcionalTres curvas que suben desde 20 grados y se estabilizan sin oscilar por debajo de los 60 grados: con Kp de 0,1 queda en 55,6; con 0,5 en 59,0; con 2 en 59,75.60 °CKp = 0,1 → queda en 55,6 °CKp = 0,5 → 59,0 °CKp = 2 → 59,75 °C010 min6420

No hay oscilación, no hay conmutación, el actuador trabaja en forma continua. Pero hay un detalle en la figura: ninguna curva llega a 60 °C.

06 · Por qué no llega

El error que queda

La razón es lógica. Para mantener 60 °C a 20 °C de ambiente, el horno necesita una potencia fija: (60 − 20) / 80 = 0,5, la mitad de la máxima. Pero un controlador proporcional sólo entrega potencia si hay error: u = Kp · e. Para que u = 0,5 con Kp = 0,5, el error debe ser e = 1 °C. Si el error fuera cero, la potencia sería cero y el horno se enfriaría. El sistema se acomoda en el punto donde el error es justo el necesario para sostener la potencia. Con los números del horno:

e_ss = (r − T_ambiente) / (1 + K · Kp), con K = 80 °C por unidad de potencia.

Control proporcional del horno sin retardo: error en régimen antes y después de bajar el ambiente de 20 a 10 °C (simulación y fórmula).
KpBanda 1/KpError a 20 °CError a 10 °CFórmula (20 / 10 °C)
0,0520,0 °C8,00 °C10,00 °C8,00 / 10,00
0,1010,0 °C4,44 °C5,56 °C4,44 / 5,56
0,205,0 °C2,35 °C2,94 °C2,35 / 2,94
0,502,0 °C0,98 °C1,22 °C0,98 / 1,22
1,001,0 °C0,49 °C0,62 °C0,49 / 0,62
2,000,5 °C0,25 °C0,31 °C0,25 / 0,31
5,000,2 °C0,10 °C0,12 °C0,10 / 0,12

Es la fórmula del tema 40 aplicada a este caso: el error del lazo cerrado es el del lazo abierto dividido por 1 + K · Kp. Dos lecciones:

  • El error disminuye con la ganancia, pero nunca se anula. Para bajar de 1 °C hace falta Kp ≥ 0,5; para bajar de 0,1 °C, Kp = 5, con los problemas de ruido y retardo que siguen.
  • El error depende de las condiciones. Cuando el ambiente baja a 10 °C, hace falta más potencia (0,625) y el error crece (0,98 a 1,22 °C con Kp = 0,5). El todo o nada, en cambio, no se enteraba del cambio. El proporcional puro paga con un error que se mueve con la carga.

El truco manual: el punto de reposo

Si se sabe de antemano la potencia necesaria, se puede sumar a la salida: u = u0 + Kp · e. Con u0 = 0,5 el error a 20 °C es exactamente cero. Los controladores industriales lo llaman reset manual o bias. Pero el truco sólo vale para una condición: con el ambiente a 10 °C, el error vuelve: (60 − 10 − 80 · 0,5) / (1 + 80 · 0,5) = 0,24 °C con Kp = 0,5. La acción integral del tema 43 es la forma de que el controlador encuentre y siga por sí mismo ese u0 mientras las condiciones cambian.

07 · Los límites de la ganancia

Ruido, saturación y retardo

Si subir la ganancia reduce el error, ¿por qué no usar la máxima? Por los tres precios que el tema 40 y el 41 ya anticipaban:

Ruido. El proporcional multiplica el ruido del sensor por Kp. Con un ruido de 0,3 °C de desvío estándar, la desviación de la señal de control resulta:

Efecto del ruido del sensor (0,3 °C) sobre el control proporcional (régimen, de los 30 a los 60 min).
KpDesvío de la salida uError en régimen
0,10,0304,45 °C
0,50,1521,04 °C
1,00,2800,58 °C
2,00,3870,35 °C

El desvío de u es casi Kp · 0,3 (0,15 para Kp = 0,5) mientras no sature. Con Kp = 2 sería 0,6, pero la salida se recorta contra 0 y 1, y el valor baja a 0,387. Para un calefactor, esa variación es inofensiva; para un motor o una válvula, que vibran y se desgastan, es un problema. Esta es una razón para filtrar la medición (tema 44).

Saturación. En el arranque, el error es grande y el actuador va a plena potencia durante un tiempo: con Kp = 0,5, hasta los 77 s; con Kp = 5, hasta los 83 s. Durante la saturación el lazo está abierto de hecho (tema 40): subir Kp no acelera el arranque. El proporcional sin saturación sólo existe en el cálculo.

Retardo. Es el mismo mecanismo del tema 41: la acción correctiva llega tarde y, si la ganancia es alta, se suma a la oscilación en lugar de restarla. En el horno:

Control proporcional con retardo del sensor: amplitud de la oscilación residual entre los 1600 y los 1800 s (en °C).
RetardoKp = 0,1Kp = 0,5Kp = 1,0Kp = 2,0
0 s0,000,000,000,00
5 s0,001,442,683,05
10 s0,004,433,883,92
20 s0,007,107,617,69

Sin retardo, ninguna ganancia oscila. Con 5 s, Kp = 0,5 ya oscila 1,4 °C, y con ganancias mayores la oscilación se estaciona en unos pocos grados, porque la saturación la limita: un proporcional de ganancia muy alta con retardo se convierte, en la práctica, en un todo o nada. Sólo Kp = 0,1 permanece quieto incluso con 20 s, al precio de un error de 4,4 °C. Así queda el panorama: hacia un lado, error; hacia el otro, oscilación.

08 · Decidir con criterio

Cuál usar y cómo salir del paso

Comparación de los dos controladores.
AspectoTodo o nadaProporcional
Complejidadmínima, sin parámetros de gananciaun parámetro (Kp)
Actuadorsólo encendido/apagado (relé, válvula, compresor)de salida graduable (PWM, motor, válvula proporcional)
Oscilaciónsiempre, a menos que se acepte un retardo mínimoninguna si no hay retardo; con retardo y mucha ganancia, sí
Error mediocero (el promedio coincide con la referencia)distinto de cero, y varía con la carga
Desgaste del actuadoralto: miles de conmutaciones por horabajo: ajustes continuos
Respuesta al arranquepotencia máxima hasta llegarpotencia máxima hasta la banda proporcional, luego suave
Ruido del sensorrebote: se cubre con histéresisel ruido se multiplica por Kp

La regla práctica: el todo o nada es suficiente cuando el sistema es lento, la oscilación tolerable es mayor que la que produce y el actuador soporta conmutar (una heladera, un termotanque, el nivel de un tanque, una bomba). El proporcional corresponde cuando el actuador se puede graduar, la oscilación no es aceptable y un error pequeño es tolerable (la velocidad de un motor, la posición de un brazo). Cuando se necesita precisión y suavidad a la vez, hace falta el PID.

Proporcional con un relé: la salida por ventana de tiempo

Un calefactor con relé sólo admite encendido o apagado, pero se le puede aplicar un control proporcional si se convierte u en una fracción de tiempo. Se elige una ventana, por ejemplo 10 s, mucho menor que la constante de tiempo del horno (120 s): con u = 0,5 el relé queda encendido 5 s y apagado 5 s en cada ventana. Es el PWM del tema 13 con un período largo, y el horno, por su inercia, promedia los pulsos. Cada ventana cuesta dos conmutaciones como máximo: 720 por hora con 10 s. Con un relé mecánico conviene una ventana mayor (30 s, 240 por hora), y con un relé de estado sólido puede ser corta.

09 · Código para la placa

Los dos controladores en Arduino

El sketch simula el horno con un paso de 0,1 s y aplica los dos controladores sobre la misma planta, incluyendo el retardo del sensor mediante una cola circular de temperaturas pasadas. Las dos funciones de control son las que se usarían con un sensor y un relé reales; el resto reemplaza a la planta. Se mide en la segunda mitad de la hora simulada, cuando el sistema ya está en régimen.

// Termostato de un horno simulado: control todo o nada con histéresis y control proporcional.
// Horno: TAU * T' = -(T - TA) + K * u, con u entre 0 (apagado) y 1 (potencia máxima). Paso de 0,1 s.
const float DT = 0.1, TAU = 120.0, K = 80.0, REF = 60.0, TA = 20.0;
const int N_MAX = 60;                       // muestras de retardo admitidas (6 s a 0,1 s)
float cola[N_MAX];                          // temperaturas pasadas, para simular el retardo del sensor

bool todoONada(float medida, bool encendido, float h) {
  if (medida < REF - h / 2) return true;    // por debajo de la banda: enciende
  if (medida > REF + h / 2) return false;   // por encima: apaga
  return encendido;                         // dentro de la banda: mantiene el estado
}

float proporcional(float medida, float kp) {
  return constrain(kp * (REF - medida), 0.0, 1.0);
}

// Simula una hora. Mide en la segunda mitad (régimen): amplitud, conmutaciones por hora y error final.
void ensayar(bool onoff, float parametro, int retardo) {
  float T = TA, u = 0, tMin = 1000, tMax = 0;
  long cambios = 0;
  for (long k = 0; k < 36000; k++) {
    cola[k % N_MAX] = T;
    float medida = (k >= retardo) ? cola[(k - retardo) % N_MAX] : TA;
    float nuevo = onoff ? (todoONada(medida, u > 0.5, parametro) ? 1.0 : 0.0)
                        : proporcional(medida, parametro);
    if (k > 18000 && nuevo != u) cambios++;
    u = nuevo;
    T += DT * (-(T - TA) + K * u) / TAU;
    if (k >= 18000) { tMin = min(tMin, T); tMax = max(tMax, T); }
  }
  if (onoff) {
    Serial.print("todo o nada  h="); Serial.print(parametro, 1);
    Serial.print(" C  retardo="); Serial.print(retardo * DT, 0);
    Serial.print(" s  pico a pico="); Serial.print(tMax - tMin, 2);
    Serial.print(" C  conmutaciones/h="); Serial.println(cambios * 2);
  } else {
    Serial.print("proporcional Kp="); Serial.print(parametro, 2);
    Serial.print("  error final="); Serial.print(REF - T, 2); Serial.println(" C");
  }
}

void setup() {
  Serial.begin(115200);
  ensayar(true, 0.5, 0);
  ensayar(true, 2.0, 0);
  ensayar(true, 2.0, 50);                   // 5 s de retardo
  ensayar(false, 0.5, 0);
  ensayar(false, 2.0, 0);
}

void loop() {}

La salida repite la tabla del texto:

todo o nada  h=0.5 C  retardo=0 s  pico a pico=0.53 C  conmutaciones/h=2250
todo o nada  h=2.0 C  retardo=0 s  pico a pico=2.03 C  conmutaciones/h=592
todo o nada  h=2.0 C  retardo=5 s  pico a pico=5.19 C  conmutaciones/h=230
proporcional Kp=0.50  error final=0.98 C
proporcional Kp=2.00  error final=0.25 C

Las diferencias de centésimas que pueda haber, y de algunas conmutaciones más o menos, vienen de la aritmética de 32 bits. Con un sensor real, medida vendría de analogRead o de la librería del sensor (tema 5), y el resultado de todoONada iría a digitalWrite sobre el pin del relé.

Para ejecutar el control proporcional sobre un relé, se convierte u en una ventana de tiempo, sin bloquear el programa:

const unsigned long VENTANA = 10000;       // ms; mucho menor que la constante de tiempo del horno

// u en [0, 1]: devuelve true mientras el relé debe estar encendido dentro de la ventana actual
bool salidaPorVentana(float u) {
  return (millis() % VENTANA) < (unsigned long)(u * VENTANA);
}

// En loop():  digitalWrite(PIN_RELE, salidaPorVentana(proporcional(medida, kp)) ? HIGH : LOW);

Para el todo o nada real, agregá la protección de tiempo mínimo: guardá el instante del último cambio en millis() y no cambies de estado hasta que pase el intervalo mínimo, como hace la simulación de Python más abajo.

10 · Exploración interactiva

Laboratorios del horno

1. El termostato

Control todo o nada del horno durante 30 minutos. La curva violeta es la temperatura; la naranja, la señal de control (0 ó 1). Las medidas se toman entre los minutos 15 y 30.

Temperatura y señal de control del termostatoCurva de la temperatura del horno durante 30 minutos con la referencia de 60 grados punteada, y debajo la señal de encendido y apagado.
Oscilación pico a pico—
Conmutaciones—
Período—
Temperatura media—

Mové los controles.

Probá: con histéresis 2 y sin retardo, la oscilación es casi 2 °C. Ponele 10 s de retardo y observá cómo se cuadruplica sin tocar la histéresis. Poné histéresis 0 y ruido 0,3: el relé conmuta decenas de miles de veces por hora. Agregá 30 s de tiempo mínimo y ese número cae, pero la temperatura se va varios grados de la referencia.

2. El proporcional y el error

Control proporcional del mismo horno durante una hora. Si activás el enfriamiento del ambiente, a los 30 min baja de 20 a 10 °C y se ve cómo cambia el error.

Temperatura y potencia con control proporcionalCurva de la temperatura del horno durante una hora con la referencia de 60 grados punteada, y debajo la potencia aplicada.
Banda proporcional—
Error a los 30 min—
Error al final—
Máximo sobre 60 °C—

Elegí Kp.

Probá Kp = 0,5 y los valores de la tabla: 0,98 °C de error a los 30 min y 1,22 °C después de enfriar el ambiente. Subí Kp a 5: el error baja a 0,10 °C. Ahora ponele 10 s de retardo, y observá cómo esa misma ganancia empieza a oscilar y a saturar.

11 · Código ejecutable

Comparar controladores en Python

El mismo horno, con los dos controladores, el retardo, el cambio de ambiente y las medidas de ciclo. El código reproduce las tablas del tema.

Probalo en el navegador. Python se descarga con Pyodide la primera vez y requiere conexión. El código es editable y no controla ningún equipo real.

DT, TAU, K, REF, TA = 0.1, 120.0, 80.0, 60.0, 20.0

def simular(modo, h=2.0, kp=0.2, retardo=0.0, tmin=0.0, ta=TA, ta_fin=None, t_pert=1800.0, t_fin=3600.0):
    """Horno: TAU*T' = -(T - ta) + K*u. 'onoff' con histéresis h; 'prop' con u = kp*(REF - medida)."""
    T, u, ultimo = ta, 0.0, -1e9
    n_ret = round(retardo / DT)
    hist, temp, sal = [], [], []
    for k in range(round(t_fin / DT)):
        t = k * DT
        hist.append(T)
        medida = hist[k - n_ret] if k - n_ret >= 0 else ta          # sensor con retardo
        if modo == "onoff":
            nuevo = 1.0 if medida < REF - h / 2 else 0.0 if medida > REF + h / 2 else u
            if nuevo != u and t - ultimo >= tmin:
                u, ultimo = nuevo, t
        else:
            u = min(1.0, max(0.0, kp * (REF - medida)))
        amb = ta_fin if ta_fin is not None and t >= t_pert else ta
        T += DT * (-(T - amb) + K * u) / TAU
        temp.append(T); sal.append(u)
    return temp, sal

def ciclo(temp, sal, a=1800.0, b=3600.0):
    i0, i1 = round(a / DT), round(b / DT)
    seg = temp[i0:i1]
    cambios = sum(1 for i in range(i0 + 1, i1) if sal[i] != sal[i - 1])
    subidas = [i * DT for i in range(i0 + 1, i1) if sal[i] > sal[i - 1]]
    periodo = (subidas[-1] - subidas[0]) / (len(subidas) - 1) if len(subidas) > 1 else None
    return {"pp": max(seg) - min(seg), "media": sum(seg) / len(seg),
            "por_hora": cambios * 3600.0 / (b - a), "periodo": periodo}

if __name__ == "__main__":
    print("Todo o nada: amplitud pico a pico, conmutaciones por hora y período (régimen, 30 a 60 min)")
    print("retardo  hist.   pico-pico   conm./h   período")
    for retardo in (0, 5, 10, 20):
        for h in (0.5, 2.0, 8.0):
            c = ciclo(*simular("onoff", h=h, retardo=retardo))
            per = "—" if c["periodo"] is None else f"{c['periodo']:.0f} s"
            print(f"{retardo:4d} s  {h:4.1f} °C   {c['pp']:6.2f} °C   {c['por_hora']:6.0f}    {per}")

    print("\nProporcional sin retardo: error antes y después de bajar el ambiente de 20 a 10 °C")
    print("  Kp    banda    error antes   error después   teoría antes / después")
    for kp in (0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 5.0):
        temp, _ = simular("prop", kp=kp, ta_fin=10.0)
        e1, e2 = REF - temp[17899], REF - temp[35899]
        t1 = (REF - TA) / (1 + K * kp); t2 = (REF - 10.0) / (1 + K * kp)
        print(f"{kp:5.2f}  {1/kp:5.1f} °C   {e1:6.2f} °C    {e2:6.2f} °C      {t1:5.2f} / {t2:5.2f}")

    print("\nProporcional con retardo del sensor: oscilación residual (°C) entre 1600 y 1800 s")
    print("retardo   Kp=0,1   Kp=0,5   Kp=1,0   Kp=2,0")
    for retardo in (0, 5, 10, 20):
        fila = []
        for kp in (0.1, 0.5, 1.0, 2.0):
            temp, _ = simular("prop", kp=kp, retardo=retardo, t_fin=1800.0)
            ref = temp[-1]
            fila.append(max(abs(x - ref) for x in temp[16000:]))
        print(f"{retardo:4d} s   " + "   ".join(f"{a:6.2f}" for a in fila))

La salida repite las tablas del texto: doce combinaciones de histéresis y retardo para el todo o nada, siete ganancias del proporcional antes y después de enfriar el ambiente, y la oscilación residual con retardo.

Probá llamar a simular("onoff", h=0.5, tmin=30) y ver cuánto crece la oscilación con el tiempo mínimo, o buscar a mano la ganancia máxima que no oscila con 10 s de retardo.

12 · Método y diagnóstico

Pruebas y diagnóstico

  1. Registrá referencia, medida y salida a un período regular (tema 37): con esas tres señales se ve oscilación, saturación y error.
  2. Medí el retardo del sensor antes de elegir el controlador: dale un escalón al actuador y mirá cuánto tarda en notarse.
  3. En un todo o nada, contá las conmutaciones por hora y compará con la vida útil del actuador.
  4. Elegí la histéresis a partir de la oscilación tolerable, no al revés, y verificá que la oscilación real, con el retardo, no la supere.
  5. En un proporcional, medí el error en régimen con la carga normal y con la peor carga; si cambia mucho, el proporcional puro no alcanza.
  6. Probá con el sensor ruidoso y con el sensor desconectado: en ambos casos el sistema debe quedar en un estado seguro (tema 39).
  7. Subí Kp de a poco y detenete ante el primer signo de oscilación sostenida o de actuador temblando.
«El todo o nada es un control primitivo que hay que reemplazar»

No: es el apropiado para actuadores que sólo conmutan y sistemas lentos. Una heladera con PID sería más cara y no mejoraría nada que importe.

«A menor histéresis, mejor control»

Menos oscilación aparente, pero más conmutaciones y más rebote por ruido. Con retardo, la oscilación apenas mejora y el desgaste aumenta.

«La banda muerta y la histéresis son lo mismo»

La histéresis evita que un actuador conmute demasiado, con dos umbrales y memoria. La banda muerta apaga ambos actuadores en una zona de error pequeño.

«Con suficiente ganancia el proporcional llega a la referencia»

El error baja como 1 / (1 + K · Kp), pero no se anula, y la ganancia está acotada por el ruido, la saturación y el retardo.

«El error del proporcional es un defecto del ajuste»

Es una propiedad del controlador: si la planta necesita una salida distinta de cero para sostener la referencia, hace falta un error que la produzca.

«Si el proporcional oscila, hay que subir la ganancia»

Al contrario: la oscilación por retardo se corrige bajando la ganancia o reduciendo el retardo.

13 · Práctica guiada

Predecí antes de comprobar

1. Vida del relé

El horno sin retardo con histéresis de 2 °C conmuta 592 veces por hora. Un relé aguanta 100 000 ciclos de encendido y apagado. ¿Cuánto dura funcionando sin parar?

Ver solución

Cada ciclo son dos conmutaciones: 592 / 2 = 296 ciclos por hora. Entonces 100 000 / 296 ≈ 338 horas, unos 14 días. Con una histéresis de 8 °C (150 conmutaciones, 75 ciclos por hora) serían 1333 horas, unos 56 días; y con un relé de estado sólido, sin desgaste mecánico, el problema desaparece.

2. Potencia de mantenimiento

¿Qué fracción de la potencia necesita el horno para mantener 60 °C con el ambiente a 20 °C y a 10 °C? ¿Cómo se ve en el todo o nada?

Ver solución

u = (60 − Tamb) / 80: 0,5 a 20 °C y 0,625 a 10 °C. El todo o nada lo logra con el tiempo de encendido: 49,7 % y 62,1 % en la simulación con 5 s de retardo. El proporcional lo logra con el error.

3. Banda proporcional

Un controlador tiene una banda proporcional de 4 °C. ¿Cuánto vale Kp y cuál es el error en régimen a 20 °C de ambiente?

Ver solución

Kp = 1/4 = 0,25 u/°C. El error es 40 / (1 + 80 · 0,25) = 40/21 = 1,90 °C. El horno se estabiliza en unos 58,1 °C.

4. Ganancia para un error dado

Se quiere un error en régimen menor a 0,5 °C con el ambiente a 20 °C. ¿Qué Kp hace falta? ¿Alcanza si el ambiente baja a 10 °C?

Ver solución

40 / (1 + 80 · Kp) ≤ 0,5 da Kp ≥ 0,99, es decir Kp = 1. Con 10 °C de ambiente el error sería 50 / 81 = 0,62 °C: no alcanza. Hace falta Kp ≥ 1,24 o una acción integral.

5. Saturación

Con Kp = 0,5, ¿hasta qué temperatura está el horno a plena potencia?

Ver solución

La salida es 1 mientras 0,5 · e ≥ 1, es decir, e ≥ 2 °C: hasta 58 °C. La simulación muestra que sale de la saturación a los 77 s.

6. Reset manual

Se agrega u0 = 0,5 a un proporcional con Kp = 0,5. ¿Cuál es el error con el ambiente a 20 °C y a 10 °C?

Ver solución

A 20 °C: (60 − 20 − 80 · 0,5) / 41 = 0. A 10 °C: (60 − 10 − 40) / 41 = 0,24 °C. Es mejor que el 1,22 °C sin u0, pero sigue dependiendo de la condición.

7. Elegir con retardo

El sensor del horno tiene 10 s de retardo y se exige 60 ± 1 °C. ¿Sirve el todo o nada con histéresis de 2 °C? ¿Y un proporcional?

Ver solución

El todo o nada oscila 8,27 °C pico a pico: no cumple, ni bajando la histéresis (con 0,5 °C son 6,89 °C). Un proporcional con Kp = 0,5 oscila 4,4 °C, y con Kp = 0,1 no oscila, pero deja 4,4 °C de error. Ninguno sirve: hay que acercar el sensor para reducir el retardo o pasar a un PID bien ajustado (temas 43 y 44).

14 · Síntesis

Ideas para recordar

  • El todo o nada enciende o apaga el actuador según el signo del error; necesita histéresis (dos umbrales y memoria) para no conmutar sin parar.
  • Su temperatura oscila siempre; el promedio coincide con la referencia y compensa solo los cambios de carga.
  • Menos histéresis significa más conmutaciones y más rebote por ruido; un tiempo mínimo entre cambios protege el actuador pero aumenta la oscilación.
  • El retardo del sensor fija la oscilación mínima del todo o nada, por mucho que se reduzca la histéresis.
  • La banda muerta evita que dos actuadores opuestos se peleen; la histéresis evita que uno conmute demasiado.
  • El proporcional, u = Kp · e, es suave y no oscila sin retardo, pero está saturado fuera de su banda proporcional 1/Kp.
  • Deja un error en régimen (r − Tamb) / (1 + K · Kp): baja con la ganancia, nunca se anula y cambia con la carga.
  • La ganancia está acotada por el ruido, la saturación y el retardo; con mucha ganancia y retardo, el proporcional oscila como un todo o nada.

¿Listo para el tema 43?

Antes de avanzar, elegí el horno con 5 s de retardo y 1 °C de error tolerable. Anotá qué hace el todo o nada con histéresis de 1 °C y qué hace el proporcional con Kp = 0,5 y con Kp = 2. Escribí qué le falta a cada uno.

En el próximo tema sumamos dos ideas para completar el proporcional: la acción integral, que elimina el error en régimen, y la derivativa, que amortigua la oscilación. Juntas forman el control PID.