Embedded/STM32

[STM32] DAC(Digital Analog Convertor)

유제필 2022. 11. 12. 18:58

DAC(Digital Analog Convertor)란 이름 그대로 디지털을 아날로그로 변환하는 과정이다. 

쉽게 생각해서 ADC에 반대로 생각할 수 있다.

 

DAC 변환 과정

APB1_CLK에 맞게 DHRx(DAC Holding Register) 와 DORx(DAC Output Register)가 로딩된다. 

DAC_DORx에 직접 데이터를 로딩 하는 것은 허용되지 않으며, DAC_DHRx 레지스터(DHR8x, DHR12Lx, DHR8D, DHR12LD 또는 DAC_DHR12LD)를 통해 로딩해야 한다. 

 

DAC_DHRx 레지스터에 로드된 데이터는 1개의 ABP1 클럭 사이클 후 DAC_DORx 레지스터로 전송되고 

데이터가 DAC_DORx 레지스터에 로드되면 DA변환이 시작되고, t(SETTING) 시간 후 아날로그 값이 출력된다.

 

DAC 출력전압 : 0 ~ V(REF) + 사이의 값을 가진다. 

DAC(Output) = V(REF) x DOR/4095 ​ 

 

DAC는 8비트 또는 12비트 모드로 동작이 가능하고 높은 해상도를 위해 별도의 기준입력을 VREF+핀으로 인가하는 것도 가능하다.

DACx가 내부에서 입력되는 디지털 신호를 아날로그 값으로 변환 해 주게 되고,

12비트의 디지털 입력 값은 DHRx(Data Holding Register x)와 Control logicx 및 DORx(Data Output Register x)

레지스터를 통해 DAC로 전달된다.

변환된 아날로그 출력 값은 출력핀(DAC_OUTx)를 통해 외부로 출력된다.

 

DAC 데이터 포맷

단일(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] 비트)

 

DAC 주요 특징

1. DAC 채널

독립적이거나 동시에 사용이 가능한 12비트 DAC 컨버터가 있다.

 

2. DAC 트리거

DAC_TRIGGER_NONE 을 적용하면 DAC는 non-trigger로 진행 되고, DAC_OUT1, DAC_OUT2는

DHRx 레지스터에 한번 쓰게 되고 트리거를 사용할 경우 다음에 의해 트리거가 가능하다.

1) 외부 이벤트 DAC_TRIGGER_EXT_IT

2) 타이머 TRGO :

3) DAC_TRIGGER_SOFTWARE

 

3. DAC 출력 버퍼 모드 설정

각 DAC 채널은 출력 임피던스를 감소시키는데 사용할 수 있는 추력 버퍼를 지원한다.

sConfig.DAC_Out = DAC_OUTPUTBUFFER_ENABLE; // 출력 버퍼 활성화 설정

 

4. DAC 연결 설정

각 DAC 채널은 내부적으로 연결하여 사용하는 것도 가능

sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;

 

5. GPIO 설정

DAC 채널 중 1개를 사용하고, 다른 것을 사용하지 않을 경우 채널1은 ‘coupling 효과’로 인해 채널 2를 교란할 수 있고 채널2가 On되면 커플링 효과는 바로 없어짐

채널2의 커플링 효과를 없애려면 INPUT PULL-Up or Down 으로 설정 후 사용 전에 ANALOG로 설정한다.

 

6. DAC Wave Generation 속성

DAC 채널은 2가지 wave 생성 가능

1) 노이즈 Wave : HAL_DACEx_NoiseWaveGenerate()

2) Triangle Wave : HAL_DACEx_TriangleWaveGenerate()

 

7. DAC 데이터 타입

1) DAC_ALIGN_8B_R // 8비트 오른쪽 정렬

2) DAC_ALIGN_12B_L // 12비트 왼쪽 정렬

3) DAC_ALIGN_12B_R // 12비트 오른쪽 정렬

 

8. DAC 채널의 출력 전압 값

: DAC_OUTx = VERF+ *DOR/4095

DOR : Data Output Register

VERF : 입력 전압

Ex) DAC_OUT1 0.7 사용 시

VERF+ = 3.3V

DAC_OUT1 (3.3 * 868)/4095 = 0.7V

DAC 입력 값(DOR) = 868 설정

 

DAC 초기 설정 구조체

함수 명
설명
DAC_HandleTypeDef
DAC 초기 설정 구조체
[DataType]
DAC_TypeDef * Instance : ADC 이름 (Ex : ADC 1)
__IO HAL_DAC_StateTypeDef State : DAC의 통신상태
HAL_LockTypeDef Lock : DAC Locking Object
DMA_HandleTypeDef * DMA_Handle1 : 채널 1을 가르키는 DMA 핸들
DMA_HandleTypeDef * DMA_Handle2 : 채널 2를 가르키는 DMA 핸들
__IO uint32_t ErrorCode : DMA 에러코드

