본 포스팅에서는 F767ZI 보드를 사용합니다.
F767ZI 보드
는 총 3개의 ADC
가 존재하고 각각 15개의 채널
을 가지고 있습니다.
지금은 하나의 채널만 필요하기 때문에, A0핀에 해당하는 ADC1의 IN3을 사용하겠습니다.
데이터 시트를 보면 ADC1은 APB2에 연결 되어 있기 때문에 CLOCK 설정에서 유의하시면 되겠습니다.
NUCLEO는 일부 기종을 제외하고 12bit의 해상도
를 가집니다. 0과 1을 가질 수 있는 12개의 숫자의 경우의 수는
이므로 ADC는 의 범위를 가집니다.
하단 Configuration-Parameter Settings-Resolution 을 보면 확인할 수 있습니다.
1 | 2 | 3 |
---|---|---|
셋팅 후 오른쪽의 칩 이미지를 보면 PA3이 활성화 된 것을 볼 수 있습니다.
User Label을 입력하여 추후 핀을 구분하기 쉽게 해 놓습니다.
그러면 설정이 완료되었으니 Alt+K를 눌러 generate code를 합니다.
ADC 값을 읽기 위해서는 3개의 함수가 필요합니다.
ADC를 사용하도록 설정하고, conversion을 시작합니다.
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
Analog 신호가 Digital로 변환이 완료될 때까지 기다리도록 명령합니다. ms
단위로 Timeout을 설정하여 일정 시간 이상은 기다리지 않도록 설정할 수 있습니다.
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
ADC 변환이 완료된 데이터를 uint32_t
type으로 반환 받는 함수입니다.
uint32_t adc1 = HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
따라서 다음과 같은 코드가 작성됩니다.
HAL_ADC_GetValue 함수의 반환값은 uint32_t이지만 12bit의 데이터이기 때문에 uint16_t로 변수를 선언하여도 상관 없습니다.
while(1){
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint16_t adc1 = HAL_ADC_GetValue(&hadc1);
}