DAC (Digital to Analog Converter)
디지털 신호를 아날로그로 전압 신호로 변환하는 출력 장치다.
STM32F429의 DAC 특징
2개(2채널)의 12비트 DAC 컨버터
- DAC1 : 출력 핀이 DAC_OUT1 (PA4)
- DAC2 : 출력 핀이 DAC_OUT2 (PA5)
- 다중 DAC 채널 독립 또는 동시 변환 가능하다.
- 각 채널마다 DMA 가능하다.
- 변환 시작을 위해 외부 트리거 신호를 사용 가능하다.
- Vref+의 입력 전압도 사용 가능하다.
단일 채널 사용 시
단일 DAC 채널의 경우 입력 데이터의 포맷은 3가지 방법이 가능하다.
1. 8bit 오른쪽 정렬 [7:0] 비트에 데이터를 로드
2. 12bit 왼쪽 정렬 [15:4] 비트에 데이터를 로드
3. 12bit 오른쪽 정렬 [11:0] 비트에 데이터를 로드
듀얼 채널 사용 시
듀얼 DAC 채널의 경우 입력 데이터의 포맷은 3가지 방법이 가능하다.
1. 8비트 오른쪽 정렬
- 채널 1 [7:0] 비트에 데이터를 로드
- 채널 2 ]15:8] 비트에 데이터를 로드
2. 12bit 왼쪽 정렬
- 채널 1 [15:4] 비트에 데이터를 로드
- 채널 2 ]31:20] 비트에 데이터를 로드
3. 12비트 오른쪽 정렬
- 채널 1 [11:0] 비트에 데이터를 로드
- 채널 2 [27:16] 비트에 데이터를 로드
DAC 출력 전압
DAC(output) = Vref * DOR/4095 (DOR(Data Output Register))
ex) 0.7V를 사용할 경우 Vref+ = 3.3V이면 DAC 값은 868이다.
LED 밝기 조절
DAC를 통해 2개의 채널 사용이 가능하다.
code 생성 시 위와 같이 DAC 초기화 관련 코드가 생성된다.
Pin4, 5번이 Analog 핀으로 생성된 것을 확인할 수 있다.
Driver의 dac.c 파일을 열게 되면 DAC 관련 함수들을 확인할 수 있다.
DAC의 2개의 채널을 사용하기 위한 코드다. CHNNEL을 구분하여 시작한다.
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value1);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dac_value2);
// if(dac_value1<4096 && dac_value2<4096)
if(dac_value2<4096)
{
// dac_value2 = dac_value2 + 1;
dac_value2 = dac_value2 + 4;
// dac_value2 = dac_value2 + 1;
}
else
{
dac_value2 = 0;
// dac_value2 = 0;
}
if(dac_value1<4096)
{
dac_value1 = dac_value1 + 2;
}
else
{
dac_value1 = 0;
}
HAL_Delay(1);
memset(buf1, 0, sizeof(buf1));
memset(buf2, 0, sizeof(buf2));
sprintf(buf1, "DAC1 Value : %lu\r\n", dac_value1);
sprintf(buf2, "DAC2 Value : %lu\r\n", dac_value2);
HAL_UART_Transmit(&huart3, (uint8_t *)buf1, strlen(buf1), 1000);
HAL_UART_Transmit(&huart3, (uint8_t *)buf2, strlen(buf2), 1000);
DAC를 통해 LED 2개를 2채널을 통해 사용하는 코드는 위와 같다.
dac_value1, 2는 각각 코드 내에서 값을 전달 받아 해당 값을 아날로그 신호로 전달한다.
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_L, dac_value2<<4);
(위의 코드에서는 12bit 우측 레지스터만 사용했지만 좌측 저장소를 사용하고 싶다면 위와 같이 12B_L로 지정하고 12B_R 저장소와 같은 값을 출력하기 위해서는 왼쪽 시프트 레지스터를 이용하여 출력하면 같은 값을 출력할 수 있다.)
현재 Nucleo 보드를 통해 최대 3.3V의 전압이 전달되고 있고, 변환 공식에 의해 0~4095에 맞는 전압이 전달되고 있다.
적, 녹, 청 LED마다 저항이 다르고 불을 키기 위한 최소 전압이 다르기 때문에 불이 켜지는 구간이 정해져있다.
적색 LED: 약 1.8V - 2.2V
녹색 LED: 약 2.0V - 3.2V
청색 및 백색 LED: 약 3.0V - 3.6V
위 조건 때문에 불빛이 계속해서 켜지는 것이 아닌 일정 시간 뒤에 불빛이 밝아지는 것을 확인할 수 있다.
오실로스코프를 통해 실제 DAC를 통해 전압이 출력되는지 확인할 수 있다.
멀티미터를 통해서 실제 전압을 측정할 수 있다.
'Embedded > STM32, Arduino' 카테고리의 다른 글
STM32 - LCD 문자 출력 (I2C) (0) | 2024.06.09 |
---|---|
STM32 - I2C 이론 (0) | 2024.06.09 |
STM32 - ADC값에 따른 LED 점멸 (Nucleo-144용 I/O 보드) (0) | 2024.06.01 |
STM32 - ADC 구현 (Polling, Interrupt, DMA / 아두이노 Plotter 모드로 그래프 확인) (0) | 2024.05.30 |
STM32 - ADC 이론 (DMA, ADC 함수) (0) | 2024.05.30 |