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?
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow