Electrónica Analógica · Tema 31

Proyecto: estación con alarma

Todo el curso en una placa. Un termómetro de 0 a 50 °C con salida para un ADC y una alarma que enciende a 35 °C y apaga a 33 °C sin repiquetear. Partimos de una especificación con números, fijamos el contrato de cada bloque, diseñamos con cuentas, estimamos qué tolerancias aguantamos con Monte Carlo, calibramos con un preset y ponemos en marcha nodo por nodo.

≈ 100 minutos NTC + INA + RC + Schmitt + driver, con 5 V simples Incluye 2 simuladores y Python

01 · Especificación

Qué debe hacer, con números

Un proyecto empieza por una especificación que se pueda verificar. «Un termómetro con alarma» no lo es; esta sí:

Requisitos de la estación y lo que implican.
RequisitoValorQué decide
Rango de medida0 a 50 °CGanancia del INA por el peor extremo (Tema 26)
Salida analógicaDentro de 0,1–4,9 V, para un ADC de 5 V y 10 bitsGanancia y REF del INA
ResoluciónMejor que 0,1 °C por cuentaVerificar con el ADC (no es el límite)
AlarmaON sobre 35 °C, OFF bajo 33 °C (banda de 2 °C)Histéresis del Schmitt (Tema 20)
Exactitud de la alarma±1 °C de la consigna, tras calibrarTolerancias y preset (sección 5 y 6)
Salidas de alarmaBuzzer activo de 5 V (≈ 30 mA) y un LEDDriver con transistor (Tema 29)
AlimentaciónAdaptador de 9 V, 5 V regulados7805, desacople y masa (Tema 28)
RobustezSensor abierto o en corto: alarma activa, nunca silencioFalla segura (Tema 29)

Notá que la exactitud pedida (±1 °C) no es «la mejor posible»: es la que justifica los componentes baratos y un preset. Una especificación más exigente (±0,1 °C) cambiaría el diseño entero —sensor, referencia, calibración en varios puntos—. Elegir el requisito es la primera decisión de ingeniería, y se puede equivocar en las dos direcciones: de más, se paga; de menos, no sirve.

La escena. Es la sala de servidores de un taller, o un invernadero, o una incubadora de aficionado: un lugar donde la temperatura debe vigilarse y avisar si pasa de 35 °C, con una salida analógica para registrar la curva. Si la alarma suena y se apaga cada medio minuto, se ignora; si no suena, no sirve. El diseño tiene que evitar los dos defectos.

  • ¿Qué bloques hay, en qué orden y con qué contrato entre ellos?
  • ¿Qué valor lleva cada componente y por qué?
  • ¿Cuánto error de umbral producen las tolerancias de los componentes?
  • ¿Cómo se calibra para llegar a ±1 °C?
  • ¿En qué orden se prueba y qué se espera en cada nodo?

02 · Arquitectura

Seis bloques y los contratos entre ellos

9 V → 7805 → 5 V → puente NTC → INA (G = 1,5, REF = 2,5 V) →RC 1 Hz + seguidor → ADC y Schmitt →driver → buzzer + LED
Bloques, valores principales y el tema donde se diseñó cada uno.
BloqueValoresTema
FuenteAdaptador 9 V → 7805 → 5 V; 100 µF + 100 nF en la entrada y la salida28
PuenteNTC 10k (B = 3950) arriba y fija de 10k abajo; rama de referencia 10k/10k13, 26
INAAlimentación simple (tipo INA333), G = 1,5 con Rg = 200 kΩ, REF = 2,5 V con seguidor25
FiltroRC 150 kΩ + 1 µF (fc = 1,06 Hz) y seguidor (LM358)23, 26, 27
AlarmaSchmitt no inversor: R1 = 10 kΩ, Rf = 220 kΩ, Vref ≈ 3,15 V con preset20, 29
DriverNPN con Rb = 680 Ω; buzzer activo de 5 V y LED con 330 Ω29

Antes de elegir un solo resistor se escribe el contrato de cada interfaz: el rango que el bloque entrega y el rango que el siguiente admite. Es el equivalente de la firma de una API:

Contratos entre bloques (rango entre 0 y 50 °C).
NodoRango entregadoLo que admite el siguienteMargen
VB (puente)1,15 a 3,68 VModo común de entrada del INA de alimentación simple: cerca de los rielesMás de 1 V a cada lado
Vdif (puente)−1354 a +1180 mVCon G = 1,5: salida entre 0,47 y 4,27 V0,37 V abajo, 0,63 V arriba de la ventana de 0,1–4,9 V
VINA0,47 a 4,27 VFiltro RC (sin carga) y seguidorEl seguidor admite 0 a 3,5 V*
Vfiltro (salida del seguidor)0,47 a 4,27 VADC: 0 a 5 V; R1 del SchmittImpedancia baja, apta para el ADC
Nodo + del Schmitt≈ Vref ± 0,15 VModo común del LM358 hasta ≈ 3,5 V0,35 V sobre Vref = 3,15 V

* El LM358 admite entradas hasta V+ − 1,5 V (≈ 3,5 V con 5 V): un seguidor que deba entregar hasta 4,27 V excede ese rango. Para esta función se usa un amplificador con entrada y salida rail-to-rail (por ejemplo, un cuádruple de la familia TLV o MCP); el LM358 queda para el Schmitt, donde el modo común es Vref, y para el seguidor de REF (2,5 V). Es un caso típico de «el contrato lo rompe la interfaz»: cada bloque funciona, el problema aparece en la unión.

03 · Diseño

Bloque por bloque, con las cuentas

3.1 La fuente

Un adaptador de 9 V a un 7805. El consumo total de la placa es del orden de 6 mA en reposo (Iq del 7805 de 5 mA, más el INA y los operacionales) y de 45 mA con la alarma activa (buzzer 30 mA, LED 9 mA, base 4 mA). La disipación es mínima: (9 − 5) × 0,05 A = 0,2 W, sin disipador. Con 100 µF y 100 nF en la entrada y la salida (Tema 28) y un 100 nF más pegado a cada circuito integrado.

3.2 El puente: que la salida suba con la temperatura

