01 · Punto de partida
Lo que el código puede arreglar
En el tema 2 separamos dos clases de error: el sistemático (sesgo, error de ganancia), que desplaza todas las lecturas en el mismo sentido, y el aleatorio (ruido), que las dispersa. Dijimos entonces que el primero se corrige calibrando y el segundo filtrando. En el tema 4 preparamos la señal con hardware. Ahora cerramos el ciclo con software, que tiene una gran ventaja: corregir cuesta unas líneas de código, sin soldador.
También tiene límites que conviene conocer desde el principio. El software no puede recuperar información que el hardware no capturó: no repara una señal con aliasing, no devuelve resolución perdida por una mala ganancia y no distingue una variación real de una falsa si ambas se parecen. Calibrar y filtrar mejoran una medición razonable; no salvan una mala.
02 · Errores sistemáticos
Calibración: corregir offset y ganancia
La mayoría de los sensores lineales se aparta del ideal de dos maneras. Un error de offset suma una cantidad constante a todas las lecturas. Un error de ganancia (o de sensibilidad) multiplica el valor por un factor ligeramente distinto de 1. Combinados, la lectura cruda x se relaciona con el valor verdadero y mediante una recta:
Calibrar es medir a y b para poder invertir la ecuación. Con ellos, el programa corrige cada lectura antes de usarla. Los errores de offset suelen venir de la tolerancia del sensor y del acondicionamiento; los de ganancia, de la referencia del ADC, de las resistencias y de la sensibilidad real del sensor.
Calibración de un punto
Si se sabe que el error es solo de offset, alcanza con un punto de referencia. Se coloca el sensor en una condición conocida, se lee y se resta la diferencia. Un ejemplo clásico es un baño de agua con hielo bien mezclado, que está a 0 °C (con buena aproximación). Si el sensor lee 0,8 °C, el offset es +0,8 °C y la corrección es y = x − 0,8.
Un único punto es una apuesta: asume que la ganancia es perfecta. Funciona si el sensor se usa cerca del punto de calibración (un termómetro ambiental calibrado a temperatura ambiente), pero lejos de él puede dejar un error considerable.
03 · Offset y ganancia
Calibración de dos puntos
Con dos condiciones de referencia, lejos una de la otra, se determinan el offset y la ganancia. Sean (x1, y1) y (x2, y2) pares de lectura cruda y valor verdadero. La recta que los une da la corrección:
Ejemplo: el sensor lee 0,8 °C en el baño de hielo (referencia 0,0 °C) y 59,0 °C en un baño medido con un termómetro patrón a 60,0 °C. El factor de corrección es (60,0 − 0,0) / (59,0 − 0,8) = 1,0309. La corrección completa es y = (x − 0,8) × 1,0309. Verificación: con x = 59,0 se obtiene 58,2 × 1,0309 = 60,0 °C.
| Temperatura real | Lectura cruda | Con 1 punto (y = x − 0,8) | Con 2 puntos |
|---|---|---|---|
| 0 °C | 0,8 | 0,0 (error 0,0) | 0,0 (error 0,0) |
| 30 °C | 29,9 | 29,1 (error −0,9) | 30,0 (error 0,0) |
| 60 °C | 59,0 | 58,2 (error −1,8) | 60,0 (error 0,0) |
Los puntos de calibración deben cubrir el rango de uso: dentro de ellos la recta interpola con bastante seguridad; fuera, extrapola sin garantías. Y conviene no tomarlos demasiado juntos, porque el cociente (y2 − y1) / (x2 − x1) se vuelve muy sensible al error de medición.
Cómo se guarda la corrección
Los coeficientes se calculan una sola vez y se almacenan en la EEPROM (tema 8 del curso de Microcontroladores), para que sobrevivan al apagado. Al arrancar, el programa los carga. Es útil guardarlos junto con una marca de validez para saber si la memoria nunca fue escrita, y registrar la fecha o un número de versión:
#include <EEPROM.h>
struct Calibracion {
uint16_t marca; // 0xCA11 indica que los datos son válidos
float offset; // lectura cruda que corresponde al punto bajo
float factor; // (y2 - y1) / (x2 - x1)
float y1; // valor verdadero del punto bajo
};
Calibracion cal;
float corregir(float x) {
return cal.y1 + (x - cal.offset) * cal.factor;
}
void setup() {
EEPROM.get(0, cal);
if (cal.marca != 0xCA11) { // sin calibrar: valores neutros
cal = {0xCA11, 0.0, 1.0, 0.0};
}
}
Fijate en la idea de diseño: los coeficientes son datos, no constantes dentro del código. Así se puede recalibrar un sensor sin recompilar, y distintas unidades del mismo producto llevan su propia corrección.
04 · Cuando una recta no alcanza
Más allá de la recta
Si el sensor es no lineal (un NTC, un LDR, un sensor de gas), dos puntos no bastan. Hay tres caminos, de menor a mayor esfuerzo:
| Método | Cómo funciona | Ventajas | Inconvenientes |
|---|---|---|---|
| Ecuación del fabricante | Se aplica un modelo físico (por ejemplo, Steinhart-Hart para un NTC, tema 9) | Sin tablas; pocos parámetros | Exacta solo si los parámetros corresponden a tu unidad |
| Polinomio | Se ajusta una curva de grado 2 o 3 a varios puntos de calibración | Compacto | Puede oscilar fuera del rango ajustado; cuesta aritmética de punto flotante |
| Tabla con interpolación | Se guardan pares (crudo, verdadero) y se interpola linealmente entre vecinos | Muy flexible; rápida; no necesita coma flotante | Ocupa memoria; exige elegir bien los puntos |
La tabla con interpolación es la opción preferida en sistemas con poca memoria: más puntos donde la curva se dobla y menos donde es casi recta. Buscar el intervalo correcto es una búsqueda en un arreglo ordenado; la interpolación, la misma fórmula de dos puntos aplicada al tramo.
Un aviso: aumentar el grado del polinomio o la cantidad de puntos mejora el ajuste a los datos de calibración, pero no garantiza un mejor comportamiento con datos nuevos. Si la referencia tiene un error de 0,5 °C, ajustar una curva que pasa exactamente por los puntos solo copia ese error.
05 · Un truco de microcontroladores
Calibrar el propio ADC: medir la alimentación
La exactitud de una conversión ADC depende de la referencia. Si la referencia es Vcc, un valor de 4,8 V en lugar de 5,0 V introduce un error de ganancia del 4 % en todas las lecturas. Una solución es medir Vcc con el propio microcontrolador: los AVR permiten conectar al ADC la referencia interna de ≈1,1 V mientras se usa Vcc como referencia del conversor. La cuenta obtenida es cuentas = 1,1 × 1023 / Vcc, de modo que:
Si Vcc vale 5,0 V, la cuenta es ≈225; si baja a 4,69 V, sube a 240. Con Vcc calculada, las demás lecturas se corrigen: V = cuentas × Vcc / 1023. La referencia interna tiene una tolerancia propia (hasta ±10 % según la hoja de datos del ATmega328P), por lo que conviene calibrarla una vez contra un multímetro. Es una técnica útil para equipos con batería, donde la tensión cae con el uso.
Otro caso es el offset del propio ADC: leer un canal conectado a masa y restar el resultado elimina un pequeño desplazamiento. Estas mediciones «internas» se denominan autocalibración y se integran con las lecturas del sensor.
06 · Errores aleatorios
Tipos de ruido y cómo elegir el filtro
Antes de filtrar hay que saber contra qué. Hay tres tipos de perturbación, y cada uno responde a una herramienta distinta:
| Perturbación | Cómo se ve | Causa habitual | Filtro recomendado |
|---|---|---|---|
| Ruido aleatorio (de banda ancha) | Fluctuación continua alrededor del valor | Ruido térmico, cuantización, referencia | Promedio móvil o exponencial |
| Valores espurios (spikes) | Lecturas aisladas muy alejadas | Conmutación de motores, lectura mal sincronizada, fallo del bus | Mediana |
| Interferencia periódica | Oscilación regular superpuesta (50/60 Hz) | Red eléctrica, motores, conversores | Filtro analógico previo; promedio sobre un período completo |
| Deriva lenta | Cambio gradual del valor base | Temperatura, envejecimiento | Recalibración o compensación; el filtrado no la corrige |
Un error común es aplicar un promedio a una señal con spikes: un pico de +8 °C entre diez lecturas de 20 °C da una media de 20,8 °C, un error de casi un grado que se arrastra durante toda la ventana. La mediana lo ignora por completo. Y al revés: una mediana sola no suaviza el ruido gaussiano tan bien como un promedio.
07 · El filtro más conocido
Promedio móvil
El promedio móvil devuelve la media de las últimas N muestras. Cada vez que llega una nueva, se descarta la más antigua. Como vimos en el tema 2, promediar N muestras independientes reduce la desviación del ruido en un factor √N:
El costo es el retardo: ante un cambio brusco, la salida tarda N muestras en reflejarlo del todo, y en promedio queda atrasada (N − 1)/2. Con N = 16 se reduce el ruido a la cuarta parte, pero el filtro responde con medio ciclo de ventana de demora. Si se lee cada 100 ms, eso son 0,75 s.
La implementación eficiente no vuelve a sumar toda la ventana: usa un buffer circular y una suma acumulada, restando el valor que sale y sumando el que entra. Memoria: N valores. Cálculo: una resta, una suma y una división (una división entre potencias de 2 se reduce a un desplazamiento de bits).
#define N 16 // potencia de 2: la división es un desplazamiento
uint16_t ventana[N];
uint8_t indice = 0;
uint32_t suma = 0;
uint16_t promedioMovil(uint16_t nueva) {
suma -= ventana[indice]; // sale la muestra más antigua
ventana[indice] = nueva; // entra la nueva
suma += nueva;
indice = (indice + 1) & (N - 1); // vuelta circular
return suma >> 4; // suma / 16
}
Dos detalles prácticos: al arrancar, el buffer está en cero y las primeras N lecturas salen subestimadas; conviene inicializarlo con la primera muestra. Y la suma debe caber en el tipo elegido: 16 valores de 10 bits suman hasta 16 368, que entra en 16 bits, pero 128 valores ya no.
08 · Memoria mínima
Filtro exponencial
El filtro exponencial (EMA, media móvil exponencial) mezcla la muestra nueva con la salida anterior:
Con α = 1 no filtra; con α pequeño filtra mucho. Necesita una sola variable de estado, sin buffer, y es el equivalente digital de un filtro RC pasa-bajos del tema 4. Su constante de tiempo, con un período de muestreo Ts, es:
| α | Ruido que queda (σ salida / σ entrada) | τ en muestras | Muestras hasta el 99 % |
|---|---|---|---|
| 0,5 | 0,58 | 1 | ≈ 6,6 |
| 0,25 | 0,38 | 3 | ≈ 16 |
| 0,1 | 0,23 | 9 | ≈ 44 |
| 1/16 ≈ 0,0625 | 0,18 | 15 | ≈ 71 |
Frente al promedio móvil, el exponencial pondera más las muestras recientes y «olvida» las viejas de forma gradual. Su atractivo en microcontroladores es evidente: poca memoria y un cálculo trivial. Con α = 1/2k, la multiplicación se convierte en un desplazamiento de k bits.
uint32_t acc = 0; // acumulador: vale 16 veces la salida
uint16_t exponencial(uint16_t x) {
acc += x - (acc >> 4); // acc/16 sigue a x con alfa = 1/16
return acc >> 4;
}
Cuando el acumulador alcanza 16·x, el incremento es cero y la salida coincide con la entrada. La resta sin signo «envuelve» correctamente cuando acc >> 4 supera a x, porque la aritmética sin signo es módulo 232.
09 · Contra los valores espurios
Filtro de mediana
La mediana de las últimas N muestras (con N impar) es el valor que queda en el medio al ordenarlas. A diferencia del promedio, un valor extremo no la arrastra: un pico aislado entre cinco muestras ocupa el último lugar y se descarta sin dejar rastro. Además conserva los escalones: ante un cambio real y sostenido, la mediana lo sigue en unas pocas muestras sin redondear el flanco.
Ejemplo con N = 5: ventana 20,1 · 20,2 · 35,0 · 20,0 · 20,3 (el 35,0 es un pico). Ordenada: 20,0 · 20,1 · 20,2 · 20,3 · 35,0. La mediana es 20,2 °C; el promedio sería 23,12 °C.
El costo es el ordenamiento. Para N = 3 o 5 se resuelve con pocas comparaciones y no es problema. Para ventanas mayores conviene un algoritmo que mantenga la ventana ordenada. Un filtro de mediana de N muestras reduce el ruido gaussiano menos que un promedio de la misma longitud, por lo que es habitual combinarlos: primero la mediana (que quita los picos), después un exponencial (que alisa lo que queda).
Promedio y exponencial
Excelentes con ruido continuo de baja amplitud. Un valor espurio contamina la salida durante toda la ventana (o con decaimiento gradual). Suavizan los flancos reales.
Mediana
Excelente contra picos aislados y fallos de lectura. Conserva los escalones. Suaviza menos el ruido gaussiano. Más cara de calcular, y con N muy grande, lenta.
10 · Herramientas complementarias
Zona muerta y limitador de variación
Además de los tres filtros anteriores hay recursos sencillos que resuelven problemas concretos:
- Zona muerta (dead band). Se actualiza el valor mostrado o usado solo si cambia más que un umbral. Con ±0,2 °C de zona muerta, una pantalla deja de parpadear entre 24,9 y 25,0 °C. Es una forma de histéresis sobre el dato, distinta de la histéresis de control del tema 42.
- Limitador de variación (slew-rate limiter). Se restringe cuánto puede cambiar la salida por muestra. Una temperatura no puede saltar 30 °C en 100 ms: un cambio así se trata como un error de lectura y la salida avanza solo un máximo. Protege al control de los picos sin ordenar.
- Rechazo de valores imposibles. Si una lectura sale del rango físico del sensor (por ejemplo, −80 °C en un LM35), se descarta o se marca como falla. Es la validación de entradas, aplicada a mediciones.
- Sobremuestreo (oversampling). Sumar 4k lecturas y dividir por 2k añade k bits de resolución efectiva si hay ruido de al menos 1 cuenta. Es un promedio con la resolución como objetivo.
Estas técnicas se combinan en una canalización: validar → mediana → promedio o exponencial → zona muerta → mostrar o controlar. Cada etapa añade retardo; el total debe respetar el tiempo de respuesta que necesita la aplicación.
11 · Analogía con programación
Comparar filtros con una señal de prueba
Para elegir un filtro no alcanza con leer sus ventajas: hay que medirlo con una señal conocida. Es una prueba automática como cualquier otra. Generamos una señal de referencia (un escalón de 20 a 30 °C en la muestra 50), le sumamos ruido y dos picos, aplicamos cuatro filtros y calculamos tres métricas: el error cuadrático medio en los tramos estables, el peor error y las muestras que tarda en llegar a 29 °C tras el escalón.
El generador de ruido es un congruencial lineal, con semilla fija, para que el resultado sea reproducible.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
def ruido(semilla):
estado = semilla
while True:
estado = (1103515245 * estado + 12345) % 2**31
yield estado / 2**31 - 0.5 # uniforme en [-0.5, 0.5)
N = 100
generador = ruido(7)
real = [20.0 if i < 50 else 30.0 for i in range(N)] # escalón en la muestra 50
medida = [r + next(generador) for r in real]
medida[20] += 8 # pico espurio hacia arriba
medida[70] -= 6 # pico espurio hacia abajo
def ventana(x, i, n):
return x[max(0, i - n + 1): i + 1]
def media_movil(x, n):
return [sum(ventana(x, i, n)) / len(ventana(x, i, n)) for i in range(len(x))]
def exponencial(x, alfa):
y = [x[0]]
for muestra in x[1:]:
y.append(y[-1] + alfa * (muestra - y[-1]))
return y
def mediana(x, n):
return [sorted(ventana(x, i, n))[len(ventana(x, i, n)) // 2] for i in range(len(x))]
filtros = {
"sin filtro": medida,
"media móvil N=5": media_movil(medida, 5),
"exponencial a=0,2": exponencial(medida, 0.2),
"mediana N=5": mediana(medida, 5),
"mediana 5 + exp 0,2": exponencial(mediana(medida, 5), 0.2),
}
estables = [i for i in range(N) if not 50 <= i < 65] # se excluye el transitorio
print(f"{'filtro':<22}{'error rms':>10}{'error pico':>12}{'retardo':>9}")
for nombre, y in filtros.items():
errores = [y[i] - real[i] for i in estables]
rms = (sum(e * e for e in errores) / len(errores)) ** 0.5
pico = max(abs(e) for e in errores)
retardo = next(i - 50 for i in range(50, N) if y[i] >= 29)
print(f"{nombre:<22}{rms:10.2f}{pico:12.2f}{retardo:9d}")
Resultado esperado: sin filtro, error rms 1,10 y pico 7,51 (el pico espurio). La media móvil de 5 baja el rms a 0,48, pero el pico sigue en 1,54 (el espurio se reparte en la ventana) y tarda 4 muestras en llegar a 29. El exponencial da rms 0,37 y pico 1,46, con 10 muestras de retardo. La mediana de 5 logra rms 0,18 y pico 0,47 con solo 2 muestras de retardo. La combinación mediana + exponencial es la más limpia (rms 0,11, pico 0,43), a cambio de 12 muestras de retardo. Probá cambiar el valor de 8 por 0 y observá cuál filtro mejora más.
El resultado ilustra el compromiso entre ruido y retardo: el filtro más silencioso es también el más lento. Con una sola señal de prueba no se generalizan conclusiones, pero el método (señal conocida, métricas explícitas) sí se aplica a cualquier caso real.
12 · Exploración interactiva
Comparar filtros sobre una señal con ruido
Esta señal es la misma del ejemplo: una temperatura que salta de 20 a 30 °C en la muestra 50, con ruido y dos picos espurios (en las muestras 20 y 70). En el gráfico, la línea tenue es la señal medida (con ruido), la línea de color es la salida del filtro y la línea punteada, el valor real. Elegí un filtro, ajustá sus parámetros y observá las tres métricas.
Banco de pruebas de filtros
Los tramos estables excluyen las muestras 50 a 64, el transitorio posterior al escalón. El error se calcula contra el valor real, que en una aplicación verdadera no se conoce: por eso conviene hacer estas pruebas con señales simuladas o de laboratorio.
Recorrido guiado
- Con «Sin filtro» y los picos activados, el error pico ronda 8: es el pico espurio de +8 °C. Desactivá los picos y mirá cómo baja al nivel del ruido.
- Con «Promedio móvil» y N = 5, el pico espurio se reparte en cinco muestras de 1,6 °C cada una. Subí N a 15: el pico se aplana más, pero el escalón se convierte en una rampa larga y el retardo aumenta.
- Con «Mediana» y N = 5, el pico desaparece y el escalón conserva su flanco. Probá N = 3 y N = 1 (equivale a no filtrar).
- Con «Exponencial» y α = 0,2, bajá α a 0,05: el ruido casi desaparece, pero el retardo hasta 29 °C supera las 40 muestras. Con α = 1 el filtro no hace nada.
- Con «Mediana + exponencial», dejá N = 5 y α = 0,2: es el mejor equilibrio para esta señal. Subí el ruido σ a 1,5 y compará con la mediana sola.
- Pulsá «Generar otro ruido» varias veces. Las métricas cambian un poco: con una sola realización de ruido no se pueden comparar filtros de rendimiento parecido.
Desafío: elegir para un termostato y para un detector de golpes
Un termostato lee cada 500 ms una temperatura que cambia lentamente y sufre picos ocasionales: conviene una mediana de 5 seguida de un exponencial lento, ya que un retardo de unos segundos es irrelevante. Un detector de golpes necesita reaccionar en pocas muestras ante un cambio brusco: un filtro lento lo borraría. Ahí se usa poco o ningún suavizado, y la decisión se apoya en un umbral y en la mediana de pocas muestras. El mismo filtro puede ser acertado en una aplicación y desastroso en otra; el criterio es la dinámica de lo que se mide.
13 · Método de trabajo
Cómo elegir y verificar la calibración y el filtro
- Diagnosticá antes de corregir. Tomá una serie de lecturas con la magnitud constante. La media frente al valor verdadero da el sesgo; la desviación, el ruido; los saltos aislados, los espurios.
- Calibrá primero, filtrá después. El filtro no corrige el sesgo, y calibrar sobre una señal ruidosa agrega incertidumbre.
- Elegí puntos de referencia confiables que cubran el rango de uso, con instrumentos mejores que el sensor.
- Guardá los coeficientes como datos en la EEPROM, con una marca de validez, y probá la carga al arrancar.
- Elegí el filtro según el tipo de perturbación: mediana para espurios, promedio o exponencial para ruido continuo, filtro analógico para la interferencia periódica.
- Fijá el retardo máximo tolerable a partir de la dinámica del fenómeno y del lazo de control, y calculá N o α para cumplirlo.
- Verificá con una señal conocida y compará las métricas antes de decidir. Revisá además el arranque (buffers inicializados) y el desborde de los acumuladores.
- Planificá la recalibración. Los sensores derivan: definí cada cuánto y cómo se comprueba.
Una advertencia final: filtrar mucho puede ocultar problemas reales. Si el sensor falla de forma intermitente y un filtro agresivo disimula los saltos, el sistema parece estable hasta que el fallo es permanente. Registrar el valor crudo además del filtrado (al menos mientras se depura) permite distinguir ambas cosas.
14 · Comprensión
Confusiones frecuentes
«Filtrar corrige la exactitud»
Un filtro reduce la dispersión, no el sesgo. Un sensor desplazado 1 °C sigue desplazado 1 °C después de promediar mil muestras. Para eso está la calibración.
«Más muestras en el promedio siempre es mejor»
Reduce el ruido por √N, pero con rendimientos decrecientes (pasar de 16 a 64 muestras solo lo reduce a la mitad) y con un retardo que crece linealmente. Hay que elegir el N mínimo que cumpla la especificación.
«Un promedio sirve contra los picos»
Lo arrastra: un pico contamina la salida durante N muestras. La mediana es la herramienta para los picos.
«Calibro una vez y listo»
Los sensores derivan con el tiempo, la temperatura y el envejecimiento. Además, cualquier cambio en la cadena (otra alimentación, otro cable, otra referencia del ADC) altera el error. Una calibración tiene fecha de vencimiento.
«Dos puntos de calibración muy cercanos son suficientes»
Cuanto más juntos, más se amplifica el error de medición en la pendiente calculada. Conviene separarlos lo más posible dentro del rango de uso.
«El filtro exponencial entero con desplazamiento funciona siempre»
La versión ingenua deja de seguir la entrada cuando la diferencia es menor que 2k cuentas, por el truncamiento. Hay que escalar el acumulador para conservar los decimales.
15 · Práctica guiada
Predecí antes de comprobar
1. Calibración de dos puntos
Un sensor lee 2,0 °C en un baño de hielo (referencia 0,0 °C) y 52,5 °C en un baño patrón de 50,0 °C. Obtené la fórmula de corrección y aplicala a una lectura de 30,0 °C.
Ver solución
Factor = (50,0 − 0,0) / (52,5 − 2,0) = 0,9901. Corrección: y = (x − 2,0) × 0,9901. Con x = 30,0: (28,0) × 0,9901 = 27,72 °C. Una lectura cruda de 30 °C corresponde en realidad a casi 27,7 °C: hay un error de más de 2 °C.
2. Medir la alimentación
Un ATmega328P usa Vcc como referencia y lee el canal interno de 1,1 V. El resultado es 240 cuentas. ¿Cuánto vale Vcc? ¿Y si la lectura de un sensor es 512 cuentas?
Ver solución
Vcc = 1,1 × 1023 / 240 ≈ 4,69 V. La tensión del sensor es 512 × 4,69 / 1023 ≈ 2,35 V, no los 2,50 V que se calcularían suponiendo Vcc = 5,0 V (un error de 6 %).
3. Filtro exponencial a mano
Un exponencial con α = 0,25 tiene salida previa 20,0. Llegan dos muestras seguidas de 28,0. ¿Cuánto vale la salida después de cada una? ¿A qué desplazamiento entero corresponde α?
Ver solución
Primera: 20 + 0,25 × (28 − 20) = 22,0. Segunda: 22 + 0,25 × (28 − 22) = 23,5. α = 1/4 corresponde a un desplazamiento de 2 bits (con acumulador escalado por 4).
4. Mediana contra promedio
La ventana de cinco muestras es 20,1 · 20,2 · 35,0 · 20,0 · 20,3. Calculá la mediana y el promedio, y decidí cuál conviene si el 35,0 es un fallo.
Ver solución
Ordenada: 20,0 · 20,1 · 20,2 · 20,3 · 35,0 → mediana = 20,2. Promedio = 115,6 / 5 = 23,12. Si el 35,0 es un fallo, la mediana es la correcta: el promedio arrastra más de 2,9 °C de error.
5. Costo del promedio móvil
Se promedian 16 lecturas con σ = 0,4 °C, tomadas cada 0,5 s. ¿Cuál es la σ de salida y el retardo aproximado en segundos?
Ver solución
σ = 0,4 / √16 = 0,1 °C. Retardo ≈ (16 − 1) / 2 = 7,5 muestras × 0,5 s ≈ 3,75 s. Un cambio brusco tarda hasta 8 s en reflejarse por completo.
6. Elegir α
Se muestrea cada 100 ms y se quiere un exponencial con constante de tiempo de unos 2 s. ¿Qué α corresponde? ¿Qué τ se obtiene con 1/16 y con 1/32?
Ver solución
De τ = Ts(1 − α)/α: α = Ts / (τ + Ts) = 0,1 / 2,1 ≈ 0,048. Con α = 1/16: τ = 0,1 × 15 = 1,5 s. Con α = 1/32: τ = 0,1 × 31 = 3,1 s. Cualquiera de las dos potencias de 2 se aproxima; la de 1/16 queda más cerca de 2 s.
16 · Síntesis
Ideas para recordar
- La calibración corrige errores sistemáticos (offset y ganancia); el filtrado reduce errores aleatorios y valores espurios.
- Con un punto se corrige el offset; con dos puntos, offset y ganancia: y = y₁ + (x − x₁)(y₂ − y₁)/(x₂ − x₁).
- La calibración depende de la calidad de la referencia y debe cubrir el rango de uso; los coeficientes se guardan como datos en la EEPROM.
- Los sensores no lineales se linealizan con la ecuación del modelo, un polinomio o una tabla con interpolación.
- El propio ADC se puede autocalibrar midiendo Vcc contra la referencia interna de 1,1 V.
- El promedio móvil reduce el ruido por √N con un retardo de (N − 1)/2 muestras y necesita un buffer.
- El filtro exponencial necesita una sola variable; con enteros hay que escalar el acumulador para no detenerse antes del valor real.
- La mediana elimina los picos aislados y conserva los escalones; el promedio los arrastra.
- Toda reducción de ruido se paga en retardo: el filtro se elige según la dinámica de la aplicación y se verifica con una señal conocida.
- Calibrar primero y filtrar después; ninguno de los dos repara una señal mal adquirida.
¿Listo para el tema 6?
Antes de avanzar, calculá la corrección de dos puntos para un sensor que lee 1,0 en el hielo y 98,0 cuando la referencia es 100,0, elegí un filtro para una señal con picos esporádicos y justificá cuánto retardo introduce, y explicá por qué promediar no corrige un offset. Si podés justificar las tres respuestas, ya podés confiar en un valor leído.
Con este tema termina el bloque de fundamentos. En el próximo comenzamos con los sensores concretos: pulsadores, interruptores y finales de carrera, los contactos mecánicos y el problema de los rebotes.