Un DAC (Digital to Analog Converter) es un conversor que transforma un valor digital en una tensión analógica real.
Hasta ahora, cuando queríamos variar la intensidad de un LED o la velocidad de un motor, usábamos PWM (Modulación por Ancho de Pulso). Como vimos, el PWM es un truco: encendemos y apagamos muy rápido el pin para simular un voltaje promedio.
Pero, ¿qué pasa si necesitamos un voltaje analógico real? ¿Qué pasa si queremos generar una onda senoidal suave o controlar un equipo de audio?
Para obtener esa salida usamos el DAC (Digital to Analog Converter). A diferencia del PWM, que solo conmuta entre 0 V y 3,3 V, un DAC puede entregar tensiones intermedias.
¡Ojo con tu placa! A diferencia del PWM o el ADC, que están en casi todos los microcontroladores, el DAC es un periférico de lujo.
- ESP32 original: Tiene dos canales DAC, en los pines 25 y 26. El ESP32-S2 los ofrece en los pines 17 y 18; otros miembros de la familia ESP32 no incorporan este periférico.
- Pyboard: Tiene DAC integrado, aunque se controla mediante
pyb.DAC. - ESP8266 / Raspberry Pi Pico (RP2040): No tienen hardware DAC (tendrías que usar un chip externo como el MCP4725).
Cómo funciona un DAC
Puedes imaginar el DAC como una escalera. No podemos generar infinitos niveles de tensión, sino una cantidad determinada por su resolución en bits.
En el caso del ESP32, el DAC tiene una resolución de 8 bits. Esto significa que podemos dividir el voltaje de referencia (3.3V) en 256 pasos.
- Valor
00 V - Valor
1281.65 V (aprox) - Valor
2553.3 V
Cada “escalón” o paso de voltaje es de aproximadamente 12.9 mV.
Uso básico del DAC en ESP32
Usar el DAC en MicroPython es tremendamente sencillo gracias a la clase machine.DAC.
Vamos a generar un voltaje estático de unos 1.65V (la mitad del rango) en el GPIO 25.
from machine import Pin, DAC
# Inicializamos el DAC en el Pin 25
# En el ESP32, solo se permite Pin(25) o Pin(26)
dac25 = DAC(Pin(25))
# Escribimos un valor de 8 bits (0-255)
dac25.write(128)
Si conectas un multímetro entre el pin 25 y GND, verás un voltaje estable y continuo. Sin pulsos, sin ruido de conmutación. Silencio eléctrico puro.
Generando formas de onda
La verdadera potencia del DAC aparece cuando cambiamos ese valor rápidamente en el tiempo. Vamos a generar una onda de diente de sierra.
from machine import Pin, DAC
import time
dac = DAC(Pin(25))
while True:
for i in range(256): # De 0 a 255
dac.write(i)
# No ponemos sleep para que sea lo más rápido posible
El problema de la velocidad
Si observas la salida anterior con un osciloscopio, verás la forma de onda, pero notarás que la frecuencia es baja. Esto es porque Python, al ser interpretado, tarda un tiempo en ejecutar el bucle for.
Para generar ondas complejas como una senoide, necesitamos calcular los valores:
import math
from machine import Pin, DAC
dac = DAC(Pin(25))
# Pre-calculamos la tabla de seno para no hacer matemáticas lentas en el bucle
buf = bytearray(100)
for i in range(len(buf)):
# Convertimos seno (-1 a 1) al rango del DAC (0 a 255)
val = int(127.5 + 127.5 * math.sin(2 * math.pi * i / len(buf)))
buf[i] = val
# Bucle infinito reproduciendo la onda
while True:
for val in buf:
dac.write(val)
Pre-calcular los valores en una lista o bytearray (una tabla de búsqueda o Lookup Table) es una técnica estándar en sistemas embebidos para ganar velocidad.
Limitaciones y peculiaridades del ESP32
Aunque el DAC del ESP32 es muy útil, conviene conocer sus limitaciones para no volverte loco:
- Resolución de 8 bits: 256 pasos es poco para audio de alta fidelidad, pero suficiente para voz básica o señales de control.
- No linealidad en los extremos: El DAC del ESP32 no llega a 0V ni a 3.3V perfectos. Tiene una “zona muerta” al principio (hasta ~0.08V) y al final (hasta ~3.2V) donde la salida no responde linealmente.
- Ruido: La salida puede tener algo de ruido digital acoplado de la CPU.
¿Para qué sirve esto realmente?
Quizás te preguntes, ¿para qué quiero 1.6V fijos?
- Generación de Audio: Puedes conectar un pequeño amplificador y reproducir sonidos de 8 bits (estilo consola retro).
- Control de Instrumentación: Muchos equipos industriales se controlan con señales de voltaje (ej. 0-10V, usando un op-amp para amplificar la salida del ESP32).
- Polarización (Bias): Fijar un punto de referencia para un circuito analógico externo.
¿Buscas audio de alta calidad? Si necesitas reproducir MP3 o audio de alta calidad, el DAC interno se te quedará corto. En ese caso, deberías usar el protocolo I2S, que el ESP32 soporta por hardware, conectado a un DAC externo especializado como el PCM5102.
Con esto cerramos el ciclo básico de entradas y salidas. Ya sabemos leer el mundo (Entradas digitales, ADC) y actuar sobre él (Salidas digitales, PWM, DAC). ¡Es hora de empezar a conectar dispositivos más complejos!