[STM32] ADC 사용하여 MQ-9 센서값 읽기

Eugene CHOI·2021년 10월 4일
0

STM32

목록 보기
7/8
post-thumbnail

본 포스팅에서는 F767ZI 보드를 사용합니다.


ADC 설정하기

F767ZI 보드는 총 3개의 ADC가 존재하고 각각 15개의 채널을 가지고 있습니다.
지금은 하나의 채널만 필요하기 때문에, A0핀에 해당하는 ADC1의 IN3을 사용하겠습니다.

데이터 시트를 보면 ADC1은 APB2에 연결 되어 있기 때문에 CLOCK 설정에서 유의하시면 되겠습니다.


NUCLEO는 일부 기종을 제외하고 12bit의 해상도를 가집니다. 0과 1을 가질 수 있는 12개의 숫자의 경우의 수는

212=40962^{12}=4096

이므로 ADC는 040950 \sim 4095의 범위를 가집니다.
하단 Configuration-Parameter Settings-Resolution 을 보면 확인할 수 있습니다.

123

셋팅 후 오른쪽의 칩 이미지를 보면 PA3이 활성화 된 것을 볼 수 있습니다.
User Label을 입력하여 추후 핀을 구분하기 쉽게 해 놓습니다.
그러면 설정이 완료되었으니 Alt+K를 눌러 generate code를 합니다.


ADC 값 읽어오기

ADC 값을 읽기 위해서는 3개의 함수가 필요합니다.

HAL_ADC_Start

ADC를 사용하도록 설정하고, conversion을 시작합니다.

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);

HAL_ADC_PollForConversion

Analog 신호가 Digital로 변환이 완료될 때까지 기다리도록 명령합니다. ms 단위로 Timeout을 설정하여 일정 시간 이상은 기다리지 않도록 설정할 수 있습니다.

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);

HAL_ADC_GetValue

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);
}
profile
Hi, my name is Eugene CHOI the Automotive MCU FW developer.

0개의 댓글