본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 9: 디지털-아날로그 변환 (DAC)

by cogito21_cpp 2024. 8. 1.
반응형

디지털-아날로그 변환 (DAC) 개요

디지털-아날로그 변환(DAC, Digital-to-Analog Conversion)은 디지털 값을 아날로그 신호로 변환하는 과정입니다. 임베디드 시스템에서는 DAC를 사용하여 디지털 데이터를 아날로그 출력 장치에 전달할 수 있습니다. 오늘은 DAC의 기본 개념과 사용 방법을 학습하겠습니다.

1. DAC의 기본 개념

DAC는 이산적인 디지털 값을 연속적인 아날로그 신호로 변환합니다. 일반적으로 오디오 신호 출력, 아날로그 센서 신호 생성 등에 사용됩니다.

 

DAC의 주요 특성

  • 분해능(Resolution): DAC가 생성할 수 있는 아날로그 값의 정밀도. 예를 들어, 8비트 DAC는 0부터 255까지의 값을 출력할 수 있습니다.
  • 참조 전압(Reference Voltage): DAC 출력의 최대 전압 값입니다. 예를 들어, 5V 참조 전압에서 8비트 DAC는 0V에서 5V까지 256 단계로 출력을 생성할 수 있습니다.

2. DAC 설정 및 사용

Arduino와 같은 보드에서 기본적으로 DAC 기능을 제공하지 않지만, 외부 DAC 칩을 사용하여 DAC 기능을 구현할 수 있습니다. 여기서는 MCP4725 DAC 모듈을 사용하여 DAC 기능을 구현하는 방법을 설명하겠습니다.

 

MCP4725 DAC 모듈

MCP4725는 I2C 인터페이스를 사용하는 12비트 DAC입니다. 아두이노와 같은 보드와 쉽게 연결할 수 있습니다.

 

하드웨어 연결

  1. MCP4725 연결:
    • VCC: 5V 또는 3.3V
    • GND: GND
    • SCL: Arduino A5 (I2C 클럭)
    • SDA: Arduino A4 (I2C 데이터)

3. MCP4725 라이브러리 설치

MCP4725 라이브러리를 설치하여 아두이노에서 쉽게 사용할 수 있습니다.

  1. Arduino IDE 라이브러리 매니저 열기:
    • Sketch -> Include Library -> Manage Libraries...
  2. 라이브러리 검색 및 설치:
    • MCP4725를 검색하고, Adafruit MCP4725 라이브러리를 설치합니다.

4. 예제: 아날로그 출력 생성

다음 예제는 MCP4725 DAC 모듈을 사용하여 디지털 값을 아날로그 출력으로 변환하는 방법을 보여줍니다.

#include <Wire.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

void setup() {
    Serial.begin(9600);
    dac.begin(0x60); // I2C 주소가 0x60인 MCP4725 초기화
}

void loop() {
    for (uint16_t i = 0; i < 4096; i += 10) {
        dac.setVoltage(i, false); // 디지털 값을 아날로그 출력으로 설정
        delay(10);
    }
    delay(1000);
}

 

위 예제에서는 Adafruit_MCP4725 라이브러리를 사용하여 MCP4725 DAC 모듈을 초기화하고, setVoltage 함수를 사용하여 디지털 값을 아날로그 출력으로 변환합니다. 이 예제에서는 0부터 4095까지의 디지털 값을 출력합니다.

 

5. 고급 DAC 사용

DAC를 사용하여 다양한 아날로그 신호를 생성할 수 있습니다. 예를 들어, 삼각파, 구형파, 사인파 등을 생성할 수 있습니다.

 

예제: 삼각파 신호 생성

다음 예제는 DAC를 사용하여 삼각파 신호를 생성하는 방법을 보여줍니다.

#include <Wire.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

void setup() {
    Serial.begin(9600);
    dac.begin(0x60); // I2C 주소가 0x60인 MCP4725 초기화
}

void loop() {
    for (uint16_t i = 0; i < 4096; i += 10) {
        dac.setVoltage(i, false); // 상승 구간
        delay(1);
    }
    for (uint16_t i = 4095; i > 0; i -= 10) {
        dac.setVoltage(i, false); // 하강 구간
        delay(1);
    }
}

 

마무리

오늘은 디지털-아날로그 변환(DAC)의 기본 개념과 사용 방법을 학습했습니다. DAC를 사용하여 디지털 값을 아날로그 신호로 변환하고, 다양한 아날로그 출력을 생성하는 방법을 익혔습니다. 다음 날에는 온도 센서 제어에 대해 더 깊이 알아보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 10 예고

다음 날은 "온도 센서 제어"에 대해 다룰 것입니다. 온도 센서를 사용하여 온도를 측정하고, 측정된 값을 처리하는 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형