En el Tema 26 el NTC iba abajo y la salida bajaba al subir la temperatura. Para una alarma conviene lo contrario (ON cuando la señal sube), así que acá el NTC va arriba: VB = 5 V · 10 kΩ/(10 kΩ + Rx), que sube con la temperatura. La rama de referencia es un divisor de 10 kΩ y 10 kΩ (2,5 V). Es el cambio más barato del proyecto y evita invertir luego la señal. El NTC disipa 0,60 mW a 35 °C: unos 0,4 °C de autocalentamiento (con 1,5 mW/°C en aire quieto), un error sistemático que absorbe la calibración.

3.3 El INA: G = 1,5 y REF = 2,5 V

La diferencia del puente va de −1354 mV (0 °C) a +1180 mV (50 °C): 2,53 V de excursión. Se busca una salida de unos 0,1 a 4,9 V alrededor de 2,5 V. La ganancia máxima para no salirse de la ventana de ±2,4 V es 2,4/1,354 = 1,77; se elige G = 1,5 para dejar margen (con el INA no se opera cerca de los rieles). Con un INA de la familia INA333, G = 1 + 100 kΩ/Rg (confirmá el valor en la hoja de tu modelo): Rg = 200 kΩ. La salida es VINA = 2,5 + 1,5·Vdif, de 0,47 V a 4,27 V: 96 a 874 cuentas de un ADC de 10 bits. El pin REF se alimenta con un seguidor (Tema 25) desde un divisor de 10k/10k; así, la salida es ratiométrica con la alimentación (Tema 28): si los 5 V cambian, también cambian REF y el puente, y la lectura en cuentas, no.

3.4 El filtro y el seguidor

La temperatura varía en segundos, así que se muestrea a 10 Hz y el pasa-bajos se pone a una década: fc = 1/(2π · 150 kΩ · 1 µF) = 1,06 Hz (Tema 26). Un RC de 150 kΩ no puede alimentar un ADC (la entrada de un ADC de microcontrolador pide una fuente de impedancia menor que unos 10 kΩ) ni el R1 del Schmitt, de modo que va seguido de un seguidor. Con esa fc el ruido térmico del analógico es de decenas de nanovoltios y el límite lo pone la cuantización del ADC (Tema 27): 4,9 mV por cuenta, es decir 0,066 °C a 35 °C.

3.5 El Schmitt

Se explica en la sección siguiente, porque es el corazón del proyecto.

3.6 El driver

El buzzer activo (30 mA) y el LED con 330 Ω (9 mA) cuelgan del colector de un NPN. La corriente total es de 39 mA; con una ganancia forzada de 10 hacen falta 3,9 mA de base. La salida del LM358 en alto llega a unos 3,5 V: Rb = (3,5 − 0,7)/3,9 mA = 718 Ω → 680 Ω (E12), que da 4,1 mA y satura firme. Un buzzer piezoeléctrico activo no necesita diodo de rueda libre; si se usa un zumbador electromagnético, un diodo en antiparalelo es obligatorio (Tema 29).

04 · Los umbrales

El Schmitt: ON a 35 °C y OFF a 33 °C

La cadena entrega 3,294 V a 35 °C y 3,143 V a 33 °C: una banda eléctrica de 0,151 V. Con un Schmitt no inversor (la señal entra por R1 al nodo + y la referencia al −), los umbrales del Tema 20 son:

  1. 1
    Excursión de la salida.

    El LM358 con 5 V entrega unos 3,5 V en alto (VALTO) y unos 0,05 V en bajo (VBAJO): 3,45 V.

  2. 2
    Relación de resistores.

    R1/Rf = 0,151/3,45 = 0,0438. Con R1 = 10 kΩ y Rf = 220 kΩ (E12) resulta 0,0455: histéresis de 0,157 V, es decir 2,07 °C.

  3. 3
    Referencia.

    Con la salida en BAJO, el umbral de subida es Vref·1,0455 − 0,05·0,0455 = 3,294 → Vref = 3,153 V. Se obtiene de un divisor de los 5 V: 4,7 kΩ + preset de 2 kΩ (10 vueltas) + 10 kΩ (sale entre 2,99 y 3,59 V), con el cursor del preset al 26,5 %. Ajustar el preset a 1 mV mueve el umbral 0,014 °C.

  4. 4
    Resultado.

    Con el cursor del preset en 26,5 % la alarma enciende a 35,00 °C y apaga a 32,93 °C (banda de 2,07 °C). Con el cursor en 26,35 % (el valor que usa el simulador en la unidad ideal) son 34,98 y 32,91 °C: una variación de 0,15 % del recorrido mueve el umbral 0,02 °C.

Salida analógica

0,47 → 4,27 V

0 °C → 0,47 V (96 cuentas); 25 °C → 2,50 V (512); 35 °C → 3,29 V (674); 50 °C → 4,27 V (874). Sensibilidad de 83 mV/°C a 25 °C y 74,5 mV/°C a 35 °C.

Alarma

ON 35 / OFF 33

La banda de 0,157 V es 3 000 veces el ruido térmico del analógico y unas 3 veces la cuantización del ADC. Ratiométrica con la alimentación: el divisor del Vref sale de los mismos 5 V que el puente.

05 · Tolerancias

¿Cuánto error aguanta? Monte Carlo en la cabeza

La alarma debe encender a 35 ± 1 °C en cada unidad construida, no solo en la que calculamos. Cada componente tiene una tolerancia y el umbral resulta de combinarlas. El método más honesto para saber qué clase de componentes hacen falta no es sumar errores en el peor caso (pesimista), sino simular miles de placas con componentes elegidos al azar dentro de su tolerancia y mirar cómo se distribuye la temperatura de encendido.

Los parámetros que varían: los tres resistores del puente y los dos del divisor de REF (±tol), R0 y B del NTC, Rg, R1 y Rf del Schmitt, los tres del divisor de Vref y los niveles de salida del comparador (VALTO ±0,2 V, VBAJO ±0,03 V). Resultado de 2000 unidades por clase, sin calibrar:

