← Índice del curso

Microcontroladores · Tema 27

Señales analógicas, muestreo y cuantización

El mundo físico es continuo: la temperatura, la luz, el sonido y la presión varían sin saltos. El microcontrolador solo entiende números. Convertir una cosa en la otra consiste en dos operaciones, discretizar el tiempo y discretizar la amplitud, y cada una tiene sus límites y sus trampas.

01 · Punto de partida

De la tensión al número

Hasta ahora todo lo que manejaste era digital: un pin está en alto o en bajo. Pero un potenciómetro entrega cualquier tensión entre 0 y 5 V, un sensor de temperatura entrega una tensión proporcional a los grados, y un micrófono entrega una señal que oscila miles de veces por segundo. Para usar esas señales en un programa hay que convertirlas en enteros.

Si pensás como programador, la situación es parecida a pasar de una función matemática f(t) definida para todo número real a un arreglo de enteros. Se pierde información de dos maneras: sólo se conservan algunos instantes (muestreo) y cada valor se redondea a un entero (cuantización). Este tema estudia qué se pierde, cuánto y cómo controlarlo. El próximo muestra el hardware que lo hace, el conversor analógico-digital (ADC) del ATmega328P.

Retomamos la lógica del curso de componentes y electrónica analógica (divisores, filtros RC, amplificadores) y el sistema binario del curso de electrónica digital.

02 · El camino completo

La cadena de medición

Cadena de conversión analógico-digital Un sensor entrega una tensión que pasa por un acondicionamiento (divisor, filtro, amplificador). Un circuito de muestreo y retención captura su valor en un instante. El cuantizador lo convierte en un código binario que lee la CPU. Sensortensión continua Acondicionardivisor · filtro · ganancia Muestreoy retención (S/H) Cuantizadorcompara con Vref Código0 … 2ⁿ − 1 CPUescala y usa el dato discretiza el tiempodiscretiza la amplitud

Cada etapa tiene su función y sus errores. El acondicionamiento adapta el rango y quita lo que sobra. El muestreo y retención (sample and hold) congela la tensión en un instante mediante un capacitor interno, para que el cuantizador trabaje con un valor quieto mientras la señal sigue cambiando. El cuantizador decide a cuál de los 2ⁿ escalones pertenece esa tensión. Y la CPU recibe un entero que debe volver a convertir en unidades físicas (grados, lux, volts).

El orden importa: nada de lo que se pierda antes (ruido, componentes de frecuencia que no se filtraron, una señal que excede el rango) se puede recuperar después.

03 · Discretizar la amplitud

Cuantización: resolución y error

Un conversor de n bits compara la tensión de entrada con una referencia Vref y entrega un entero entre 0 y 2n − 1. El rango de entrada, de 0 a Vref, se reparte en 2n escalones iguales, cada uno de ancho:

LSB = Vref / 2n código = ⌊ Vin / LSB ⌋ (limitado a 2n − 1)

El LSB (least significant bit) es la variación mínima de tensión que cambia el código: es la resolución del conversor, medida en volts. En el ATmega328P, con 10 bits y Vref = 5 V, el LSB mide 4,883 mV, y con la referencia interna de 1,1 V, 1,074 mV.

Escalón (LSB) según los bits y la referencia.
BitsCódigosLSB con 5 VLSB con 3,3 VLSB con 1,1 V
825619,53 mV12,89 mV4,30 mV
1010244,883 mV3,223 mV1,074 mV
1240961,221 mV0,806 mV0,269 mV
1665 53676,3 µV50,4 µV16,8 µV

Como todas las tensiones dentro de un escalón dan el mismo código, hay un error de cuantización: si se reconstruye la tensión en el centro del escalón, el error máximo es de ±½ LSB. Es un error inevitable: no es una falla del conversor, sino de usar un número finito de bits.

Una medida habitual de la calidad es la relación señal-ruido de cuantización (SQNR): para una senoidal de escala completa, SQNR ≈ 6,02 · n + 1,76 dB. Cada bit de más agrega unos 6 dB (el error baja a la mitad): 10 bits dan unos 62 dB y 16 bits, unos 98 dB. Si la señal ocupa solo una parte del rango, la relación empeora: con la mitad de la amplitud se pierden 6 dB, es decir, un bit. Por eso conviene aprovechar todo el rango de entrada.

El error real de un conversor suma otros defectos: el offset (el código 0 aparece con una tensión distinta de 0), la ganancia (el código máximo no coincide con Vref) y la no linealidad (los escalones no son todos iguales). En el ATmega328P la exactitud absoluta es del orden de ±2 LSB: los 10 bits son de resolución, no todos de exactitud.

04 · Discretizar el tiempo

Muestreo: Nyquist y alias

El conversor toma una muestra cada 1/fs segundos. Entre muestra y muestra no ve nada. La pregunta es cuántas muestras por segundo hacen falta para no perder la forma de la señal. La respuesta es el teorema de Nyquist: una señal cuya frecuencia máxima es fmax se puede reconstruir si se muestrea a más del doble:

fs > 2 · fmax (frecuencia de Nyquist = fs / 2)

Si no se cumple, ocurre el alias (aliasing): una frecuencia por encima de la de Nyquist se «pliega» y aparece, en las muestras, como una frecuencia más baja que no estaba en la señal original:

falias = | f − k · fs |, con k = el entero más cercano a f / fs

Por ejemplo, una señal de 900 Hz muestreada a 1000 Hz parece una de 100 Hz; una de 550 Hz parece de 450 Hz. Lo grave es que el alias es indistinguible de una señal verdadera: una vez tomadas las muestras, no hay forma de saber si había una señal lenta o una rápida disfrazada. Es el mismo fenómeno de las ruedas de un auto que parecen girar al revés en una película.

El mismo problema aparece sin querer en programas de muestreo por sondeo (tema 22): un bucle que mira una entrada una vez por vuelta «ve» frecuencias falsas si la señal es más rápida que la mitad de la tasa de vueltas.

05 · Antes del conversor

Acondicionar la señal

Casi nunca se conecta el sensor directamente al conversor. Hay tres cuidados:

  • El rango. La señal debe caber entre 0 y Vref. Un sensor que entrega 0 a 10 V se reduce con un divisor resistivo; uno que entrega 0 a 50 mV se amplifica; uno que entrega valores negativos (un micrófono) necesita sumar un offset de Vref/2. Una entrada que excede el rango satura el código, y una que sobrepasa a VCC en más de 0,5 V daña el pin (tema 16).
  • El filtro antialias. Antes de muestrear hay que eliminar las frecuencias por encima de fs/2, porque una vez muestreadas no se pueden separar de las legítimas. Lo hace un filtro pasa-bajos, que en el caso más simple es una resistencia y un capacitor (tema 25). Hasta una señal «lenta», como una temperatura, puede traer ruido de alta frecuencia (la red eléctrica, un motor cercano) que se pliega a la banda útil si no se filtra.
  • La impedancia de la fuente. El conversor carga un pequeño capacitor interno durante la muestra. Si la fuente tiene una impedancia alta, el capacitor no llega a cargarse del todo a tiempo y la lectura sale baja. El ATmega328P recomienda fuentes de unos 10 kΩ o menos; un divisor de resistencias muy grandes o un sensor de salida débil necesita un capacitor en paralelo con la entrada o un amplificador seguidor.

06 · Contra qué se mide

La referencia de tensión

