esp32-dac

Cómo usar la salida analógica DAC en un ESP32

El convertidor analógico-digital (DAC) es un componente que convierte una señal digital en una señal analógica discreta.

El DAC toma valores numéricos digitales y los transforma en niveles de voltaje. Esto es particularmente útil cuando se necesita controlar voltajes de referencia, generar formas de onda personalizadas, o incluso trabajar con audio.

A diferencia de una señal pseudo-analógica, como la que obtendríamos con un PWM, el DAC genera una señal analógica “de verdad”. Discreta (“a saltos”), pero “de verdad” analógica”.

El ESP32 y el ESP32-S2 incluyen dos DACs integrados, lo que permite generar señales analógicas en dos canales independientes. Estos canales se conocen como DAC1 y DAC2, y pueden generar voltajes en el rango de 0 a 3.3 voltios.

Sin embargo, el ESP32-C3 y el ESP32-S3 (y esto es una auténtica pena) no incluyen un DAC.

Uso del DAC en el ESP32

Usar el DAC del ESP32 en el entorno de Arduino es muy sencillo. Simplemente tenemos que emplear la función dacWrite.

Vamos a ver un ejemplo básico de cómo generar una señal analógica usando el DAC1:

const int raw = 1500 * 255 / 3300;

void setup() {
  // Inicialización del DAC
  dacWrite(DAC1, raw); // Genera un voltaje de aproximadamente 1.5V en DAC1
}

void loop() {
  // No es necesario realizar nada en el bucle principal
}

En este ejemplo, la función dacWrite() se utiliza para establecer el valor de voltaje en el canal DAC1.

El valor pasado como argumento son un número entre 0 y 255, que corresponde al voltaje en el rango de 0 a 3.3V. En este caso, se genera un voltaje de aproximadamente 1.5V.

Generación de señales más complejas

Si bien generar un voltaje constante es útil, el DAC en el ESP32 también se puede utilizar para generar formas de onda más complejas. Por ejemplo, podemos generar una onda senoidal utilizando una tabla de valores precalculados:

const int tableSize = 100;
const uint8_t sinTable[tableSize] = {127, 139, 150, ...}; // Valores precalculados

int index = 0;

void setup() {
  // Configuración del DAC
}

void loop() {
  // Generación de la señal
  dacWrite(DAC1, sinTable[index]);
  index = (index + 1) % tableSize;
  delay(10); // Controla la frecuencia de la onda
}

En este ejemplo, se utiliza una tabla precalculada de valores para generar una onda senoidal en el DAC1. El índice index se incrementa para recorrer la tabla y generar la forma de onda.