Temperatura de encendido de la alarma (consigna 35 °C) según la tolerancia de los componentes (Monte Carlo de 2000 unidades por fila; NTC con B 0,5 %, 1 % y 2 %).
Resistores / R0 del NTCMediaσMínimo – máximoDentro de ±1 °CBanda ON − OFF
0,1 %34,98 °C0,05 °C34,84 – 35,12 °C100 %2,07 ± 0,07 °C
1 %34,99 °C0,34 °C33,86 – 36,01 °C99,8 %2,07 ± 0,07 °C
5 %35,03 °C1,72 °C29,31 – 41,48 °C43,7 %2,08 ± 0,12 °C

Tres conclusiones. Con resistores de 1 % y un NTC de 1 %, casi todas las unidades caen dentro de ±1 °C sin ningún ajuste: el requisito se cumple solo con componentes baratos y comunes. Con 5 % el 56 % de las unidades fallan y algunas quedan a 6 °C: no sirve sin ajuste. Y la banda (la histéresis) casi no varía (2,07 ± 0,1 °C) incluso con 5 %: depende de una relación de resistores y de la excursión de la salida, un resultado que ya vimos en los Temas 20 y 29: la histéresis es robusta y el centro es frágil.

Contribuciones al error del umbral con componentes de 1 % (orden de magnitud en °C, a 35 °C).
Fuente de errorEfectoSe corrige con
R0 del NTC (1 %)± 0,24 °C (offset)Preset (un punto)
B del NTC (1 %)± 0,10 °C a 35 °C; ± 0,23–0,27 °C en 0 y 50 °CCalibrar en dos puntos para el rango completo
Resistores del puente (1 %)± 0,2 a 0,3 °C cada uno (offset)Preset
Autocalentamiento del NTC+ 0,40 °C (sistemático)Calibrar con el equipo ya armado; excitación menor
Vref del Schmitt (1 %)± 0,5 °C por cada 1 % de VrefPreset: es justamente el ajuste
VALTO del comparador (±0,2 V)± 0,1 °C sobre el umbral OFF (no sobre el ON)Nada: afecta la banda
Deriva con la temperatura de la placaDecenas de mK/°CMedir lejos de fuentes de calor

06 · Calibración

Calibración con un preset

El preset del divisor de Vref es el único ajuste del proyecto. Calibrar significa llevar el umbral de encendido a 35,0 °C medidos con una referencia. Un preset no es una trampa: es una variable de diseño que absorbe de golpe las tolerancias de todo lo que está antes. Con el preset, el Monte Carlo muestra que la temperatura de encendido de las 2000 unidades queda en 35,00 °C (por construcción) y la de apagado en 32,92 ± 0,07 °C (1 %); con resistores de 5 % el 10 % de las unidades no alcanza a compensarse dentro del recorrido del preset.

  1. 1
    Un baño estable cerca de 35 °C.

    Agua tibia en un vaso térmico, mezclada con una cuchara, junto a un termómetro de referencia (de laboratorio o clínico, de ±0,1 °C). No hace falta un baño termostatizado: se espera a que ambas lecturas se estabilicen.

  2. 2
    Sumergir el NTC (con el cable aislado) y bajar la temperatura.

    Se parte con el agua más caliente (36–37 °C) y se deja enfriar lentamente. La alarma suena y debe apagarse cerca de 33 °C.

  3. 3
    Ajustar el preset para el encendido.

    Con el agua subiendo (o con una resistencia calentando suavemente), se gira el preset hasta que la alarma se encienda justo cuando el termómetro marca 35,0 °C. Si no se logra, el recorrido del preset no alcanza: hay que revisar un componente.

  4. 4
    Verificar en otros puntos.

    Hielo y agua (0 °C, un patrón gratis) para comprobar la salida analógica: 0,47 V. A 25 °C (ambiente) debe dar 2,50 V. Si la salida analógica difiere más de 20 mV de lo esperado, ajustar el offset por software o revisar el puente.

La calibración en un punto fija el offset: toda la tolerancia de R0 y de los resistores. La pendiente —la tolerancia de B y de Rg— queda sin corregir, y por eso la salida analógica de la lectura puede apartarse unas décimas de grado en los extremos del rango (0,25 °C a 0 °C y 50 °C, con B de 1 %). Para una lectura precisa en todo el rango, dos puntos (hielo y 35 °C) y la fórmula Beta inversa del Tema 26.

07 · Con microcontrolador

La misma estación con un ADC y software

La salida del seguidor (0,47–4,27 V) está pensada para un ADC de 10 bits y 5 V (por ejemplo, el de una placa de desarrollo común). Con ella, el Schmitt analógico puede reemplazarse por software, y se gana la linealización y la calibración de dos puntos:

Conversión a grados
Cuentas → VINA = cuentas/1023 · 5 V → Vdif = (VINA − 2,5)/1,5 → VB = 2,5 + Vdif → Rx = 10 kΩ · (5 − VB)/VB → temperatura con la fórmula Beta inversa (Tema 26). La resolución es de 0,06 a 0,07 °C por cuenta.
Histéresis por software
La misma lógica del Tema 20: un estado que enciende al superar 35 °C y apaga al bajar de 33 °C. Los umbrales son constantes en el código, ajustables sin soldar. La banda se elige igual que antes: mayor que el ruido.
Promedio y filtro
Un promedio de 16 muestras a 10 Hz (1,6 s) reduce el ruido de cuantización en 4 veces y se puede sincronizar con la red (Tema 27). El RC de 1 Hz sigue haciendo falta contra el aliasing.
Validación y falla segura
Un valor fuera de 50–980 cuentas es una falla de sensor: alarma activa. Un microcontrolador tiene además un watchdog: si el programa se cuelga, la salida debe caer a un estado seguro.
Qué se pierde
La alarma analógica funciona sin código, sin reinicios y sin cuelgues: por eso se la conserva como protección independiente aun cuando el software haga el control principal.

08 · Materiales

Lista de materiales y consumo

