← Índice del curso

Sensores y Actuadores · Tema 5

Calibración y filtrado por software

Cuando el hardware ya hizo lo que podía, el código termina el trabajo: la calibración corrige los errores sistemáticos del sensor y los filtros reducen el ruido y los valores espurios. Cada filtro compra estabilidad con retardo, y elegirlo bien es una decisión de ingeniería, no de estilo.

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:

x = a × y + b  ⇒  y = (x − b) / a

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:

y = y1 + (x − x1) × (y2 − y1) / (x2 − x1)

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.

Efecto de calibrar con un punto o con dos, para el sensor del ejemplo (offset +0,8 °C, ganancia 0,97).
Temperatura realLectura crudaCon 1 punto (y = x − 0,8)Con 2 puntos
0 °C0,80,0 (error 0,0)0,0 (error 0,0)
30 °C29,929,1 (error −0,9)30,0 (error 0,0)
60 °C59,058,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:

Estrategias para sensores no lineales.
MétodoCómo funcionaVentajasInconvenientes
Ecuación del fabricanteSe aplica un modelo físico (por ejemplo, Steinhart-Hart para un NTC, tema 9)Sin tablas; pocos parámetrosExacta solo si los parámetros corresponden a tu unidad
PolinomioSe ajusta una curva de grado 2 o 3 a varios puntos de calibraciónCompactoPuede oscilar fuera del rango ajustado; cuesta aritmética de punto flotante
Tabla con interpolaciónSe guardan pares (crudo, verdadero) y se interpola linealmente entre vecinosMuy flexible; rápida; no necesita coma flotanteOcupa 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:

Vcc = 1,1 × 1023 / cuentas

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:

Perturbaciones típicas y el filtro más adecuado.
PerturbaciónCómo se veCausa habitualFiltro recomendado
Ruido aleatorio (de banda ancha)Fluctuación continua alrededor del valorRuido térmico, cuantización, referenciaPromedio móvil o exponencial
Valores espurios (spikes)Lecturas aisladas muy alejadasConmutación de motores, lectura mal sincronizada, fallo del busMediana
Interferencia periódicaOscilación regular superpuesta (50/60 Hz)Red eléctrica, motores, conversoresFiltro analógico previo; promedio sobre un período completo
Deriva lentaCambio gradual del valor baseTemperatura, envejecimientoRecalibració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:

σsalida = σ / √N  retardo ≈ (N − 1) / 2 muestras

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:

yn = yn−1 + α × (xn − yn−1)  0 < α ≤ 1

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:

τ = Ts × (1 − α) / α  σsalida = σ × √(α / (2 − α))
Comportamiento del filtro exponencial según α (ruido blanco de entrada).
αRuido que queda (σ salida / σ entrada)τ en muestrasMuestras hasta el 99 %
0,50,581≈ 6,6
0,250,383≈ 16
0,10,239≈ 44
1/16 ≈ 0,06250,1815≈ 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

Error rms en tramos estables—
Error pico en tramos estables—
Retardo hasta 29 °C (muestras)—

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

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. 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

  1. 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.
  2. Calibrá primero, filtrá después. El filtro no corrige el sesgo, y calibrar sobre una señal ruidosa agrega incertidumbre.
  3. Elegí puntos de referencia confiables que cubran el rango de uso, con instrumentos mejores que el sensor.
  4. Guardá los coeficientes como datos en la EEPROM, con una marca de validez, y probá la carga al arrancar.
  5. 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.
  6. 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.
  7. 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.
  8. 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.