ESP32 IDF

ESP32 IDF DAC

임베디드 친구 2024. 11. 10. 09:50
반응형

안녕하세요, '소프트웨어 공장'에 오신 것을 환영합니다! 이번 글에서는 ESP32의 DAC(Digital to Analog Converter)를 사용하여 아날로그 출력을 구현하는 방법을 다루겠습니다. 이번 주제는 특히 오디오 출력이나 아날로그 신호 처리가 필요한 분들에게 매우 유용할 것입니다.

ESP32는 두 개의 DAC 채널을 내장하고 있어서 디지털 값을 아날로그 신호로 변환하여 사용할 수 있습니다. 이 글에서는 VS Code 개발 환경을 기반으로, DAC를 사용하여 LED 밝기를 조절하는 간단한 예제를 단계별로 구현하는 방법을 설명하겠습니다.

1. DAC란 무엇인가?

DAC(Digital to Analog Converter)는 디지털 신호(0과 1로 구성된 비트 열)를 아날로그 신호로 변환하는 장치입니다. ESP32에는 8비트 해상도의 DAC 모듈이 내장되어 있으며, 이 모듈을 통해 부드러운 아날로그 출력을 생성할 수 있습니다. 이를 통해 소리 신호, LED 밝기, 기타 아날로그 전자 신호를 다룰 수 있게 됩니다.

ESP32의 DAC는 GPIO25(채널 1)와 GPIO26(채널 2)에서 사용할 수 있습니다. 이 핀들을 통해 디지털 값을 아날로그 값으로 변환하여 출력할 수 있습니다.

2. 개발 환경 준비

이 예제에서는 VS Code와 PlatformIO 플러그인을 사용하여 개발을 진행하겠습니다. 개발 환경이 이미 설치되어 있다는 가정하에 진행합니다. ESP32 개발을 위해 다음과 같은 작업을 진행합니다:

  • VS Code를 실행하고, PlatformIO 플러그인을 통해 새로운 ESP32 프로젝트를 생성합니다.
  • 보드를 esp32dev로 설정합니다.
  • 프로젝트 폴더 구조가 생성되면, src/main.cpp 파일을 열어 코드를 작성합니다.

3. 프로젝트 생성 및 기본 설정

PlatformIO에서 프로젝트 생성

  1. VS Code를 실행하고, PlatformIO 아이콘을 클릭합니다.
  2. "New Project"를 클릭하고, 다음과 같이 설정합니다:
    • Project Name: esp32_dac_example
    • Board: ESP32 Dev Module (esp32dev)
    • Framework: ESP-IDF
  3. 프로젝트가 생성되면 src/main.cpp 파일을 열어 아래의 코드를 작성합니다.

4. 코드 작성하기

이제 DAC를 이용한 간단한 아날로그 출력 코드를 작성해 보겠습니다. 이 예제에서는 DAC 채널 1 (GPIO25)을 사용하여 LED의 밝기를 조절하는 것을 목표로 합니다.

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/dac.h"
#include <stdio.h>

extern "C" void app_main(void) {
    // DAC 채널 1을 초기화합니다 (GPIO25 사용).
    dac_output_enable(DAC_CHANNEL_1);

    // DAC를 사용하여 LED의 밝기를 조절합니다.
    while (true) {
        // 0부터 255까지의 값을 출력하여 LED의 밝기를 천천히 증가시킵니다.
        for (int i = 0; i < 256; i++) {
            dac_output_voltage(DAC_CHANNEL_1, i);
            vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 대기
        }

        // 255부터 0까지의 값을 출력하여 LED의 밝기를 천천히 감소시킵니다.
        for (int i = 255; i >= 0; i--) {
            dac_output_voltage(DAC_CHANNEL_1, i);
            vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 대기
        }
    }
}

