Objetivos
- Comprender las tres etapas fundamentales del PCM: Muestreo, Cuantificación y Codificación.
- Verificar experimentalmente el Teorema de Muestreo de Nyquist-Shannon.
- Implementar un sistema de transmisión digital y reconstrucción de la señal analógica usando Arduino.
Materiales
- 1 placa Arduino Uno (o compatible).
- 1 generador de funciones (o reproductor de audio con cable Jack 3.5 mm). Si no se dispone de generador, se puede usar un potenciómetro para la versión básica.
- 1 protoboard y cables de conexión.
- Componentes para filtro paso bajo: 1 resistencia de 10 kΩ y 1 capacitor de 0.1 µF (104).
- Software Arduino IDE y software de análisis (Excel, MATLAB o Python).
- Osciloscopio (opcional, pero altamente recomendado).
Descripción general
En este laboratorio se diseñará un sistema PCM básico. El Arduino actuará como el codificador: tomará muestras de una señal analógica, las cuantificará usando su Conversor Analógico-Digital (ADC) de 10 bits y las codificará. Posteriormente, se transmitirá esta información y se utilizará otro pin del Arduino (o un segundo Arduino) para demodular y reconstruir la señal analógica original mediante PWM y un filtro analógico.
Advertencia de Seguridad
Configuración del Generador
Antes de empezar el procedimiento, configurá el generador de funciones (o el reproductor de audio) con estos valores. Son los que garantizan una señal segura para el Arduino y una demostración clara del Teorema de Nyquist.
| Parámetro | Valor Recomendado | Razón |
|---|---|---|
| Forma de onda | Senoidal (Sine) | Fácil de analizar en frecuencia y observar distorsión. |
| Frecuencia (f) | 50 Hz a 100 Hz | Con fs ≈ 1.5 kHz del código, da entre 15 y 30 muestras por ciclo, cumpliendo holgadamente Nyquist. |
| Amplitud (Vpp) | 2 Vpp a 3 Vpp | Deja margen de seguridad para evitar recorte (clipping). |
| Offset DC | 2.5 V (¡CRUCIAL!) | El Arduino NO tolera voltajes negativos. Centra la onda de forma segura. |
Procedimiento
Paso 1 — Acondicionamiento de la señal
- Generador/Audio: Conectá al pin A0. Asegurate que no supere 5V y tenga offset de 2.5V.
- Potenciómetro (versión básica): Extremos a 5V y GND, terminal central al pin A0.
Paso 2 — Muestreo y cuantificación (ADC)
El Arduino Uno tiene un ADC de 10 bits, lo que significa que cuantifica la señal en L = 2¹ = 1024 niveles. Usamos micros() para obtener marcas de tiempo precisas.
unsigned long tiempoMuestra;
int valorCuantizado;
void setup() {
Serial.begin(115200); // Alta velocidad para mayor tasa de muestreo
// analogReference(DEFAULT); // 5V por defecto
}
void loop() {
tiempoMuestra = micros(); // Timestamp en microsegundos
// 1. Muestreo y Cuantificación
valorCuantizado = analogRead(A0);
// 2. Codificación (Envío CSV: Tiempo, Decimal, Binario)
Serial.print(tiempoMuestra); Serial.print(",");
Serial.print(valorCuantizado); Serial.print(",");
Serial.println(valorCuantizado, BIN);
// Control de Frecuencia de Muestreo (fs)
delayMicroseconds(500);
}
Paso 3 — Análisis de datos y Nyquist
Guardá los datos del Monitor Serial en un .csv y calculá:
- Frecuencia de muestreo (fs): fs = 1 / Ts.
- Bit Rate (Rb): Rb = fs × 10 bits/segundo.
- Frecuencia máxima (fmax): la frecuencia de la senoidal del generador.
- Análisis: ¿Se cumple fs ≥ 2 × fmax? ¿Qué ocurre si aumentás el delay a 5000? (Aliasing).
Paso 4 — Transmisión y demodulación
Circuito de reconstrucción:
- Conectá el pin digital 9 a una resistencia de 10 kΩ.
- Conectá el otro extremo de la resistencia a un capacitor de 0.1 µF a GND.
- La unión entre la resistencia y el capacitor es tu salida analógica reconstruida.
void setup() {
pinMode(9, OUTPUT); // Pin PWM para reconstrucción
}
void loop() {
int valorCuantizado = analogRead(A0); // Muestreo
// El PWM de Arduino es de 8 bits (0-255). Mapeamos
// los 10 bits (0-1023) a 8 bits. Esto introduce un pequeño
// error de cuantificación adicional (ruido de cuantificación).
int valorPWM = map(valorCuantizado, 0, 1023, 0, 255);
analogWrite(9, valorPWM); // Reconstrucción DAC
delayMicroseconds(500); // Mantener fs
}
Dinámica Didáctica
Se recomienda dividir la práctica en dos fases, cambiando únicamente la frecuencia del generador:
| Parámetro | Fase 1: Muestreo Correcto | Fase 2: Aliasing |
|---|---|---|
| Frecuencia generador | 100 Hz | 800 Hz – 1000 Hz |
| Amplitud / Offset | 2 Vpp, offset 2.5V | 2 Vpp, offset 2.5V |
| Frecuencia muestreo | delay(500) → fs ≈ 1.5 kHz | delay(500) → fs ≈ 1.5 kHz |
| Condición Nyquist | Se cumple (1500 > 200) | Se viola (1500 < 2000) |
| Resultado | Senoidal suave y fiel | Señal fantasma distorsionada |
Con esto los alumnos comprueban de forma visual y experimental por qué el filtro anti-aliasing y el Teorema de Nyquist son obligatorios en los sistemas PCM reales.
Conceptos Clave
- Muestreo: Tomar valores de la señal continua en instantes discretos de tiempo.
- Cuantificación: Mapear un rango amplio de valores a un rango finito (ADC 10 bits).
- Codificación: Asignar un código binario a cada nivel cuantificado.
- Teorema de Nyquist: fs debe ser ≥ 2 × fmax para reconstruir sin pérdida.
- Ruido de cuantificación: Error de redondeo al digitalizar (≈ 4.88 mV en Arduino de 10 bits: 5V / 1024).
Extensiones (Nivel Avanzado)
- Filtro digital (DSP): Implementar media móvil o IIR/FIR en Arduino antes de enviar el dato por serial.
- Multiplexación (TDM): Transmitir dos señales analógicas por el mismo canal alternando muestras (Time Division Multiplexing).
- Codificación de línea: Usar
shiftOutpara enviar los 10 bits en serie simulando SPI o NRZ.
Preguntas de Análisis
- ¿Cuál es la resolución en voltios de tu sistema PCM?
- ¿Qué sucede con la señal reconstruida si fs < 2 × fmax?
- ¿Por qué el PWM de 8 bits introduce ruido adicional en la reconstrucción?
- ¿Qué ventajas y desventajas tiene usar un filtro RC frente a un filtro digital?
- Calculá el Bit Rate si la frecuencia de muestreo es de 2000 Hz.