How to use the ESP32 DAC sine/cosine waveform generator using Arduino / PlatformIO
The ESP32 and its derivatives such as the ESP32-S2 have a built-in sine/cosine waveform generator for the built-in 8-bit DAC.
Using it requires ESP-IDF v5.1+ (see the official example). Using it with Arduino is slightly harder, since the stable version of the arduino-esp32
framework at the time of writing this post is based on ESP-IDF v4.4 which does not provide the DAC cosine generator API.
Therefore, we have to explicitly specify the arduino-espressif32
version (git commit) in 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
The example main source code is pretty simple:
#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 your main code here, to run repeatedly:
delay(1000);
}
If you want to see how the generated waveform looks on an oscilloscope, see How does the ESP32 DAC cosine generator waveform look on an Oscilloscope?