ADC(Analog Digital Converter)란
ADC란 뜻 그대로 아날로그를 디지털 컨버터로 변환하는 과정이다.
외부에서의 센서 값, 엔코더 등 아날로그 적인 신호를 받아 MCU 내부에서 디지털로 변환 후 처리하는 작업이다.
ADC의 모드
1. 단일(Single) 변환 모드
단일 변환 모드에서 AD 변환기는 변환을 1번만 수행한다.
ADC_CR2 레지스터의 CONT 비트를 0으로 두면 단일 변환 모드로 설정된다.
ADC_CR2 레지스터의 ADON 비트가 설정되거나 또는 외부 트리거 입력이 인가되면 변환이 시작된다.
2. 연속(Continuous) 모드
연속 변환 모드에서 AD 변환기는 하나의 변환이 완료되면 바로 다음의 변환을 시작한다.
레지스터의 CONT 비트를 1로 두면 연속 변환 모드로 설정된다.
ADC_CR2 레지스터의 ADON 비트가 설정되거나 또는 외부 트리거 입력이 인가되면 변환이 시작된다.
3. 스캔(Scan) 모드
스캔 모드는 채널 그룹 내의 모든 채널들을 순서대로 스캔하여 변환하는 모드이다.
ADC_CR1 레지스터의 SCAN 비트를 1로 두면 스캔 모드로 설정된다.
이 모드에서는 채널 그룹에 포함된 모든 채널들이 미리 정해진 순서를 따라 변환된다.
연속 변환 모드인 경우 스캔 모드의 동작이 연속적으로 일어나게 된다.
4. 비연속 모드
비연속 모드는 채널 그룹 내의 일부 채널을 미리 정해진 순서대로 변환하는 모드이다.
외부 트리거 신호가 입력되면 n개(n <= 8) 채널의 변환만 이루어진다.
다시 외부 트리거 신호가 입력되면 다음의 n개의 변환이 이루어지며,
n개가 되지 않더라도 정해진 변환 순서의 끝이 되면 그대로 종료된다.
AD 변환 데이터의 정렬 방법
AD 변환기의 데이터 레지스터에 데이터를 저장하기 위한 정렬 방식에는
오른쪽 정렬(Right Aligned)과 왼쪽 정렬(Left Aligned) 방식의 두 가지 방법이 있음.
오른쪽 정렬의 경우, 인젝티드 그룹은 최상위 비트 4개가 SEXT로 설정되고
레귤러 그룹의 경우에는 최상위 비트 4개가 0으로 설정된다.
왼쪽 정렬의 경우, 인젝티드 그룹은 최상위 비트 1개가 SEXT로 설정되며 최하위 비트 3개는 0으로 설정된다.
레귤러 그룹의 경우는 최하위 비트 4개가 모두 0으로 설정된다.
SEXT : 변환 결과가 음수인가 양수인가에 대한 부호를 나타내는 값
ADC 초기 설정용 구조체
함수 명
|
설명
|
ADC_InitTypeDef
|
ADC의 초기 설정을 위한 구조체
[DataType]
uint32_t DataAlign : ADC의 데이터 정렬 방법 설정
ADC_DATAALIGN_RIGHT
ADC_DATAALIGN_LEFT
uint32_t ScanConvMode : 레귤러와 인젝티드 그룹의 시퀀스 설정
ADC_SCAN_DISABLE
ADC_SCAN_ENABLE
uint32_t ContinuousConvMode : 레귤러 그룹의 경우 single or continuous 모드 설정
ENABLE
DISABLE
uint32_t NbrOfConversion : 레귤러 그룹 시퀀스가 몇 개의 채널을 변환 할 것인지 rank 값을 가지며 Min_Data = 1 ~ Max_Data = 16 사이의 값
uint32_t DiscontinuousConvMode : 레귤러 그룹의 변환 순서 설정
ENABLE
DISABLE
* Discontinuous 모드는 ScanConvMode가 Eanble로 설정된 경우만 사용 가능하고 Discontinuous 모드는 Continuous 모드가 Disable 설정된 경우만 사용 가능
uint32_t NbrOfDiscConversion : Discontinuous 변환의 순번을 설정
* DiscontinuousConvMode를 Disable 시 NbrOfDiscConversion의 설정 값 무시
uint32_t ExternalTrigConv : 레귤러 그룹의 변환을 트리거 하는데 사용되는 외부 이벤트를 선택하고, ADC_SOFTWARE_START로 설정하면 외부 트리거가 무시되며 외부 트리거를 설정한 경우, 트리거는 상승 에지가 된다.
ADC_SOFTWARE_START
ADC_EXTERNALTTRIGCONV_TC_CC1
ADC_EXTERNALTTRIGCONV_T1_CC2
ADC_EXTERNALTTRIGCONV_T2_CC2
ADC_EXTERNALTTRIGCONV_T3_TRGO
ADC_EXTERNALTTRIGCONV_T4_CC4
ADC_EXTERNALTTRIGCONV_EXT_IT11
ADC_EXTERNALTTRIGCONV_T2_CC3
ADC_EXTERNALTTRIGCONV_T3_CC1
ADC_EXTERNALTTRIGCONV_T5_CC1
ADC_EXTERNALTTRIGCONV_T5_CC3
ADC_EXTERNALTTRIGCONV_T8_CC1
ADC_EXTERNALTTRIGCONV_T1_CC3
ADC_EXTERNALTTRIGCONV_T8_TRGO
|
ADC 채널 선택용 구조체
함수 명
|
설명
|
ADC_ChannelConfTypeDef
|
ADC의 채널 설정을 위한 구조체
[DataType]
uint32_t Channel : 레귤러 그룹의 경우 설정 할 채널을 선택
ADC_CHANNEL_x (0 ~ 17, TEMPSENSOR, VREFINT)
uint32_t Rank : 레귤러 그룹의 시퀀스의 랭크 순서(채널의 변환 순서) 설정
ADC_REGULAR_RANK_x (1 ~ 16)
* 어떤 채널의 변환순서를 변경하고 싶은 경우는 그 채널의 변환순서를 새로운 값
으로 설정하면 됨(이 전의 설정 값에 overwrite 됨)
uint32_t SamplingTime : 샘플링 시간 설정
ADC_SAMPLETIME_1CYCLE_5 : Sampling Time 1.5 ADC clock cycle
ADC_SAMPLETIME_7CYCLE_5 : Sampling Time 7.5 ADC clock cycle
ADC_SAMPLETIME_13CYCLE_5 : Sampling Time 13.5 ADC clock cycle
ADC_SAMPLETIME_28CYCLE_5 : Sampling Time 28.5 ADC clock cycle
ADC_SAMPLETIME_41CYCLE_5 : Sampling Time 41.5 ADC clock cycle
ADC_SAMPLETIME_55CYCLE_5 : Sampling Time 55.5 ADC clock cycle
ADC_SAMPLETIME_71CYCLE_5 : Sampling Time 71.5 ADC clock cycle
ADC_SAMPLETIME_239CYCLE_5 : Sampling Time 239.5 ADC clock cycle
|
ADC 핸들 설정 구조체
함수 명
|
설명
|
ADC_HandleTypeDef
|
ADC의 핸들 설정을 위한 구조체
[DataType]
ADC_TypeDef * Instance : ADC 이름 (Ex : ADC 1)
ADC_InitTypeDef Init : ADC의 초기 설정을 위한 ADC_Init Type Def 구조체
__IO uint32_t NbrOfConversionRank : ADC Conversion Rank Counter
DMA_HandleTypeDef* DMA_Handle : DMA Handler 포인터
HAL_LockTypeDef Lock : ADC Locking Object
__IO HAL_ADC_StateTypeDef State : ADC의 통신상태
__IO uint32_t ErrorCode : ADC의 에러 코드
|
ADC 초기화 및 초기화 해제 함수
함수 명
|
설명
|
HAL_ADC_Init
(ADC_HandleTypeDef * hadc)
|
파라미터 hadc의 설정 값에 따라 ADC와 레귤러 그룹 초기화
[Parameter] : hadc : ADC Handle
[Return] : HAL status
|
HAL_ADC_DeInit
(ADC_HandleTypeDef * hadc)
|
ADC MSP와 ADC 주변장치를 해제
[Parameter] : hadc : ADC Handle
[Return] : HAL status
|
ADC 주변 장치 및 상태 함수
함수 명
|
설명
|
HAL_ADC_ConfigChannel
(ADC_HandleTypeDef * hadc,
ADC_ChannelConfTypeDef * sConfig)
|
파라미터 sConfig에 설정된 값으로 ADC 채널의 동작조건 설정
[Parameter] : hadc : ADC Handle
sConfig : 레귤러 그룹을 위한 ADC 채널 구조체
[Return] : HAL status
|
HAL_ADC_GetState
(ADC_HandleTypeDef * hadc)
|
ADC의 동작상태 값을 반환
[Parameter] : hadc : ADC Handle
[Return] : HAL status
|
HAL_ADC_GetError
(ADC_HandleTypeDef * hadc)
|
ADC의 에러 상태를 반환
[Parameter] : hadc : ADC Handle
[Return] : ADC 에러 코드
|
ADC 입출력용 함수
함수 명
|
설명
|
HAL_ADC_Start
(ADC_HandleTypeDef * hadc)
|
ADC를 활성화하고 레귤러 그룹의 변환을 시작
[Parameter] : hadc : ADC Handle
[Return] : HAL status
|
HAL_ADC_Stop
(ADC_HandleTypeDef * hadc)
|
ADC를 비활성화하고 변환을 정지
[Parameter] : hadc : ADC Handle
[Return] : HAL status
|
HAL_ADC_PollForConversion
(ADC_HandleTypeDef * hadc,
uint32_t Timeout)
|
레귤러 그룹의 변환이 완료될 때까지 기다림
[Parameter] : hadc : ADC Handle
Timeout : 타임 아웃 시간(msec)
[Return] : HAL status
|
HAL_ADC_Start_IT
(ADC_HandleTypeDef * hadc)
|
ADC를 활성화하고 레귤러 그룹의 변환 시작, 인터럽트 Enable
[Parameter] : hadc : ADC Handle
[Return] : 없음
|
HAL_ADC_Stop_IT
(ADC_HandleTypeDef * hadc)
|
ADC를 비활성화하고 레귤러 그룹 변환 정지, 인터럽트 Disable
[Parameter] : hadc : ADC Handle
[Return] : 없음
|
HAL_ADC_Start_DMA
(ADC_HandleTypeDef * hadc,
uint32_t pData, uint32_t Length)
|
ADC를 활성화하고 레귤러 그룹의 변환을 시작하고 DMA를 Enable 후 변환 결과를 DMA를 통해 전달
[Parameter] : hadc : ADC Handle
pData : 해당 데이터
Length : 데이터 크기
[Return] : 없음
|
HAL_ADC_STOP_DMA
(ADC_HandleTypeDef * hadc)
|
ADC를 비활성화하고 레귤러 그룹의 변환 정지, DMA Disable
[Parameter] : hadc : ADC Handle
[Return] : 없음
|
HAL_ADC_GetValue
(ADC_HandleTypeDef * hadc)
|
레귤러 그룹의 ADC 변환 결과 값을 읽어옴
[Parameter] : hadc : ADC Handle
[Return] : ADC 변환 결과 값
|
HAL_ADC_IRQHandler
(ADC_HandleTypeDef * hadc)
|
ADC 인터럽트의 처리를 위한 인터럽트 핸들러 함수
[Parameter] : hadc : ADC Handle
[Return] : 없음
|
HAL_ADC_ConvCpltCallback
(ADC_HandleTypeDef * hadc)
|
ADC가 Non Blocking 모드로 동작할 경우 변환이 완료되면 호출되는 콜백 함수
[Parameter] : hadc : ADC Handle
[Return] : 없음
|
ADC 구동용 매크로
ADC 변환 그룹
ADC_REGULAR_GROUP
ADC_INJECTED_GROUP
ADC_REGULAR_INJECTED_GROUP
ADC 에러 코드
HAL_ADC_ERROR_NONE
HAL_ADC_ERROR_INTERNAL
HAL_ADC_ERROR_OVR
HAL_ADC_ERROR_DMA
ADC 매크로
__HAL_ADC_ENABLE
__HAL_ADC_DISABLE
__HAL_ADC_ENABLE_IT
__HAL_ADC_DISABLE_IT
__HAL_ADC_GET_IT_SOURCE
__HAL_ADC_GET_FLAG
__HAL_ADCE_
'Embedded > STM32' 카테고리의 다른 글
[STM32] RCC 설정용 구조체 및 구동 함수 (0) | 2022.11.12 |
---|---|
[STM32] Timer (0) | 2022.11.12 |
[STM32] DAC(Digital Analog Convertor) (2) | 2022.11.12 |
[STM32] UART, USART (4) | 2022.11.12 |