Getting started with DAC

Revision as of 08:53, 26 December 2022 by Registered User
Under construction.png Coming soon

This article explains what DAC is and how to use it through examples

1. What is a digital to analog converter (DAC)?

A digital to analog converter is a system that converts a digital input signal or a value into an analog signal. It takes in a digital number or value as an input and converts it into an analog voltage. The voltage level corresponds to the binary number in the DAC output register.

To better understand DACs, we will take a look at the STM32L4 DAC in this article.

1.1. Simplified Block Diagram

simplified block diagram

1.2. DAC main features

DAC data format5.png
  • 8 or 12 bit mode: The DAC can support different input formats:
    • 8-bit right aligned data format.
      For dual mode (to provide input data for 2 DACs): 8-bit + 8-bit
    • 12-bit mode: either a right or left aligned mode
  • Buffered output: the DAC output can have a low impedance buffer to drive external loads
  • Sample and Hold mode to reduce power consumption
  • Synchronized update capability
  • DMA capability to offload CPU
  • Several trigger inputs: The DAC output data can be updated by a timer, an external trigger or a software trigger
  • Signal generation: DAC integrates small logic to generate noise waves as well as triangle waves

2. Configure DAC to generate a wave

2.1. Objectives

  • Learn how to setup DAC as wave generator in STM32CubeMX
  • Generate Code in STM32CubeMX and use HAL functions
  • Create a simple application to test the DAC

2.2. Create the project in STM32CubeIDE

  • File > New > STM32 Project in main panel.
create STM32CubeIDE project.png

.

In this example, the board used is NUCLEO-STM32L476RG.

  • Select NUCLEO-STM32L476RG board using Board Selector as shown in the figure below
Select NUCLEO-L476RG board.png


In case you haven't downloaded the STM32L476 Cube library, it will be downloaded automatically. It may take some time.

  • Save the project
DAC.png


2.3. Configure DAC

Info white.png Information
For more information on GPIO, please refer to the Getting started with GPIO page
  • Search for DAC1 in the left search field
  • Search for PA5 in the bottom right search field, then click Reset_State (if already set)
Pinout2.png
  • We will leave the clock configuration as default
  • The output buffer is enabled and no trigger is needed
  • We will measure the output signal on PA5 pin

2.4. Generate project and edit main.c

  • Click "Ctrl+S" to generate the project
Generate project.png


  • Edit main.c
Info white.png Information
Insert the code between /* USER CODE BEGIN PV */ and /* USER CODE END PV */ tags
/* USER CODE BEGIN PV */
uint16_t dac_value=0;
/* USER CODE END PV */
Info white.png Information
Start the DAC by inserting the required code between /* USER CODE BEGIN 2*/ and /* USER CODE END 2 */tags
  /* USER CODE BEGIN 2 */
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
  /* USER CODE END 2 */
Info white.png Information
Set DAC output value by inserting the required code between /* USER CODE BEGIN 3 */ and /* USER CODE END 3 */tags
  /* USER CODE BEGIN 3 */
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dac_value);
if (dac_value < 4095) {
	dac_value++;
} else {
	dac_value=0;
}
HAL_Delay(1);
  /* USER CODE END 3 */
  • Explanation

Inside the if conditional statement, we check if dac_value is lower than 4095 (0xFFF) which is the maximum output value for a 12-bit resolution DAC:

  • If the value is lower than the maximum value, it is incremented
  • If not, it is reset back to zero.
  • Then, we add a 1ms delay in order to have a stable output value

This will be running in the infinite loop. Therefore, the code will sweep through all the possible DAC output values, and then reset it to zero restarting the process all over again.

2.5. Compile and flash

  • Click on Build button Built.png
  • Click on Debug button (to run step by step) Debug.png
  • Or on Run button (to execute) Run.png

2.6. Build a simple signal generator

  • On NUCLEO-STM32L476RG, PA5 is connected to the user LED LD2. As a consequence, the DAC's output voltage is driving LD2. Notice how it progressively lights up before being switched off when the DAC's output is reset to 0
  • Connect your multimeter or oscilloscope to the PA5 pin, the DAC output gradually increases up to a maximum output value which is 3V. Then, it is reset to 0, drawing a sawtooth wave
  • Explore further possibilities such as :
    • Audio and waveform generation [1]
    • Extending the DAC performance [2]

3. References

The following documents and more are available on ST's website [3]



  1. AN3126 - Audio and waveform generation using the DAC in STM32 products[1]
  2. AN4566 - Extending the DAC performance of STM32 microcontrollers[2]
  3. https://www.st.com