반도체 Study/STM32

STM32 - DAC (DAC를 통한 LED 밝기 조절)

잇(IT) 2024. 6. 8. 22:19
728x90

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를 통해 전압이 출력되는지 확인할 수 있다.

 

멀티미터를 통해서 실제 전압을 측정할 수 있다.

 

728x90