STM32 아날로그 신호 출력 DAC 설정하기
이번 포스팅에서는 STM32 마이크로컨트롤러의 DAC(Digital to Analog Converter)를 사용하여 아날로그 신호를 출력하는 방법을 소개하겠습니다. STM32CubeIDE를 활용하여 DAC의 IO 설정을 진행하고, 이를 통해 PWM이 아닌 아날로그 형태의 신호를 출력하는 과정에 대해 설명해 드리겠습니다. DAC의 기본 개념부터 코드 예제까지 함께 다루어 보며, STM32 개발의 이해도를 높여보세요.
1. DAC(Digital to Analog Converter)의 개념
DAC는 디지털 신호를 아날로그 신호로 변환해 주는 장치입니다. STM32 마이크로컨트롤러에는 하나 이상의 DAC 채널이 내장되어 있으며, 이를 통해 PWM(Pulse Width Modulation) 대신 실제 아날로그 신호를 생성할 수 있습니다. 아날로그 출력은 소리, 전압 제어, 조명 밝기 조절 등 다양한 어플리케이션에서 유용하게 사용됩니다.
STM32의 DAC 모듈은 12비트 해상도를 가지며, 다양한 참조 전압에 따라 0~3.3V 사이의 아날로그 값을 출력할 수 있습니다. 이 포스팅에서는 STM32CubeIDE를 사용하여 DAC 설정 및 제어하는 방법에 대해 자세히 다뤄보겠습니다.
2. STM32CubeIDE를 이용한 IO 설정
STM32CubeIDE는 STM32 마이크로컨트롤러의 설정을 쉽게 할 수 있도록 도와주는 통합 개발 환경입니다. 특히 Peripheral 설정, Pin 구성, Clock 설정 등을 GUI 환경에서 간편하게 할 수 있습니다. 여기서는 DAC 핀을 설정하고 아날로그 출력을 준비하는 방법을 설명하겠습니다.
2.1 프로젝트 생성하기
먼저 STM32CubeIDE를 실행한 뒤, 새로운 프로젝트를 생성하세요.
- File > New > STM32 Project 메뉴를 선택합니다.
- 사용하고자 하는 STM32 마이크로컨트롤러 또는 보드를 선택합니다. 이번 예제에서는 STM32F429ZI를 사용합니다.
- 프로젝트 이름을 입력하고 Finish를 눌러 프로젝트를 생성합니다.
2.2 핀 구성 및 DAC 설정하기
프로젝트가 생성되면 Pinout & Configuration 화면이 나타납니다. 여기에서 DAC의 출력 핀을 설정합니다.
- Pinout 탭에서 DAC 출력을 위해 사용될 핀을 선택해야 합니다. STM32F429ZI의 경우, DAC1의 채널 1은 PA4 핀에 연결됩니다.
- PA4 핀을 클릭하고 DAC_OUT1로 설정합니다.
- Configuration 탭에서 DAC의 설정을 진행합니다.
- DAC1을 클릭하여 설정을 엽니다.
- Trigger는 기본적으로 None으로 설정하고, 원하는 경우 타이머나 외부 이벤트로 트리거할 수 있습니다.
- Output Buffer는 선택하여 출력 특성을 조정할 수 있습니다. 기본값은 사용으로 두세요.
2.3 Clock 설정하기
Clock Configuration 탭으로 이동하여 시스템 클럭을 설정합니다. 일반적으로 기본값으로 두어도 되지만, 특정 응용에서 타이밍을 맞추기 위해 조정할 수 있습니다. 이번 예제에서는 기본 클럭 설정을 사용하겠습니다.
2.4 코드 생성하기
모든 설정이 완료되면 Project > Generate Code 버튼을 눌러 초기화 코드를 생성합니다. 이 코드는 HAL 라이브러리를 사용하여 DAC와 관련된 초기화를 자동으로 처리합니다.
3. DAC 코드 작성하기
이제 생성된 코드에 DAC 출력을 위한 코드를 추가하겠습니다. DAC는 일반적으로 정적 값, 삼각파, 사인파 등을 출력하는 데 사용할 수 있으며, 이번 예제에서는 간단하게 정적 아날로그 값을 출력해 보겠습니다.
3.1 HAL 라이브러리를 사용한 DAC 초기화
생성된 프로젝트의 Src/main.c 파일을 열고, 아래와 같이 DAC 출력을 위한 코드를 추가합니다.
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private variables ---------------------------------------------------------*/
DAC_HandleTypeDef hdac;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DAC_Init(void);
/* Main program --------------------------------------------------------------*/
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DAC_Init();
/* Start DAC */
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
/* Set DAC output to mid-scale (approximately 1.65V for 3.3V reference) */
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);
/* Infinite loop */
while (1)
{
// 아날로그 신호를 지속적으로 출력합니다.
}
}
/* DAC Initialization Function */
static void MX_DAC_Init(void)
{
DAC_ChannelConfTypeDef sConfig = {0};
/* DAC Peripheral clock enable */
__HAL_RCC_DAC_CLK_ENABLE();
/* DAC GPIO Configuration
PA4 ------> DAC_OUT1
*/
hdac.Instance = DAC;
if (HAL_DAC_Init(&hdac) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
/* Configure DAC channel OUT1 */
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
/* Channel configuration Error */
Error_Handler();
}
}
/* GPIO Initialization Function */
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
}
/* System Clock Configuration */
void SystemClock_Config(void)
{
// 시스템 클럭 설정 코드 (STM32CubeIDE에서 자동 생성됨)
}
void Error_Handler(void)
{
while(1)
{
// 오류 발생 시 멈추기
}
}
3.2 코드 설명
- HAL_DAC_Start(&hdac, DAC_CHANNEL_1);: DAC1의 채널 1 출력을 시작합니다.
- HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);: DAC 출력 값을 설정합니다. 여기서는 12비트 해상도에서 2048(절반 값)을 설정하여 약 1.65V의 출력을 생성합니다.
4. DAC 출력 확인하기
위의 코드를 빌드하고 마이크로컨트롤러에 업로드한 뒤, 오실로스코프나 멀티미터를 사용하여 PA4 핀에서 아날로그 출력 전압을 확인할 수 있습니다. 설정한 값에 따라 0V에서 3.3V 사이의 전압이 출력됩니다. 이번 예제에서는 약 1.65V의 출력을 확인할 수 있습니다.
STM32의 DAC는 매우 다양한 용도로 사용될 수 있습니다. 간단한 전압 레벨 설정부터, 사운드 출력을 위한 아날로그 신호 생성까지 폭넓은 응용이 가능합니다. 이번 포스팅에서는 기본적인 DAC 설정과 정적 아날로그 신호 출력을 다뤘지만, 타이머와 결합하여 삼각파나 사인파를 출력하는 방법도 차후 포스팅에서 다뤄보겠습니다.
5. 마무리
이번 글에서는 STM32CubeIDE를 사용하여 DAC 설정을 진행하고, 간단한 아날로그 신호를 출력하는 방법에 대해 알아보았습니다. STM32의 강력한 DAC 기능을 활용하면 PWM 방식과 달리 부드러운 아날로그 출력을 구현할 수 있어 다양한 어플리케이션에 유용하게 활용될 수 있습니다.
다음 포스팅에서는 타이머를 사용하여 주기적으로 변화하는 아날로그 신호를 출력하는 방법을 다뤄보겠습니다. DAC와 타이머를 결합하면 매우 유용한 신호 발생기를 쉽게 구현할 수 있으니 많은 기대 부탁드립니다.
'STM32' 카테고리의 다른 글
STM32 FreeRTOS - 실시간 운영체제 프로젝트 가이드 (0) | 2024.11.29 |
---|---|
STM32 인터럽트와 EXTI 설정 (0) | 2024.11.28 |
STM32 ADC 설정 및 사용하기 (0) | 2024.11.26 |
STM32 SPI 설정 및 활용 가이드 (0) | 2024.11.25 |
STM32 I2C 설정 및 센서 통신 예제 (0) | 2024.11.24 |