본문 바로가기
임베디드 쌩초보 공부/STM32

STM32 ADC Conversion

by 존버매니아.임베디드 개발자 2021. 12. 26.
반응형

우리 보드 MCU에서 사용가능한 adc 채널은 16개 있는거 같은데,

보드에 우리가 자유롭게 활용가능하게 외부 커넥터에 연결된 핀은 위의 6개 뿐인것 같다.

 

이 글에서는 일단 A0핀을 사용하는것을 전제로 진행한다.

PC5 에 해당되는 ADC채널

"ADC1_IN14" 채널이다.

이것은 보드 데이터시트의

table13. B-L4S5I-IOT01A Discovery kit for the IoT node I/O assignment

를 보면 나온다.


아래 그림처럼 cubeMx에서 PC5번 핀의 용도를 ADC1_IN14로 지정해주자.

 


아래 그림처럼 ADC1 모듈의 채널14에 대해서 설정을 해주자. 일단은 single-ended로 고른다.


설정사항을 저장하고 code gen한다.


codegen을 하면 이런저런 변화가 생기는데 주요한 변화사항을 적어보면

main.c MX_ADC1_Init 함수가 생성된다.

stm32l4xx_hal_msp.cHAL_ADC_MspInit 함수가 생성된다.


일단 우리는 인터럽트 , DMA 타입을 셋팅안했기 때문에 polling 방식으로 adc 측정을 해볼 것이다.

관련하여 HAL SW를 사용하는 방법은

HAL 유저매뉴얼에  챕터 7 HAL ADC Generic Driver에서

Configuration of top level parameters related to ADC 파트를 보면 전체적인 adc 모듈 사용방법이 적혀있고

configure 하고나서 컨버전 요청하고 결과값 읽는 부분관련해서는

Execution of ADC conversions <- 여기를 보면 나온다

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 500) == HAL_OK)
	{
      adc_value=HAL_ADC_GetValue(&hadc1);
      configPRINTF( ( "MyTask 1sec periodic is running .\r\n" ) );
      configPRINTF( ( "Adc Value : %d .\r\n",adc_value ) );
	}

위 코드를 실행하면 adc 측정 결과가 adc_value 라는 변수에 담겨있게 된다. 생각보다 사용방법이 매우 간단하다.

 

★유의사항

위 예시코드에 보면 hadc1 이라는 변수를 사용하고 있는데, 이것은 cubeMx에서 codegen하면

ADC_HandleTypeDef hadc1;

위와 같이 main.c 파일에 정의되는 함수이다.

만약 main.c가 아닌 다른 파일에서 이 변수를 사용하려면 extern으로 사용해야 할텐데,

ADC_HandleTypeDef는 구조체라서 저 구조체가 정의된 헤더파일을 다른 파일에서 include 해야 할 것이다.

이 때 해당 구조체가 정의된 헤더파일 이름은 st32l4xx_hal_adc.h 이지만 이것을 직접 include 하면

이유는 정확히 모르겠지만 빌드할때 에러가 발생한다.

 

그래서 내가 하려는 얘기가 뭐냐면. 해당 헤더파일을 직접 include 하지말고, 그냥 main.h 를 include하면 해결된다.

 

 

반응형