코드 설명

  1. 헤더 파일 포함: driver/dac.h는 ESP32의 DAC 관련 기능을 사용하기 위한 헤더 파일입니다.
  2. DAC 초기화: dac_output_enable(DAC_CHANNEL_1) 함수를 사용하여 DAC 채널 1을 활성화합니다. 여기서는 GPIO25 핀을 사용합니다.
  3. DAC 출력: dac_output_voltage(DAC_CHANNEL_1, i) 함수를 사용하여 0부터 255 사이의 값을 DAC 채널 1로 출력합니다. 이 값은 아날로그 전압으로 변환되어 출력됩니다. vTaskDelay() 함수를 사용하여 각 단계 사이에 지연을 주어 LED가 부드럽게 밝아지고 어두워지도록 합니다.

5. 빌드 및 업로드

코드를 작성한 후, 다음 단계를 따라 ESP32 보드에 코드를 업로드합니다:

  1. USB 케이블을 사용하여 ESP32 보드를 컴퓨터에 연결합니다.
  2. VS Code의 PlatformIO 사이드바에서 "Upload" 버튼을 클릭하여 코드를 빌드하고 보드에 업로드합니다.
  3. 업로드가 완료되면 ESP32 보드가 자동으로 리셋되고, 작성한 코드가 실행됩니다.

6. 실행 결과

ESP32 보드의 GPIO25 핀에 연결된 LED의 밝기가 부드럽게 증가하고 감소하는 것을 볼 수 있습니다. DAC를 사용하여 디지털 값을 아날로그 전압으로 변환함으로써 LED의 밝기를 제어할 수 있음을 확인할 수 있습니다.

7. DAC 응용하기

DAC를 사용하면 단순히 LED 제어뿐만 아니라 다양한 아날로그 신호 처리가 가능합니다. 예를 들어, 오디오 신호를 생성하거나, 가변 전압을 출력하여 외부 회로를 제어할 수도 있습니다.

간단한 사인파 출력 예제

다음은 DAC를 사용하여 사인파 형태의 신호를 출력하는 예제입니다. 이 코드는 스피커나 오실로스코프에 연결하여 테스트할 수 있습니다.

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/dac.h"
#include <math.h>

#define PI 3.14159265
#define SAMPLE_POINTS 100

extern "C" void app_main(void) {
    dac_output_enable(DAC_CHANNEL_1);

    while (true) {
        for (int i = 0; i < SAMPLE_POINTS; i++) {
            // 사인파 생성 (0~255 범위로 스케일링)
            uint8_t voltage = (uint8_t)((sin(2 * PI * i / SAMPLE_POINTS) + 1) * 127.5);
            dac_output_voltage(DAC_CHANNEL_1, voltage);
            vTaskDelay(pdMS_TO_TICKS(10)); // 10ms 대기
        }
    }
}

코드 설명

  • 사인파 생성: sin() 함수를 사용하여 0에서 2π까지의 값을 생성하고, 이를 0~255 범위로 스케일링합니다. 이렇게 하면 DAC에서 출력할 수 있는 전압 범위로 변환됩니다.
  • 출력 주기: vTaskDelay() 함수를 사용하여 샘플 포인트마다 일정 시간 대기합니다. 여기서 SAMPLE_POINTS를 증가시키면 더 부드러운 사인파를 생성할 수 있습니다.

8. 마무리

이번 글에서는 ESP32의 DAC 기능을 이용하여 아날로그 출력을 구현하는 방법을 알아보았습니다. 간단한 LED 밝기 제어부터 시작하여 사인파를 출력하는 예제까지 살펴보았는데요, 이 과정을 통해 DAC의 기본 개념과 활용 방법을 이해하셨기를 바랍니다.

DAC는 아날로그 신호가 필요한 다양한 상황에서 매우 유용하게 사용할 수 있는 기능입니다. 이를 이용해 더 재미있는 프로젝트를 만들어 보시기 바랍니다. 다음에도 유익한 내용으로 찾아뵙겠습니다. 감사합니다!"

반응형

'ESP32 IDF' 카테고리의 다른 글

ESP32 IDF SPI  (0) 2024.11.12
ESP32 IDF I2C  (0) 2024.11.11
ESP32 IDF ADC  (0) 2024.11.09
ESP32 IDF PWM  (0) 2024.11.08
ESP32 IDF FreeRTOS  (0) 2024.11.07