STM32F103 ADC Multi Channel 코드를 작성하는 예제입니다.
- ADC Multi Channel CUBEMX로 초기설정하기
- ADC Multi Channel 코드 작성하기 (현재 포스팅)
- CUBEMX로 ADC DMA 초기설정하기
- ADC DMA 코드 작성하기
- 코드 작성하기 – 인터럽트
- UART ADC 데이터 송신하기
코드를 생성했으니 본격적으로 코드를 작성해보자.
ADC Polling 방식으로 코드를 작성하려면 아래처럼 작성하라고 레퍼런스 메뉴얼에 적혀있다.
ADC를 사용하려면
- HAL_ADC_Start
- HAL_ADC_PollForConversion
- HAL_ADC_GetValue
를 하면 된댄다. 그러면 작성해보자.
여기선 채널이 2개이고 Discontinuous 숫자를 1로 했으니까
2개의 채널을 모두 읽고 싶다면 HAL_ADC_Start를 두번 호출해야한다.
HAL_ADC_Start
일단 ADC를 시작하려면 아래의 규칙을 충족시켜줘야한다.
함수 안에 adc의 핸들러를 넣어주면된다. 나는 adc1의 핸들러를 사용해줄 것이므로 hadc1의 주소를 넘겨주면 된다. 그렇다면 아래와 같이서술해주면 되겠지.
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion
ADC라고 바로바로 쓸 수 있는 것이 아니다. 아날로그 데이터가 디지털로 변환될 때 까지 기다려줘야한다. 이 함수를 호출하면 그 시점부터 데이터를 취득한다고 보면 될 듯 하다.
이 함수에는 두 개의 변수를 넣어줘야한다. 첫 번째는 당연히 핸들러를 넘겨줘야할 것이고, 두 번째는 타임아웃을 넣어주면된다. 만약에 discontinuous 모드를 사용하지 않았다면 채널이 2개가 될 것이다. 그렇다면 100을 넣어줬다면 100ms까지 기다려야 한다. 그러니까 HAL드라이버는 1채널용이라고 생각하는 편이 좋을 듯 하다.
나는 discontinuous 의 Number를 1로 설정했으니 당연히 1채널 씩 컨버젼이 이뤄질 것이다.
HAL_ADC_PollForConversion(&hadc1, 100);
HAL_ADC_GetValue
그 다음 데이터를 읽어주면 될 것이다. 데이터는 return되는 것을 받아야한다. 먼저 함수부터 확인해보자.
데이터 반환이 32비트인데 실제 데이터 반환되는 양은 16비트이므로 16비트로 선언해도 무난하겠다. 그냥 변수로 핸들러만 넘겨주면 된다 그래서 아래와 같이 적기만 하면 되겠다.
ADC_data = HAL_ADC_GetValue(&hadc1);
그래서 총합해서 코드를 작성하면 아래와 같이 될 것이다.
당연하지만 while문 안에 적어야 반복해서 동작한다.
오늘 포스팅은 여기서 끝!
안녕하세요 자세한 설명 감사히 잘 보았습니다. 혹시 함수에 대한 설명 이미지는 출처가 어떻게 될까요?
박태현님, 안녕하세요. 함수 설명은 STM32F1 HAL/LL Reference Manual입니다.
아마 구글링 검색하면 바로 찾을 수 있을 겁니다.
찾았습니다. 감사합니다. 추위 조심하시고 좋은 하루 보내세요.
감사합니다 좋은 하루 되세요.
좋은 글이네요. 진작에 이걸 먼저 봤어야됐는데.. 감사합니다!
감사합니다! 행복한 하루 되세요 🙂