DAC 채널 설정 구조체

함수 명
설명
DAC_ChannelConfTypeDef
DAC 채널 설정 구조체
[DataType]
uint32_t DAC_Trigger : 외부 트리거의 사용여부 결정
DAC_TRIGGER_NONE : DAC1_DHRxxxx 레지스터의 임이의 값이 로드되면 자동적
으로 변환 시작, 외부 트리거는 사용하지 않음
DAC_TRIGGER_Tx(2 ~ 8)_TRGO : TIMx(2 ~ 8)_TRGO를 트리거의 외부 입력으로 사용
DAC_TRIGGER_EXT_IT9 : EXTI9를 트리거의 외부 입력으로 사용
DAC_TRGGER_SOFTWARE : 소프트웨어 트리거 사용
uint32_t DAC_OutputBuffer : DAC 채널 출력 버퍼의 Enable, Disable 여부 결정
DAC_OUTPUTBUFFER_ENABLE
DAC_OUTPUTBUFFER_DISABLE
 

DAC 구동용 함수

함수 명
설명
HAL_DAC_Init()
(DAC_HandleTypeDef * hdac)
Hdac의 설정 값에 따라 DAC 초기화
[Parameter] : hdac : DAC Handle
[Return] : HAL Status
HAL_DAC_DeInit
(DAC_HandleTypeDef * hdac)
DAC 초기화 해제
[Parameter] : hadc : DAC Handle
[Return] : HAL Status
HAL_DAC_Start
(DAC_HandleTypeDef * hdac,
uint32_t Channel)
DAC활성화 후 변환 시작
[Parameter] : hdac : DAC Handle
[Return] : HAL Status
HAL_DAC_Stop
(DAC_HandleTypeDef *
uint32_t Channel)
DAC 비활성화 후 변환 정지
[Parameter] : hdac : DAC Handle
[Return] : HAL Status
HAL_DAC_GetValue
(DAC_HandleTypeDef * hdac,
uint32_t Channel)
선택된 DAC 채널의 최종 변환결과 값을 읽어옴
[Parameter] : hdac : DAC Handle
[Return] : 없음
HAL_DAC_SetValue
(DAC_HandleTypeDef * hdac,
uint32_t Channel, uint32_t Alignment,
uint32_t Data)
DAC 입력 값 설정
[Parameter] : hdac : DAC Handle
Channel : DAC_CHANNEL_1, DAC_CHANNEL_2
Alignment : DAC_ALIGN_8B_R : 8비트 오른쪽 정렬
DAC_ALIGN_12B_L : 12비트 왼쪽 정렬
DAC_ALIGN_12B_R : 12비트 오른쪽 정렬
Data : DAC의 입력 값
[Return] : HAL Status
HAL_DAC_ConfigChannel
(DAC_HandleTypeDef * hdac,
DAC_ChannelConfTypeDef * sConfig,
uint32_t Channel)
DAC 채널의 동작조건 설정
[Parameter] : hdac : DAC Handle
sConfig : DAC 설정 구조체
Channel : DAC_CHANNEL_1, DAC_CHANNEL_2
[Return] : HAL Status
HAL_DAC_GetState
(DAC_Handle * hdac)
DAC의 동작 상태를 읽어옴
[Parameter] : hadc : DAC Handle
[Return] : HAL Status
HAL_DAC_GetError
(DAC_HandleTypeDef * hdac)
DAC 에러 상태를 읽어옴
[Parameter] : hadc : DAC Handle
[Return] : HAL Status

DAC 구동용 매크로

DAC 채널 선택

DAC_CHANNEL_1

DAC_CHANNEL_2

 

DAC 데이터 정렬

DAC_ALIGN_12B_R

DAC_ALIGN_12B_L

DAC_ALIGN_8B_R

 

DAC HAL 드라이버 매크로

__HAL_DAC_ENABLE : DAC 주변장치 활성화

__HAL_DAC_DISABLE : DAC 주변장치 비활성화

__HAL_DAC_CLEAR_FLAG : DAC Pending 플래그 초기화

__HAL_DAC_GET_FLAG : DAC 플래그 상태 변환

'Embedded > STM32' 카테고리의 다른 글

[STM32] RCC 설정용 구조체 및 구동 함수  (0) 2022.11.12
[STM32] Timer  (0) 2022.11.12
[STM32] ADC(Analog Digital Converter)  (0) 2022.11.12
[STM32] UART, USART  (4) 2022.11.12