El conversor no mide volts: mide una proporción. El código es Vin / Vref · 2n, de modo que si la referencia cambia, el mismo Vin da otro código. Esto tiene tres consecuencias:

  • La referencia es parte de la exactitud. Si usás la alimentación (5 V) como referencia y la alimentación varía ±5 %, todas las lecturas varían ±5 %. Las referencias dedicadas (la interna de 1,1 V, o un circuito externo) son más estables, pero no perfectas: la interna del ATmega328P tiene una tolerancia del orden del ±10 % entre chips, salvo que se calibre.
  • Una referencia menor da más resolución en volts. Con 1,1 V, el LSB es de 1,07 mV, ideal para señales pequeñas, pero la entrada no puede superar 1,1 V.
  • Medición ratiométrica. Si el sensor se alimenta de la misma tensión que sirve de referencia (un potenciómetro entre VCC y masa, por ejemplo), la variación de VCC afecta por igual a la señal y a la referencia, y el cociente no cambia. Es la manera más simple de obtener una lectura estable sin una referencia precisa.

Una aplicación curiosa: el conversor puede medir la propia alimentación, usando la referencia interna de 1,1 V como señal. Si VCC baja, el código de esa referencia sube, y de allí se deduce el voltaje de la batería sin ningún componente externo.

07 · Cambiar velocidad por resolución

Sobremuestreo y promediado

Si la señal es lenta, se puede muestrear mucho más rápido de lo necesario y promediar. El error de cuantización y el ruido eléctrico tienden a ser aleatorios, y al promediar N lecturas independientes el ruido baja en un factor √N. Cada vez que se cuadruplica el número de muestras (4, 16, 64…) se gana el equivalente a un bit de resolución:

Sobremuestreo con un conversor de 10 bits.
Bits ganadosMuestras por resultadoCómo se calcula
+1 (11 bits)4sumar 4 lecturas y desplazar 1 bit a la derecha
+2 (12 bits)16sumar 16 lecturas y desplazar 2 bits a la derecha
+3 (13 bits)64sumar 64 lecturas y desplazar 3 bits a la derecha

Hay dos condiciones. Primera: debe haber ruido de una amplitud comparable a un escalón; si la entrada es perfectamente constante, todas las lecturas son iguales y el promedio no agrega información (por eso, a veces, se añade ruido a propósito, técnica llamada dither). Segunda: la señal debe cambiar poco durante las muestras que se promedian. El costo es la tasa de salida: con 16 muestras por resultado, la tasa efectiva baja a un dieciseisavo.

Es útil también contra el ruido de la red eléctrica: promediar sobre una cantidad entera de ciclos de 50 Hz (por ejemplo, 20 ms) lo cancela casi por completo.

08 · Decisiones de diseño

Elegir tasa y resolución

Valores orientativos según la aplicación.
AplicaciónBanda de la señalTasa de muestreoResolución útil
Temperatura ambienteMenos de 1 Hz1 muestra por segundo (promediando varias)10 bits sobradamente; la exactitud la limita el sensor
Potenciómetro de usuarioUnos pocos hercios50 a 100 muestras por segundo8 bits suelen alcanzar
Vibraciones, corriente de un motorHasta algunos kilohercios10 a 50 kHz8 a 10 bits
Voz (telefonía)Hasta 3,4 kHz8 kHz8 bits (con compresión) a 12 bits
Audio de calidadHasta 20 kHz44,1 a 48 kHz16 bits o más

También hay que sumar el costo en datos. A fs muestras por segundo y 2 bytes por muestra (una lectura de 10 bits ocupa un entero de 16), la tasa de datos es 2 · fs bytes por segundo. A 1 kHz son 2 KB/s, es decir, el total de la SRAM del ATmega328P en un segundo. Si la señal se guarda, hay que decidir cuántos segundos caben (ver la herramienta 3). Procesar los datos «al vuelo» (promediar, detectar un umbral, contar) evita almacenarlos.

El tiempo que tarda cada conversión también limita la tasa máxima. El ADC del ATmega328P necesita 13 ciclos de su reloj por conversión, con un reloj recomendado de 50 a 200 kHz: unos 15 000 muestras por segundo como máximo con la resolución completa. Los detalles, en el próximo tema.

09 · Analogía con programación

Medir la cuantización, el alias y el sobremuestreo

Este programa hace tres experimentos. Primero cuantiza una senoidal con distintos números de bits y compara la relación señal-ruido medida con la fórmula 6,02·n + 1,76 dB. Después calcula el alias de varias frecuencias y lo confirma con un espectro (transformada de Fourier de fuerza bruta). Por último promedia 16 lecturas con ruido de un escalón y mide la mejora.

Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