Materiales aproximados (todo de serie E12/E24, tolerancia 1 % salvo indicación).
ÍtemDetalle
NTC 10 kΩ (B = 3950) y resistores de 10 kΩ ×6Puente (NTC y 3 de 10k), divisores de REF (2 de 10k) y del Vref (1 de 10k)
INA de alimentación simple tipo INA333 + Rg de 200 kΩG = 1,5
Cuádruple operacional rail-to-railSeguidores de REF y de salida del filtro; el Schmitt puede ir en un LM358
LM358 (mitad como Schmitt)R1 = 10 kΩ, Rf = 220 kΩ
Filtro y divisor de Vref150 kΩ + 1 µF; 4,7 kΩ + preset multivuelta de 2 kΩ + 10 kΩ
NPN de pequeña señal (2N2222/BC337), R 680 Ω, R 330 ΩDriver del buzzer y el LED
Buzzer activo de 5 V y LEDAlarma sonora y visual
7805, adaptador de 9 V, condensadores100 µF ×2, 100 nF ×6 (uno por circuito integrado y los de la fuente)

Consumo: ≈ 6 mA en reposo y ≈ 45 mA con la alarma activa. Con una pila de 9 V de 500 mAh duraría unas 80 horas en reposo (el 7805 se come casi todo con sus 5 mA, Tema 28): para uso portátil, un LDO de bajo consumo; para uso fijo, el adaptador. El presupuesto de componentes está en el orden de unos pocos dólares.

09 · Puesta en marcha

Probar nodo por nodo, de la fuente a la salida

Un proyecto de seis bloques que no anda tiene seis lugares donde buscar. Probarlo entero es depurar todo junto. La secuencia es de aguas arriba a aguas abajo, con un multímetro y los valores esperados calculados antes (el gemelo digital de la sección 11):

Valores esperados en cada nodo (ambiente a 25 °C y con el NTC a 35 °C, que se logra con los dedos).
PasoNodo25 °C35 °CSi no coincide
1Salida del 78055,00 V5,00 VFuente, polaridad, condensadores
2Rama de referencia (VA y REF)2,50 V2,50 VDivisores de 10k, seguidor
3VB (puente)2,50 V3,03 VNTC, fija de 10k, cableado
4Salida del INA2,50 V3,29 VRg, REF, alimentación del INA
5Salida del seguidor del filtro2,50 V3,29 V (tras unos segundos)RC, seguidor, condensador
6Vref (nodo − del Schmitt)3,15 V3,15 VDivisor y preset
7Salida del Schmitt≈ 0,05 V (apagada)≈ 3,5 V si se cruzó 35 °CR1, Rf, Vref
8Base y colector del NPN (sin buzzer)0 V / 5 V0,7 V / ≈ 0,1 V (saturado)Rb, transistor al revés
9Con buzzer y LEDSilencioSuena y se enciendePolaridad del buzzer, LED

La regla de depuración: si un nodo miente, el problema está antes de él, no después. Con el puente en el nodo 3 y el INA en el 4, la relación (VINA − 2,5) = 1,5 · (VB − 2,5) verifica la ganancia sin importar la temperatura. Además, el ADC debe devolver 512 ± 5 cuentas con 2,50 V.

Síntomas típicos y su causa.
SíntomaCausa probableDónde mirar
Salida del INA pegada a un rielREF mal alimentado, Rg mal, o entradas flotantesNodos 2 y 3, soldaduras
La lectura se corre cuando suena el buzzerCaída de la alimentación o masa compartidaEstrella de masas, desacople (Tema 28)
La alarma tabletea cerca de 35 °CSin realimentación positiva, o ruido mayor que la bandaRf y R1, blindaje (Tema 27)
La alarma no apaga nuncaRealimentación mal conectada (queda enclavada), o Vref desajustadoNodo 6 y 7
Enciende a 30 o 40 °CVref o NTC fuera de toleranciaPreset (sección 6)
Cambia con la mano cercaAcoplo capacitivo en un nodo de impedancia alta (el RC de 150 kΩ)Seguidor cerca del RC, cables cortos

10 · Simuladores

Dos experimentos: el gemelo digital y el Monte Carlo

El primero es el gemelo digital de la placa: movés la temperatura y ves la tensión en cada nodo, los umbrales del Schmitt, el estado de la alarma con su memoria y el cruce de histéresis. El segundo fabrica 200 placas con componentes aleatorios y muestra cómo se distribuye la temperatura de encendido, con y sin calibración.

SIMULADOR 31

Gemelo digital de la estación

V_INA = 2,5 + 1,5·(V_B − 2,5)

Salida del filtro frente a la temperatura Curva de la tensión de salida del filtro entre 0 y 50 grados, con los dos umbrales del disparador de Schmitt como líneas punteadas, los cruces de encendido y apagado y un punto en la temperatura elegida. TENSIÓN DE SALIDA vs TEMPERATURA · PUNTEADO = UMBRALES ON Y OFF DEL SCHMITT
Rx del NTC / VB10,0 kΩ / 2,500 V
Salida del INA y del filtro2,500 V
Cuentas del ADC (10 bits)512
Umbrales del Schmitt (ON / OFF)3,294 / 3,136 V
Enciende a / apaga a34,98 / 32,91 °C
Alarma (con memoria)Apagada

Recorrido guiado (12 minutos)

  1. 1
    Pestaña ①, «Ambiente, 25 °C».

    El NTC vale 10 kΩ, VB = 2,500 V, la salida es 2,500 V y el ADC marca 512 cuentas. Los umbrales del Schmitt están en 3,294 V (ON) y 3,136 V (OFF): lejos. La alarma está apagada.

  2. 2
    Pasá a «Con los dedos, 35 °C».

    El NTC baja a 6,5 kΩ, VB = 3,03 V, la salida 3,29 V y 674 cuentas: justo en el umbral de encendido. La alarma se enciende al cruzar 34,98 °C.

  3. 3
    Apretá «Barrido 25 → 45 → 25 °C».

    La temperatura sube y la alarma enciende a 35 °C; al bajar, no apaga a 35 sino a 33 °C: la memoria del Schmitt. Entre 33 y 35 °C el mismo valor de temperatura da dos estados según la historia.

  4. 4
    Pasá a «Hielo, 0 °C».

    Rx = 33,6 kΩ, la salida es 0,469 V (96 cuentas): lo que se verifica con agua y hielo en la puesta en marcha.

  5. 5
    Pasá a «Unidad con resistores de 5 %».

    Un ejemplar de la clase de 5 % tiene sus umbrales desplazados: la alarma enciende unos 3 °C antes de lo debido (a ≈ 32 °C en lugar de 35 °C). Mirá «Enciende a / apaga a».

  6. 6
    Pasá a «La misma, calibrada».

    Con el preset ajustado, la unidad enciende a 35,0 °C. La banda con OFF a unos 33 °C se mantiene casi igual.

  7. 7
    Pestaña ②, «Resistores de 1 %».

    El histograma de 200 placas es una campana de σ ≈ 0,3 °C centrada en 35 °C, con casi todas dentro de la franja sombreada: se cumple ±1 °C sin ajustar nada.

  8. 8
    Pasá a «Resistores de 5 %».

    La campana se ensancha 5 veces: σ ≈ 1,7 °C, unidades a 6 °C de la consigna y menos de la mitad dentro de ±1 °C. Es el caso donde el preset deja de ser opcional.

  9. 9
    Pasá a «5 %, calibradas».

    Todas las que se pueden ajustar quedan clavadas en 35,0 °C; las que no (el contador «Fuera del recorrido del preset») son las que tienen componentes tan desviados que el preset no alcanza.

  10. 10
    Pasá a «Resistores de 0,1 %».

    La campana se angosta a σ ≈ 0,05 °C: con componentes de precisión no hace falta el preset. Cuesta más: la elección es económica, no técnica.

Preguntas para pensar

  1. En ①, ¿a qué temperatura enciende y a cuál apaga la unidad ideal? ¿Qué cuentas del ADC corresponden?
  2. En ②, ¿qué tolerancia mínima hace falta para cumplir ±1 °C sin calibrar en la gran mayoría de las unidades?
  3. En ②, ¿por qué la banda ON − OFF casi no cambia entre 0,1 % y 5 %?
  4. En ②, con 5 % y calibradas, ¿qué unidades quedan sin poder ajustarse y qué se hace con ellas?
Ver respuestas sugeridas
  1. Enciende a 34,98 °C y apaga a 32,91 °C. Las cuentas correspondientes son 674 (3,294 V) y 642–643 (3,136–3,143 V).
  2. 1 %: el 99,8 % queda dentro de ±1 °C con σ de 0,34 °C. Con 5 % el 56 % falla. La clase de 1 % es la que da el equilibrio de costo y exactitud.
  3. Porque depende del cociente R1/Rf (que varía poco) y de la excursión de la salida del comparador, no del valor absoluto de las referencias. Lo que se desplaza con las tolerancias es el centro de la banda, no su ancho.
  4. Las que tienen sus resistores tan desviados que el Vref necesario cae fuera del recorrido del preset (de 3,0 a 3,6 V). Se descartan o se reemplaza algún resistor; con 5 % son alrededor del 10 %.

11 · En código

El gemelo digital, los umbrales y el Monte Carlo en Python

Cuatro herramientas: el gemelo digital de todos los nodos con los valores de la puesta en marcha, el cálculo de los umbrales y el driver, el Monte Carlo de las tolerancias con la calibración, y la variante con microcontrolador.

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 gemelo digital

import math
import random
import statistics

B, R0, VS = 3950.0, 10000.0, 5.0
G, REF, ADC_BITS = 1.5, 2.5, 10


def rx_ntc(t_c, r0=R0, b=B):
    return r0 * math.exp(b * (1 / (t_c + 273.15) - 1 / 298.15))


def estacion(t_c):
    rx = rx_ntc(t_c)
    vb = VS * 10000 / (10000 + rx)                      # NTC arriba: la tensión sube con T
    dif = vb - VS / 2
    v_ina = REF + G * dif
    cuentas = round(v_ina / VS * (2 ** ADC_BITS - 1))
    return rx, vb, dif, v_ina, cuentas


print("  T    Rx      Vb      dif      V_INA   cuentas")
for t in (0, 10, 20, 25, 30, 33, 35, 37, 40, 50):
    rx, vb, dif, v, c = estacion(t)
    print(f"{t:3d}  {rx / 1000:5.2f}k  {vb:6.3f}  {dif * 1000:+7.1f}  {v:6.3f} V  {c:4d}")

print()
print("Sensibilidad y resolución del ADC de 10 bits (5 V):")
for t in (25, 33, 35):
    s = estacion(t + 0.5)[3] - estacion(t - 0.5)[3]
    print(f"  {t} C: {s * 1000:5.1f} mV/C -> {VS / 1024 / s:.3f} C por cuenta")
rx35 = rx_ntc(35)
p_mw = (VS - estacion(35)[1]) ** 2 / rx35 * 1000
print(f"Autocalentamiento del NTC a 35 C: {p_mw:.2f} mW -> {p_mw / 1.5:.2f} C con 1,5 mW/C")

La tabla de la sección 4 sale de acá: 0 °C → 0,469 V (96 cuentas); 25 °C → 2,500 V (512); 33 °C → 3,143 V; 35 °C → 3,294 V (674); 50 °C → 4,270 V (874). La sensibilidad es de 83 mV/°C a 25 °C y 74,5 mV/°C a 35 °C, es decir 0,06–0,07 °C por cuenta; y el NTC se autocalienta 0,40 °C a 35 °C. Probá estacion(37).

Paso 2: los umbrales y el driver

V_ALTO, V_BAJO = 3.5, 0.05
v_on, v_off = estacion(35)[3], estacion(33)[3]
print(f"cadena: 35 C = {v_on:.3f} V | 33 C = {v_off:.3f} V | banda {v_on - v_off:.3f} V")

k_ideal = (v_on - v_off) / (V_ALTO - V_BAJO)
R1, RF = 10e3, 220e3
k = R1 / RF
print(f"R1/Rf ideal {k_ideal:.4f}; con 10k/220k = {k:.4f} -> histéresis {k * (V_ALTO - V_BAJO):.3f} V")

vref = (v_on + V_BAJO * k) / (1 + k)                    # umbral de subida con la salida en BAJO
print(f"Vref necesaria: {vref:.3f} V")
x = (vref / VS * (4.7e3 + 2e3 + 10e3) - 10e3) / 2e3     # posición del cursor del preset (0 a 1)
print(f"divisor 4,7k + preset 2k + 10k: cursor al {x:.1%} (rango {VS * 10e3 / 16.7e3:.2f} a {VS * 12e3 / 16.7e3:.2f} V)")

