[stm32] ADC multi channel 값 읽기 (DMA 방식 이용)

희희구리·2023년 5월 18일
0

stm32

목록 보기
1/2
post-thumbnail
post-custom-banner

1. 핀 설정

ioc 파일에서 설정 해야된다.
각 보드의 데이터 시트를 살펴보면 ADC을 연결할 핀이 나올 것이다.
나의 경우, PA4-5에 ADC을 연결해야 했다.

2. ADC 설정

이런 식으로, PA4-5의 우클릭을 해보면, ADC에 설정이 있는 것을 볼 수 있다.
이렇게, 핀에 ADC IN4-IN5로 설정해줬다.

ADC 설정을 열어, IN4-5에 체크해주면 된다.
멀티 채널을 읽을 때는 DMA 방식을 이용하면 쉽게 읽힌다.

따라서, DMA Setting을 열어 ADD을 눌러 ADC을 추가해주고, Mode는 Circular로 설정해준다.

3. Parameter 설정

그 다음, Parameter Settings 에서 ADC_Setting에 DMA Continuous Conversion Mode을 Enabled로 만든다.

4. 실행 코드

이후, 코드는 간단하다.
자신이 실행시키고 있는 함수 main에 아래 코드를 추가하면 된다.

extern ADC_HandleTypeDef hadc;		//나의 경우 다른 파일에서 실행하고 있기에 extern로 가져왔음!

uint16_t adcVal[3];					//adc값 저장하기 위함
HAL_ADC_Start_DMA(&hadc, (uint16_t*)adcVal, 2);
printf("%d %d\r\n",adcVal[0],adcVal[1]);		//2개의 채널에서 나오는 adc값 출력됨.

이 방식으로 나는 조이스틱의 ADC값 2개를 받아 모터를 제어하는 로직을 구현했다.

profile
beginner :>
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 3월 6일

제가 fw는 잘 몰라서 그러는데요. 올려주신 블로그 마지막 실행코드에
uint16_t adcVal[3]; 를 선언하면 배열변수가 adcVal[0], adcVal[1], adcVal[2] . 이렇게 3개가 선언되자나요
두개의 adc 값을 읽을려면 " uint16_t adcVal[2]; " 로 해서 변수를 2개로 하는게 아닌 3개로 하는 이유가 있을까요??

1개의 답글