본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 ] DAC 제어 (오실로스코프로 파형 확인)

by eteo 2022. 7. 18.

 

 

 

 

 

DAC : Digital to Analog Converter 디지털 신호를 아날로그 전압 신호로 변환하여 출력하는 장치를 말한다.

 

STM32F429 보드는 2채널의 12비트 DAC 컨버터가 있고

 

DAC CHANNEL_1의 출력핀은 PA4 (DAC_OUT1)

DAC CHANNEL_2의 출력핀은 PA5 (DAC_OUT2)

 

으로 정해져있다.

 

 

1.8v ~Vdda(3.3V) 사이의 별도의 Vref+ 기준전압을 따로 사용할 수도 있고 타이머의 TRGO (트리거 아웃풋)을 사용하는 것도 가능하다.

DHR에 로드된 데이터는 ABP1 1클럭 사이클 후 DOR 레지스터로 전송되고 데이터가 DOR 레지스터에 로드되면 DAC변환이 시작되어, t(SETTING) 시간 후 DAC_OUT pin을 통해 아날로그 값이 출력된다.

 

 

DAC의 출력전압은 0 ~ Vref+ 사이의 값을 가지며 다음과 같이 결정된다.

 

 

 

 

 

설정

 

 

소스코드

  /* USER CODE BEGIN 2 */
  HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
  HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
  uint32_t dac_value1=0;
  uint32_t dac_value2=0;
  /* USER CODE END 2 */
  
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value1);
	  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_8B_R, dac_value2);

	  if(dac_value1<4096){
		  dac_value1++;
	  }else{
		  dac_value1=0;
	  }

	  if(dac_value2<256){
		  dac_value2++;
	  }else{
		  dac_value2=0;
	  }

	  HAL_Delay(1);

/*	  for(dac_value=0; dac_value<=255; dac_value++){
		  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_8B_R, dac_value);
		  HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
		  HAL_Delay(1);
	  }*/
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

 

 

 

딜레이를 주지 않았을 때 파형

LED는 계속 켜있는 것처럼 보인다.

 

 

1ms 딜레이를 주었을 때

700

 

 

아래는 디버그 모드로

레지스터를 살펴본 것. DOR은 HAL_DAC_GetValue() 함수로도 확인 가능하다.

 

 

 

 

 

DAC 데이터 포맷

출처 : https://blog.naver.com/sees111/222345571373

단일(Single) DAC 채널

8비트 오른쪽 정렬 : DAC_DHR8Rx[7:0] 비트에 데이터 로드 (데이터 저장은 DHRx[11:4] 비트)

12비트 왼쪽 정렬 : DAC_DHR12Lx[15:4] 비트에 데이터 로드 (데이터 저장은 DHRx[11:0] 비트)

12비트 오른쪽 정렬 : DAC_DHR12Rx[11:0] 비트에 데이터 로드 (데이터 저장은 DHRx[11:0] 비트)

듀얼(Dual) DAC 채널

8비트 오른쪽 정렬

채널1 : DAC_DHR8RD[7:0] 비트에 데이터 로드 (데이터 저장은 DHR1[11:4] 비트)

채널2 : DAC_DHR8RD[15:8] 비트에 데이터 로드 (데이터 저장은 DHR2[11:4] 비트

12비트 왼쪽 정렬

채널 1 : DAC_DHR12LD[15:4] 비트에 데이터 로드 (데이터 저장은 DHR1[11:0] 비트)

채널 2: DAC_DHR12LD[31:20] 비트에 데이터 로드 (데이터 저장은 DHR2[11:0] 비트)

12비트 오른쪽 정렬

채널 1 : DAC_DHR12RD[11:0] 비트에 데이터 로드 (데이터 저장은 DHR1[11:0] 비트)

채널 2 : DAC_DHR12RD[27:16] 비트에 데이터 로드 (데이터 저장은 DHR2[11:0] 비트