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 |