우리 보드 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.c 에 HAL_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하면 해결된다.
'임베디드 쌩초보 공부 > STM32' 카테고리의 다른 글
stm32. adc 채널 여러개 측정 (0) | 2022.01.04 |
---|---|
STM32 Adc 개요 & Adc 채널 여러개 측정 (0) | 2021.12.27 |
Stm32 cube ide hal 을 이용한 uart tx (1) | 2021.12.17 |
STM32 CubeIDE , HAL을 사용한 Uart/Usart 공부(2) Rx Polling (0) | 2021.12.15 |
STM32 CubeIDE , HAL을 사용한 Uart/Usart 공부(1) Rx Interrupt (2) | 2021.12.12 |