Como usar el ESP32 DAC sine/cosine waveform generator usando Arduino / PlatformIO

El ESP32 y sus derivatives tales como el ESP32-S2 tienen un built-in sine/cosine waveform generator para el built-in 8-bit DAC.

Usar lo requires ESP-IDF v5.1+ (ver el official example). Usar lo con Arduino es slightly harder, ya que la stable version del arduino-esp32 framework al el time de writing este post esta based en ESP-IDF v4.4 el cual no provide el DAC cosine generator API.

Therefore, tenemos que explicitly specify el arduino-espressif32 version (git commit) en platformio.ini:

platformio.ini
[env:esp32dev]
platform = espressif32
# Commit f9cddfde697b659b9e818ec514f1505d2bd4a8ae is branch esp-idf-v5.1-libs @2022-02-01
platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#f9cddfde697b659b9e818ec514f1505d2bd4a8ae
board = esp32dev
framework = arduino

El example main source code es pretty simple:

main.cpp
#include <Arduino.h>
#include <driver/dac_cosine.h>

void setup() {
    dac_cosine_handle_t chan0_handle;
    dac_cosine_config_t cos0_cfg = {
        .chan_id = DAC_CHAN_1, // GPIO26
        .freq_hz = 1000,
        .clk_src = DAC_COSINE_CLK_SRC_DEFAULT,
        .atten = DAC_COSINE_ATTEN_DEFAULT,
        .phase = DAC_COSINE_PHASE_0,
        .offset = 0,
        //.flags.force_set_freq = false,
    };
    ESP_ERROR_CHECK(dac_cosine_new_channel(&cos0_cfg, &chan0_handle));
    ESP_ERROR_CHECK(dac_cosine_start(chan0_handle));
}

void loop() {
  // put tu main code here, para run repeatedly:
  delay(1000);
}

Si quieres ver como el generated waveform se ve en un oscilloscope, ver Como se ve el ESP32 DAC cosine generator waveform en un Oscilloscope?


Echa un vistazo a artículos similares por categoría: Arduino ESP8266/ESP32 PlatformIO