Skip to main content

How To: Digital/Analog Converter

Core Module contains two analog outputs: DAC0 and DAC1. These are real analog outputs, not just PWM outputs.

Both channels can run completely separately with different sample rates.



In this example, there’s a sine wave lookup table, you need to prepare the output buffer first.

The sampling is set on TWR_DAC_SAMPLE_RATE_16K. This together generates 125 Hz sine-wave on DAC0 output.

Sine Wave Generator Code Example

#include <application.h>

const uint8_t sine_wave[] = {
0x80, 0x86, 0x8C, 0x93,
0x99, 0x9F, 0xA5, 0xAB,
0xB1, 0xB6, 0xBC, 0xC1,
0xC7, 0xCC, 0xD1, 0xD5,
0xDA, 0xDE, 0xE2, 0xE6,
0xEA, 0xED, 0xF0, 0xF3,
0xF5, 0xF8, 0xFA, 0xFB,
0xFD, 0xFE, 0xFE, 0xFF,
0xFF, 0xFF, 0xFE, 0xFE,
0xFD, 0xFB, 0xFA, 0xF8,
0xF5, 0xF3, 0xF0, 0xED,
0xEA, 0xE6, 0xE2, 0xDE,
0xDA, 0xD5, 0xD1, 0xCC,
0xC7, 0xC1, 0xBC, 0xB6,
0xB1, 0xAB, 0xA5, 0x9F,
0x99, 0x93, 0x8C, 0x86,
0x80, 0x7A, 0x74, 0x6D,
0x67, 0x61, 0x5B, 0x55,
0x4F, 0x4A, 0x44, 0x3F,
0x39, 0x34, 0x2F, 0x2B,
0x26, 0x22, 0x1E, 0x1A,
0x16, 0x13, 0x10, 0x0D,
0x0B, 0x08, 0x06, 0x05,
0x03, 0x02, 0x02, 0x01,
0x01, 0x01, 0x02, 0x02,
0x03, 0x05, 0x06, 0x08,
0x0B, 0x0D, 0x10, 0x13,
0x16, 0x1A, 0x1E, 0x22,
0x26, 0x2B, 0x2F, 0x34,
0x39, 0x3F, 0x44, 0x4A,
0x4F, 0x55, 0x5B, 0x61,
0x67, 0x6D, 0x74, 0x7A

void application_init(void)

twr_dac_config_t dac_config;

dac_config.buffer = (uint8_t*)sine_wave;
dac_config.length = sizeof(sine_wave);
dac_config.data_size = TWR_DAC_DATA_SIZE_8;
dac_config.mode = TWR_DAC_MODE_CIRCULAR;
dac_config.sample_rate = TWR_DAC_SAMPLE_RATE_16K;

twr_dac_async_config(TWR_DAC_DAC0, &dac_config);