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í:
| Requisito | Valor | Qué decide |
|---|---|---|
| Rango de medida | 0 a 50 °C | Ganancia del INA por el peor extremo (Tema 26) |
| Salida analógica | Dentro de 0,1–4,9 V, para un ADC de 5 V y 10 bits | Ganancia y REF del INA |
| Resolución | Mejor que 0,1 °C por cuenta | Verificar con el ADC (no es el límite) |
| Alarma | ON 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 calibrar | Tolerancias y preset (sección 5 y 6) |
| Salidas de alarma | Buzzer activo de 5 V (≈ 30 mA) y un LED | Driver con transistor (Tema 29) |
| Alimentación | Adaptador de 9 V, 5 V regulados | 7805, desacople y masa (Tema 28) |
| Robustez | Sensor abierto o en corto: alarma activa, nunca silencio | Falla 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
| Bloque | Valores | Tema |
|---|---|---|
| Fuente | Adaptador 9 V → 7805 → 5 V; 100 µF + 100 nF en la entrada y la salida | 28 |
| Puente | NTC 10k (B = 3950) arriba y fija de 10k abajo; rama de referencia 10k/10k | 13, 26 |
| INA | Alimentación simple (tipo INA333), G = 1,5 con Rg = 200 kΩ, REF = 2,5 V con seguidor | 25 |
| Filtro | RC 150 kΩ + 1 µF (fc = 1,06 Hz) y seguidor (LM358) | 23, 26, 27 |
| Alarma | Schmitt no inversor: R1 = 10 kΩ, Rf = 220 kΩ, Vref ≈ 3,15 V con preset | 20, 29 |
| Driver | NPN 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:
| Nodo | Rango entregado | Lo que admite el siguiente | Margen |
|---|---|---|---|
| VB (puente) | 1,15 a 3,68 V | Modo común de entrada del INA de alimentación simple: cerca de los rieles | Más de 1 V a cada lado |
| Vdif (puente) | −1354 a +1180 mV | Con G = 1,5: salida entre 0,47 y 4,27 V | 0,37 V abajo, 0,63 V arriba de la ventana de 0,1–4,9 V |
| VINA | 0,47 a 4,27 V | Filtro RC (sin carga) y seguidor | El seguidor admite 0 a 3,5 V* |
| Vfiltro (salida del seguidor) | 0,47 a 4,27 V | ADC: 0 a 5 V; R1 del Schmitt | Impedancia baja, apta para el ADC |
| Nodo + del Schmitt | ≈ Vref ± 0,15 V | Modo común del LM358 hasta ≈ 3,5 V | 0,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:
- 1Excursió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.
- 2Relació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.
- 3Referencia.
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.
- 4Resultado.
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:
| Resistores / R0 del NTC | Media | σ | Mínimo – máximo | Dentro de ±1 °C | Banda ON − OFF |
|---|---|---|---|---|---|
| 0,1 % | 34,98 °C | 0,05 °C | 34,84 – 35,12 °C | 100 % | 2,07 ± 0,07 °C |
| 1 % | 34,99 °C | 0,34 °C | 33,86 – 36,01 °C | 99,8 % | 2,07 ± 0,07 °C |
| 5 % | 35,03 °C | 1,72 °C | 29,31 – 41,48 °C | 43,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.
| Fuente de error | Efecto | Se 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 °C | Calibrar 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 Vref | Preset: 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 placa | Decenas de mK/°C | Medir 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.
- 1Un 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.
- 2Sumergir 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.
- 3Ajustar 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.
- 4Verificar 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
| Ítem | Detalle |
|---|---|
| NTC 10 kΩ (B = 3950) y resistores de 10 kΩ ×6 | Puente (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-rail | Seguidores 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 Vref | 150 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 LED | Alarma sonora y visual |
| 7805, adaptador de 9 V, condensadores | 100 µ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):
| Paso | Nodo | 25 °C | 35 °C | Si no coincide |
|---|---|---|---|---|
| 1 | Salida del 7805 | 5,00 V | 5,00 V | Fuente, polaridad, condensadores |
| 2 | Rama de referencia (VA y REF) | 2,50 V | 2,50 V | Divisores de 10k, seguidor |
| 3 | VB (puente) | 2,50 V | 3,03 V | NTC, fija de 10k, cableado |
| 4 | Salida del INA | 2,50 V | 3,29 V | Rg, REF, alimentación del INA |
| 5 | Salida del seguidor del filtro | 2,50 V | 3,29 V (tras unos segundos) | RC, seguidor, condensador |
| 6 | Vref (nodo − del Schmitt) | 3,15 V | 3,15 V | Divisor y preset |
| 7 | Salida del Schmitt | ≈ 0,05 V (apagada) | ≈ 3,5 V si se cruzó 35 °C | R1, Rf, Vref |
| 8 | Base y colector del NPN (sin buzzer) | 0 V / 5 V | 0,7 V / ≈ 0,1 V (saturado) | Rb, transistor al revés |
| 9 | Con buzzer y LED | Silencio | Suena y se enciende | Polaridad 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íntoma | Causa probable | Dónde mirar |
|---|---|---|
| Salida del INA pegada a un riel | REF mal alimentado, Rg mal, o entradas flotantes | Nodos 2 y 3, soldaduras |
| La lectura se corre cuando suena el buzzer | Caída de la alimentación o masa compartida | Estrella de masas, desacople (Tema 28) |
| La alarma tabletea cerca de 35 °C | Sin realimentación positiva, o ruido mayor que la banda | Rf y R1, blindaje (Tema 27) |
| La alarma no apaga nunca | Realimentación mal conectada (queda enclavada), o Vref desajustado | Nodo 6 y 7 |
| Enciende a 30 o 40 °C | Vref o NTC fuera de tolerancia | Preset (sección 6) |
| Cambia con la mano cerca | Acoplo 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.
Gemelo digital de la estación
V_INA = 2,5 + 1,5·(V_B − 2,5)
Recorrido guiado (12 minutos)
- 1Pestañ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.
- 2Pasá 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.
- 3Apretá «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.
- 4Pasá 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.
- 5Pasá 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».
- 6Pasá 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.
- 7Pestañ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.
- 8Pasá 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.
- 9Pasá 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.
- 10Pasá 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
- En ①, ¿a qué temperatura enciende y a cuál apaga la unidad ideal? ¿Qué cuentas del ADC corresponden?
- En ②, ¿qué tolerancia mínima hace falta para cumplir ±1 °C sin calibrar en la gran mayoría de las unidades?
- En ②, ¿por qué la banda ON − OFF casi no cambia entre 0,1 % y 5 %?
- En ②, con 5 % y calibradas, ¿qué unidades quedan sin poder ajustarse y qué se hace con ellas?
Ver respuestas sugeridas
- 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).
- 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.
- 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.
- 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
| En software | En 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 correctos | El seguidor del LM358 que no admite 4,27 V: cada bloque anda, la unión no |
| El entorno de staging con datos conocidos | El 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 entorno | El preset: ajusta Vref y absorbe las tolerancias de todo lo anterior |
| Fuzzing o pruebas con datos aleatorios para ver la distribución de resultados | El 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 principal | La 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.