import math
import random

random.seed(7)


def cuantizar(v, vref, bits):
    niveles = 1 << bits
    codigo = min(niveles - 1, max(0, int(v / vref * niveles)))      # floor: el código del escalón
    return codigo, (codigo + 0.5) * vref / niveles                  # tensión reconstruida al centro


# 1) Relación señal/ruido de cuantización: medida frente a la fórmula 6,02·n + 1,76 dB
VREF = 5.0
print("bits   SQNR medida   fórmula (escala completa)")
for bits in (4, 8, 10, 12):
    n = 20000
    p_senal = p_error = 0.0
    for k in range(n):
        v = VREF / 2 + VREF / 2 * 0.999 * math.sin(2 * math.pi * k * 0.0123457)
        _, vr = cuantizar(v, VREF, bits)
        p_senal += (v - VREF / 2) ** 2
        p_error += (v - vr) ** 2
    print(f"{bits:>4}   {10 * math.log10(p_senal / p_error):8.2f} dB   {6.02 * bits + 1.76:8.2f} dB")

# 2) Alias: frecuencia aparente de una senoidal muestreada
def aparente(f, fs):
    return abs(f - round(f / fs) * fs)


def pico_dft(f, fs, n=1000):
    muestras = [math.sin(2 * math.pi * f * k / fs) for k in range(n)]
    mejor, mejor_f = -1.0, 0.0
    for m in range(0, n // 2 + 1):
        re = sum(x * math.cos(2 * math.pi * m * k / n) for k, x in enumerate(muestras))
        im = sum(x * math.sin(2 * math.pi * m * k / n) for k, x in enumerate(muestras))
        if re * re + im * im > mejor:
            mejor, mejor_f = re * re + im * im, m * fs / n
    return mejor_f


print()
print("señal   fs     alias (fórmula)   pico del espectro")
for f, fs in ((100, 1000), (450, 1000), (550, 1000), (900, 1000), (1100, 1000)):
    print(f"{f:>5}  {fs:>5}   {aparente(f, fs):>8.0f} Hz        {pico_dft(f, fs):>8.0f} Hz")

# 3) Sobremuestreo: promediar 16 lecturas con ruido de ~1 escalón
print()
LSB = VREF / 1024
VERDADERA = 1.2345


def lectura():
    ruido = random.gauss(0, 1.0) * LSB
    return cuantizar(VERDADERA + ruido, VREF, 10)[0]


def desviacion(valores):
    media = sum(valores) / len(valores)
    return math.sqrt(sum((x - media) ** 2 for x in valores) / len(valores))


unicas = [lectura() for _ in range(3000)]
promedio16 = [sum(lectura() for _ in range(16)) / 16 for _ in range(3000)]
print(f"una lectura   : desviación {desviacion(unicas):.2f} escalones")
print(f"promedio de 16: desviación {desviacion(promedio16):.2f} escalones  (cociente {desviacion(unicas) / desviacion(promedio16):.1f}, teórico 4)")

Resultado: la SQNR medida coincide con la fórmula (61,94 dB frente a 61,96 dB con 10 bits). Las frecuencias de 550 y 900 Hz muestreadas a 1 kHz aparecen en el espectro en 450 y 100 Hz, tal como predice la fórmula. Y el promedio de 16 lecturas reduce la dispersión de 1,04 a 0,25 escalones: un factor 4, el esperado (√16). Probá cambiar el ruido a 0 y verás que el promedio deja de mejorar.

El modelo del ruido es gaussiano e independiente entre muestras. El ruido real de un circuito puede estar correlacionado (una interferencia de la red, por ejemplo) y no se reduce al promediar.

10 · Exploración interactiva

Muestreo, conversión y datos

El visualizador dibuja una senoidal, sus muestras y las cuantiza: variá la frecuencia, la tasa de muestreo y los bits para ver el alias y la escalera de cuantización. El conversor traduce entre tensión y código. La tercera herramienta calcula la tasa de datos y el sobremuestreo necesario.

Banco de conversión

1. Muestrear y cuantizar una senoidal (ventana de 10 ms, Vref = 5 V)

Frecuencia de Nyquist—
Frecuencia que reconstruye el programa—
Escalón y error de cuantización—
Relación señal-ruido—

2. Tensión y código

Código obtenido—
Tensión reconstruida—
Qué tensiones dan ese código—

3. Datos y sobremuestreo

Flujo de datos—
Tiempo que cabe en el buffer—
Sobremuestreo—

El visualizador reconstruye uniendo las muestras con una línea punteada, sin filtro interpolador: es una vista de lo que «ve» el programa. La tensión reconstruida de la herramienta 2 es el centro del escalón; hay conversores que usan el borde inferior.

Recorrido guiado

  1. Con 200 Hz, muestreo de 2000 Hz y 4 bits: se ve la escalera de cuantización (16 niveles) y la señal bien muestreada. Subí a 10 bits: la escalera desaparece.
  2. Subí la señal a 900 Hz con fs = 1000: Nyquist es 500 Hz y la línea punteada oscila a 100 Hz, la señal de 900 Hz disfrazada de otra.
  3. Probá 550 Hz con fs = 1000: el alias es 450 Hz, casi tan rápido como la señal original pero sin relación de fase. Con 1100 Hz a 1000 de fs, el alias es 100 Hz.
  4. Bajá la amplitud al 50 %: la relación señal-ruido cae 6 dB, un bit.
  5. En el conversor, 2,5 V con 5 V de referencia y 10 bits da el código 512. Pasá a referencia de 1,1 V con 0,33 V: código 307. Con una entrada de 5 V, el código satura en 1023.
  6. En la herramienta 3, 1000 muestras por segundo con 2 bytes cada una llenan 1024 bytes en medio segundo. Con 2 bits extra, hacen falta 16 muestras por resultado y la tasa baja a 62,5 por segundo.
Desafío: ¿cuántos bits para 1 mV?

Querés distinguir 1 mV en una señal de 0 a 5 V. ¿Cuántos bits hacen falta sin sobremuestreo? 5 V / 1 mV = 5000 escalones, por lo que 13 bits (8192 niveles) alcanzan y 12 (4096) no. Con un ADC de 10 bits (4,88 mV por escalón) haría falta sobremuestrear unas 64 veces (+3 bits, 13 bits efectivos), con ruido suficiente, o bajar la referencia a 1,1 V (1,07 mV por escalón) y acondicionar la señal para que quepa.

11 · Método de trabajo

Cómo plantear una medición

  1. Definí la magnitud y su rango: mínimo y máximo, en unidades físicas y en volts a la salida del sensor.
  2. Definí la banda de la señal: su frecuencia máxima; de ahí, la tasa de muestreo (5 a 10 veces).
  3. Elegí la resolución según el cambio mínimo que querés distinguir: bits ≥ log₂(rango / resolución).
  4. Acondicioná: divisor o ganancia para ocupar 0 a Vref, filtro antialias y baja impedancia de fuente.
  5. Elegí la referencia: ratiométrica si se puede; si no, una estable, y considerá su tolerancia.
  6. Calculá el costo: datos por segundo, tiempo de cálculo por muestra, memoria.
  7. Calibrá y verificá: con una tensión conocida (una fuente, una pila medida con el multímetro) y con un caso extremo (entrada en 0 y en el máximo).

Si las lecturas saltan sin razón, el orden de sospecha es: ruido sin filtrar o impedancia de fuente alta, una referencia que se mueve, una entrada fuera de rango (saturación) y, recién entonces, el programa.

12 · Comprensión

Confusiones frecuentes

«Un conversor de 10 bits tiene una exactitud de 1 parte en 1024»

Tiene una resolución de 1 parte en 1024. La exactitud depende de la referencia, el offset, la ganancia y la no linealidad: en el ATmega328P, del orden de ±2 LSB como mínimo, más lo que aporte el sensor.

«Si muestreo más rápido que la señal, no hay alias»

Hay que muestrear a más del doble de la frecuencia más alta que haya en la señal, incluyendo ruido que no te interesa. Por eso se filtra antes.

«El alias se puede quitar después, por software»

No: una vez muestreada, una frecuencia disfrazada es idéntica a una real. Sólo se evita antes del muestreo, con un filtro o una tasa mayor.

«Promediar siempre mejora la resolución»

Reduce el ruido aleatorio, pero no agrega bits si no hay ruido, ni corrige errores sistemáticos (offset, referencia). Tampoco sirve con una señal que cambia durante el promedio.

«La entrada puede ser cualquier tensión menor que 5 V»

Tiene que ser menor que la referencia elegida: con la interna de 1,1 V, una señal de 3 V satura el código y puede dañar el pin si supera VCC en 0,5 V.

13 · Práctica guiada

Predecí antes de comprobar

1. El escalón y el código

Con 10 bits y una referencia de 5 V, ¿cuánto mide el escalón y qué código da una entrada de 2,5 V?

Ver solución

LSB = 5 / 1024 = 4,883 mV. Código = ⌊2,5 / 5 × 1024⌋ = 512.

2. De código a tensión

Con referencia de 1,1 V y 10 bits, ¿a qué tensiones corresponde el código 300?

Ver solución

LSB = 1,1 / 1024 = 1,074 mV. El código 300 abarca de 300 × 1,074 = 0,3223 V a 301 × 1,074 = 0,3233 V.

3. Un alias

Una señal de 700 Hz se muestrea a 1000 Hz. ¿Qué frecuencia aparente tiene?

Ver solución

|700 − 1 × 1000| = 300 Hz. Está por encima de la frecuencia de Nyquist (500 Hz) y se pliega.

4. Muestrear la voz

La voz de una llamada telefónica llega hasta 3,4 kHz. ¿Qué tasa mínima exige Nyquist y cuál es la usada en la práctica?

Ver solución

Más de 2 × 3,4 kHz = 6,8 kHz. En telefonía se usa 8 kHz, que deja margen para un filtro antialias realizable.

5. Dos bits más

¿Cuántas lecturas de 10 bits hay que promediar para obtener 12 bits efectivos y cómo se calcula el resultado?

Ver solución

Cuatro veces las muestras por cada bit: 4² = 16 lecturas. Se suman las 16 y se desplaza el resultado 2 bits a la derecha (no 4), lo que da un valor de 12 bits. Hace falta ruido de aproximadamente un escalón para que funcione.

14 · Síntesis

Ideas para recordar

  • Convertir una señal analógica en números consiste en muestrear (discretizar el tiempo) y cuantizar (discretizar la amplitud).
  • El escalón es LSB = Vref/2n; el error de cuantización es de ±½ LSB y la relación señal-ruido es de unos 6,02·n + 1,76 dB.
  • Nyquist: hay que muestrear a más del doble de la frecuencia máxima; por encima, aparece el alias, que no se puede corregir después.
  • Antes del conversor hacen falta acondicionamiento de rango, un filtro antialias y baja impedancia de fuente.
  • El conversor mide una proporción respecto de la referencia: su estabilidad condiciona la exactitud; la medición ratiométrica la cancela.
  • Promediar 4^k lecturas con algo de ruido agrega k bits, a costa de dividir la tasa.
  • La resolución no es exactitud: offset, ganancia y no linealidad suman errores de algunos LSB.

¿Listo para el tema 28?

Antes de avanzar, calculá el escalón y el código de una entrada dada, decidí si una frecuencia se alias con una tasa de muestreo y explicá por qué se filtra antes de muestrear. Si podés justificar las tres respuestas, entendés lo que hace un conversor.

En el próximo tema vemos el ADC del ATmega328P: su multiplexor, las referencias, el reloj del conversor, los registros y el código para leer una tensión.