sube = vref * (1 + k) - V_BAJO * k
baja = vref * (1 + k) - V_ALTO * k


def temp_de(v):
    lo, hi = -20.0, 80.0
    for _ in range(60):
        m = (lo + hi) / 2
        lo, hi = (m, hi) if estacion(m)[3] < v else (lo, m)
    return (lo + hi) / 2


print(f"umbrales {sube:.3f} V y {baja:.3f} V -> enciende a {temp_de(sube):.2f} C, apaga a {temp_de(baja):.2f} C")
print(f"un milivolt de Vref mueve el umbral {(1 + k) * 1e-3 / (estacion(35.5)[3] - estacion(34.5)[3]):.3f} C")

corriente = 30 + (5 - 2) / 330 * 1000                   # buzzer + LED, en mA
ib = corriente / 10                                      # ganancia forzada de 10
print(f"driver: Ic = {corriente:.0f} mA, Ib = {ib:.1f} mA, Rb ideal = {(V_ALTO - 0.7) / ib * 1000:.0f} ohm, con 680 ohm Ib = {(V_ALTO - 0.7) / 680 * 1000:.1f} mA")
print(f"falla segura: NTC abierto -> V_INA = {REF + G * (VS - VS / 2):.2f} V (satura y suena) | en corto -> {REF + G * (0 - VS / 2):.2f} V (silencio: hay que supervisarlo)")

R1/Rf ideal 0,0438, con 10 kΩ/220 kΩ 0,0455 y una histéresis de 0,157 V (2,07 °C). Vref = 3,153 V, con el cursor del preset al 26,5 %. Los umbrales de 3,294 V y 3,137 V dan encendido a 35,00 °C y apagado a 32,93 °C; cada milivolt de Vref mueve el umbral 0,014 °C. El driver necesita 39 mA de colector y 3,9 mA de base: 680 Ω da 4,1 mA. Y el NTC abierto satura el INA (suena), pero en corto da −1,25 V → 0 V (silencio).

Paso 3: Monte Carlo y calibración

def u(tol):
    return 1 + random.uniform(-tol, tol)


def unidad(tol_r, tol_b):
    return dict(ra1=1e4 * u(tol_r), ra2=1e4 * u(tol_r), rf=1e4 * u(tol_r), rr1=1e4 * u(tol_r), rr2=1e4 * u(tol_r),
                r0=1e4 * u(tol_r), b=3950 * u(tol_b), rg=200e3 * u(tol_r),
                k_r1=1e4 * u(tol_r), k_rf=220e3 * u(tol_r), pa=4.7e3 * u(tol_r), pb=10e3 * u(tol_r), pp=2e3 * u(tol_r),
                vh=3.5 + random.uniform(-0.2, 0.2), vl=0.05 + random.uniform(-0.03, 0.03), x=0.2635)


def salida(d, t):
    rx = d["r0"] * math.exp(d["b"] * (1 / (t + 273.15) - 1 / 298.15))
    vb = VS * d["rf"] / (d["rf"] + rx)
    va = VS * d["ra2"] / (d["ra1"] + d["ra2"])
    ref = VS * d["rr2"] / (d["rr1"] + d["rr2"])
    return ref + (1 + 100e3 / d["rg"]) * (vb - va)


def umbrales(d):
    k = d["k_r1"] / d["k_rf"]
    vref = VS * (d["pb"] + d["x"] * d["pp"]) / (d["pa"] + d["pp"] + d["pb"])
    return vref * (1 + k) - d["vl"] * k, vref * (1 + k) - d["vh"] * k


def temperatura(d, v):
    lo, hi = -20.0, 80.0
    for _ in range(40):
        m = (lo + hi) / 2
        lo, hi = (m, hi) if salida(d, m) < v else (lo, m)
    return (lo + hi) / 2


def calibrar(d, objetivo=35.0):
    lo, hi = 0.0, 1.0
    for _ in range(30):
        d["x"] = (lo + hi) / 2
        lo, hi = (lo, d["x"]) if temperatura(d, umbrales(d)[0]) > objetivo else (d["x"], hi)
    return abs(temperatura(d, umbrales(d)[0]) - objetivo) < 0.05


random.seed(31)
N = 300
print("tolerancia   sin calibrar: media  sigma  min-max          dentro de ±1 C | calibradas: encienden  apagan  sin rango")
for nombre, tr, tb in (("0,1 %", 0.001, 0.005), ("1 %", 0.01, 0.01), ("5 %", 0.05, 0.02)):
    ons, bandas, ons_c, offs_c, sin_rango = [], [], [], [], 0
    for _ in range(N):
        d = unidad(tr, tb)
        von, voff = umbrales(d)
        a, b = temperatura(d, von), temperatura(d, voff)
        ons.append(a)
        bandas.append(a - b)
        if calibrar(d):
            von, voff = umbrales(d)
            ons_c.append(temperatura(d, von))
            offs_c.append(temperatura(d, voff))
        else:
            sin_rango += 1
    dentro = sum(abs(x - 35) <= 1 for x in ons) / N * 100
    print(f"{nombre:6s}      {statistics.fmean(ons):6.2f}  {statistics.pstdev(ons):5.2f}  {min(ons):5.2f}-{max(ons):5.2f}   {dentro:5.1f} %"
          f"          {statistics.fmean(ons_c):6.2f}   {statistics.fmean(offs_c):6.2f}   {sin_rango:3d} de {N}")

Con 1 % la temperatura de encendido tiene σ ≈ 0,33 °C y el 99,7 % queda dentro de ±1 °C; con 5 %, σ ≈ 1,73 °C y solo el 45 %. Con el preset, todas las que se pueden ajustar encienden en 35,00 °C y apagan cerca de 32,9 °C (con 5 %, unas 32 de 300 no alcanzan a ajustarse). Los números exactos varían unas centésimas con la semilla y con N (acá 300 unidades por clase, para que el navegador lo resuelva rápido; en las tablas de la sección 5 son 2000).

Paso 4: la variante con microcontrolador

def cuentas_a_temperatura(cuentas):
    v_ina = cuentas / (2 ** ADC_BITS - 1) * VS
    vb = REF + (v_ina - REF) / G
    rx = 10000 * (VS - vb) / vb
    return 1 / (1 / 298.15 + math.log(rx / R0) / B) - 273.15


print("ADC -> temperatura (fórmula Beta inversa):")
for c in (96, 512, 643, 674, 874):
    print(f"  {c:4d} cuentas -> {cuentas_a_temperatura(c):6.2f} C")

print("Error por cuantización del ADC (redondeo) en la lectura:")
peor = 0.0
for t in range(0, 51):
    c = estacion(t)[4]
    peor = max(peor, abs(cuentas_a_temperatura(c) - t))
print(f"  máximo {peor:.3f} C en 0-50 C")


class Alarma:
    def __init__(self, on=35.0, off=33.0):
        self.on, self.off, self.activa = on, off, False

    def actualizar(self, t_c, cuentas):
        if not 50 < cuentas < 980:                      # sensor abierto o en corto
            self.activa = True
        elif t_c > self.on:
            self.activa = True
        elif t_c < self.off:
            self.activa = False
        return self.activa


al = Alarma()
secuencia = [30, 33.5, 34.5, 35.5, 36, 35, 34, 33.5, 32.5, 30]
print("T:", secuencia)
print("alarma:", [int(al.actualizar(cuentas_a_temperatura(estacion(t)[4]), estacion(t)[4])) for t in secuencia])
print("sensor abierto (1023 cuentas):", al.actualizar(0, 1023), "| en corto (0 cuentas):", al.actualizar(0, 0))

La inversión de la cadena devuelve 0 °C → 96 cuentas, 25 °C → 512, 35 °C → 674, 50 °C → 874, y el error de redondeo del ADC es de unos 0,03 a 0,04 °C como máximo. La alarma por software repite la histéresis: enciende al pasar de 35 °C, se mantiene entre 33 y 35 y apaga bajo 33 °C. Y como valida el rango del ADC, el sensor abierto o en corto activa la alarma, algo que el circuito analógico solo hace con el abierto.

12 · Analogía de programador

Un deploy por etapas, con contratos y feature flags

El mismo oficio, en dos mundos.
En softwareEn la estación
Microservicios con contratos de API (tipos, rangos, tiempos)Bloques con contratos de nodo: rango y impedancia que entrega y que admite el siguiente
Un test de integración falla en la interfaz entre dos servicios correctosEl seguidor del LM358 que no admite 4,27 V: cada bloque anda, la unión no
El entorno de staging con datos conocidosEl gemelo digital: valores esperados por nodo, a comparar con el multímetro
Depurar de aguas arriba a aguas abajo (logs por etapa del pipeline)Probar fuente → puente → INA → filtro → Schmitt → driver
Un feature flag o parámetro de configuración que absorbe diferencias de entornoEl preset: ajusta Vref y absorbe las tolerancias de todo lo anterior
Fuzzing o pruebas con datos aleatorios para ver la distribución de resultadosEl Monte Carlo: mil placas con componentes al azar, no solo el caso nominal
Un SLO con tolerancia explícita («p99 < 300 ms»)La especificación ±1 °C: define cuánta precisión pagar
Un circuit breaker independiente de la lógica principalLa alarma analógica que sigue funcionando aunque el software se cuelgue

La fila del Monte Carlo es la más valiosa: diseñar con valores nominales es como probar con un solo dato de entrada. Un diseño que funciona en el caso nominal y falla en el 5 % de las unidades construidas tiene el defecto de los sistemas que se prueban solo en el happy path.

13 · Comprensión

Confusiones frecuentes

«Si cada bloque anda, el proyecto anda»

Los proyectos fallan en las uniones: un seguidor que no admite el rango, un RC de 150 kΩ que alimenta un ADC, una referencia que depende de una alimentación distinta. Se escribe y se verifica el contrato de cada nodo.

«Un preset es hacer trampa»

Es la herramienta de ingeniería que absorbe las tolerancias de todo lo que está antes de él. Con resistores de 5 % es indispensable; con 1 % mejora de ±0,34 a ±0,0 °C el punto de encendido. Lo que no se puede es calibrar sin una referencia confiable.

«Con componentes de 1 % se puede sumar los errores en el peor caso»

Sumar linealmente todos los peores casos es pesimista y encarece el diseño. Para ver si se cumple un requisito en una producción se simula la distribución (Monte Carlo) o se suman en cuadratura los errores independientes.

«Calibrar es ajustar un punto y listo»

Un punto fija el offset; la pendiente (B del NTC, Rg) queda sin corregir. Para leer bien en todo el rango, dos puntos (hielo y 35 °C) y la fórmula Beta, y una verificación en un tercero.

«La alarma analógica es mejor que la de software (o al revés)»

Cada una cubre fallas distintas. La analógica sigue funcionando sin código; la de software valida el rango del sensor y se reconfigura sin soldar. Para una función de seguridad conviene tener las dos.

«El buzzer se conecta directo a la salida del comparador»

El LM358 entrega unos 20 mA y el buzzer pide 30. Un transistor con una resistencia de base calculada (680 Ω) y, si hay bobina, un diodo de rueda libre.

«Si la alarma tabletea, hay que cambiar el comparador»

Tabletea porque la banda es menor que el ruido, no por el chip. Se revisa la realimentación positiva (R1 y Rf), el ruido del nodo (Tema 27) y la alimentación (Tema 28), no el componente.

14 · Práctica guiada

Ejercicios de integración

Ejercicio 1: una alarma a 40 °C

Cambiá la especificación a ON a 40 °C y OFF a 38 °C, con el mismo hardware. Calculá los umbrales con estacion() y el nuevo Vref. ¿Entra en el recorrido del preset?

Ver solución razonada

VINA(40 °C) = 3,651 V y VINA(38 °C) ≈ 3,50 V (banda de ≈ 0,15 V). Vref = (3,651 + 0,05·0,0455)/1,0455 ≈ 3,495 V: dentro del recorrido de 3,0 a 3,6 V del preset, pero cerca del extremo; conviene rebalancear el divisor (4,7 kΩ → 4,3 kΩ). Y el modo común del LM358 (3,5 V) queda al límite: ya se necesita un comparador rail-to-rail.

Ejercicio 2: resolución del ADC

La salida va de 0,47 a 4,27 V en un ADC de 10 bits y 5 V. ¿Cuántas cuentas por grado en promedio y a 35 °C? ¿Y con un ADC de 12 bits?

Ver solución razonada

Promedio: (874 − 96)/50 = 15,6 cuentas/°C; a 35 °C: 74,5 mV/°C / 4,88 mV = 15,3 cuentas/°C (0,066 °C por cuenta). Con 12 bits, 4 veces más (61 cuentas/°C, 0,016 °C por cuenta); no hace falta: el NTC de 1 % y el autocalentamiento (0,4 °C) limitan antes.

Ejercicio 3: puesta en marcha

La placa recién armada marca 0 V en la salida del INA con el NTC a temperatura ambiente. ¿Qué nodo medís primero y qué deducís de cada posible lectura?

Ver solución razonada

Primero la alimentación del INA (5 V) y luego REF (2,50 V). Si REF está en 0 V, la salida se pega abajo: seguidor de REF sin alimentar o divisor mal. Si REF es 2,50 V y VB también, el INA debería dar 2,50 V: el defecto está en el INA (Rg abierta es G = 1, no 0 V) o en una alimentación invertida. Se prueba de aguas arriba a aguas abajo.

Ejercicio 4: presupuesto de error

Sin calibrar, con componentes de 1 %, el umbral de encendido tiene σ ≈ 0,34 °C. ¿Qué fracción cae a más de 1 °C de 35? ¿Qué pasa con σ = 0,6 °C?

Ver solución razonada

Con distribución aproximadamente normal, ±1 °C son ±2,9σ con σ = 0,34: menos del 0,5 % queda fuera (el Monte Carlo da 0,2 %). Con σ = 0,6, ±1 °C son ±1,67σ: ≈ 10 % queda fuera. Esa es la forma de decidir el costo: 1 % de tolerancia cumple, 2–3 % ya compromete un 10 %.

Ejercicio 5: falla segura

El cable del NTC se corta (abierto). ¿Qué hace la alarma analógica? ¿Y si el NTC se pone en corto? ¿Cómo lo resolvés con hardware y con software?

Ver solución razonada

Abierto: VB = 5 V, la salida del INA satura alta (≈ 4,9 V), por encima de Vref: la alarma suena (lo correcto). En corto: VB = 0, la salida cae a ≈ 0 V y la alarma se apaga y calla (lo incorrecto). Hardware: un comparador de ventana que active la alarma si la salida sale de 0,2–4,6 V. Software: la validación de rango del ADC (50 a 980 cuentas) del paso 4.

Ejercicio 6: diagnosticar síntomas

(a) La alarma enciende a 38 °C en una placa y a 32 °C en otra. (b) La salida analógica salta unos 20 mV cada vez que suena el buzzer. (c) La alarma enciende y apaga cada pocos segundos a 35 °C. (d) La salida del INA marca bien a 25 °C pero 0,3 V de menos a 50 °C.

Ver solución razonada

(a) Tolerancias sin calibrar (probablemente resistores de 5 %): ajustar el preset en un baño. (b) Caída de la alimentación o masa compartida con la corriente del buzzer: estrella de masas y desacople (Tema 28). (c) Banda menor que el ruido o realimentación positiva débil: revisar R1/Rf y el ruido del nodo (Tema 27). (d) Error de pendiente: la ganancia (Rg) o el B del NTC; se corrige con calibración en dos puntos.

15 · Síntesis

Ideas para recordar

  • Especificación con números verificables: 0–50 °C, salida 0,47–4,27 V, alarma ON 35 / OFF 33 °C, ±1 °C tras calibrar, falla segura.
  • Seis bloques con contratos de nodo (rango e impedancia). El proyecto falla en las interfaces, no dentro de los bloques.
  • Puente con el NTC arriba (salida creciente), INA de G = 1,5 con REF = 2,5 V, RC de 1 Hz con seguidor, Schmitt con R1 = 10 kΩ, Rf = 220 kΩ y Vref ≈ 3,15 V, driver con Rb = 680 Ω.
  • Umbrales de 3,294 V (35 °C) y 3,136–3,143 V (33 °C): ON a ≈ 35,0 °C, OFF a ≈ 32,9 °C; cada milivolt de Vref son 0,014 °C.
  • Monte Carlo: con 1 % la temperatura de encendido tiene σ ≈ 0,34 °C y el 99,8 % cae en ±1 °C; con 5 %, σ ≈ 1,7 °C y solo el 44 %. La banda casi no varía.
  • Un preset en Vref absorbe las tolerancias; se calibra en un baño contra un termómetro de referencia. Dos puntos para la pendiente.
  • La puesta en marcha va de la fuente a la salida, con los valores esperados por nodo: si un nodo miente, el problema está antes.
  • Falla segura: NTC abierto suena, en corto no. Se resuelve con una ventana de supervisión o validando el rango del ADC.
  • Ratiométrico: REF, puente y Vref salen de los mismos 5 V, así que la alimentación casi no cambia el resultado.

¿Listo para el cierre del curso?

Podés avanzar si sos capaz de hacer esto sin mirar:

  • Escribir el contrato (rango e impedancia) de cada nodo de la cadena.
  • Elegir la ganancia y REF del INA a partir del rango del sensor y la ventana del ADC.
  • Calcular R1, Rf y Vref del Schmitt para dos temperaturas de umbral.
  • Estimar con un Monte Carlo qué tolerancia de componentes cumple la especificación.
  • Calibrar con un preset y explicar qué corrige y qué no.
  • Poner en marcha por nodos con valores esperados y diagnosticar por síntomas.

La estación termina el curso: un sensor de milivoltios, convertido por un puente, amplificado sin amplificar el ruido, filtrado, alimentado con cuidado, medido, decidido con histéresis y con una alarma que no repiquetea. Falta mirar atrás y adelante: el próximo y último tema es el cierre y el puente al curso 5.