이번엔 m4보드에서 adc를 사용해보려고 한다. adc를 사용하는 순서는 이렇다.
1. ADC 클록 활성화
2. 사용하려는 핀에 대해 GPIO 클럭을 사용하도록 설정합니다.
3. GPIO 핀을 아날로그 입력으로 구성하십시오.
4. ADC 속도 구성 (프리스케일러 / 샘플링 시간)
5. 연속 측정 모드 사용
사실 2번, 3번, GPIO설정은 필요하지 않을 때가 있다. 바로 내부 ADC를 사용할 때인데, m4보드에는 16개의 외부 ADC와 3개의 내부 ADC가 있다. 16개의 외부ADC는 각각의 GPIO핀에 할당되어있다.
이 외에 3개의 내부 ADC는 각각 CPU내부의 온도센서, 전류측정, 배터리 전압측정을 할 수 있는 ADC들이 들어있다. 이제부터 한번 사요을 해보자.
일단 ADC설정에 필요한 항목들을 들여다보자.
▶Clock Prescaler : ADC에 사용할 클럭을 몇으로 나누어주느냐를 설정한다.
▶Resolution : m4보드에서는 ADC를 12bit, 10bit, 8bit, 6bit중 원하는 설정으로 받을 수 있다. bit가 커질수록(더 정밀하게 받을수록) 값을 받는 시간은 늘어난다. 각 설정당 한 2~3 cycle정도? 10~20ns정도인듯하다.
▶Data Alignment : 받은 데이터를 우로 정렬할건지 좌로 정렬 할건지 정한다. 보통은 다 우로 정렬(Right aligment)을 한다.
▶Scan Conversion Mode : 여러개의 ADC를 동시에 사용할 때, 각각의 ADC를 따로 받을건지(?), 아니면 한번에 쭉 받을 건지를 결정한다. 여러개의 ADC를 받을 때에는 Enable하는 것이 좋다.
▶Continuous Conversion mode : ADC를 한번만 받을 것인지, 계속해서 받을 것인지를 설정한다.
Discontinuous Conversion Mode : Continuous Conversion mode와 반대인듯하다. 솔찍히 왜 있는지 정확히는 모르겠다.
<Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts).
일반 그룹의 변환 시퀀스가 전체 시퀀스 / 불연속 시퀀스 (연속 된 부분으로 세분화 된 주 시퀀스)에서 수행되는지 여부를 지정합니다.>라는데........ 어쨌든 Continuous Conversion mode가 Enable이 되면 자동으로 설정이 버려진다고 되어있다.
▶DMA Continuous Requests : DMA를 사용할 것인지를 물어본다. DMA란 직접 메모리 접근( Direct Memory Access,DMA )로, ADC값을 받는 식을 따로 써주지 않고, 그냥 배열 하나 정해놓고 여기다 자동으로 값을 넣어주세요...하면 넣어주는 기능을 하는 레지스터이다. 편리하긴 하나 추가적으로 설정을 해주어야 한다.
▶End Of Conversion Selection : 하나의 채널을 마치고 EOC flag를 넣어줄건지, 모든 ADC를 마치고 EOC flag를 넣어줄 건지를 결정을 한다.
와.......정말 많다. 블로그에 직접 쓰는 것도 힘들었지만 직접 사용할 때에도 설정이 너무 많아서 힘들었다. 게다가 각각의 기능들을 알아야하니.... 더 슬픈점은 이것이 끝이 아니다. 아직 더 많은 기능이 남아있으니.. 바로 ADC채널설정이다.
▶Number Of Conversion : 몇개의 ADC를 변환을 할 것이냐를 정해준다.
▶Rank : 여러개의 ADC를 설정해 줄 경우, 어떤 순서대로 값을 받을지를 정해준다.
▶SamplingTime : 이게 꽤 중요한데, Resolution이 12bit값을 받을 때, 15ADC Clock cycles가 필요하다고 나온다. 즉 15cycle 이하로 놓으면 값이 잘 안 받아 진다는 소리! 그러므로 무조건 빠르다고 좋은 것이 아니라 적당히 설정을 해야 한다.
여기까지가 대략적인 ADC설정이다. GPIO는 솔찍히 설정할 것이 몇 없고, Timer Interrupt는 정당히 있었는데, ADC는 개많다. ㅠㅠ
일단 인터넷에서 본(아마 CUBEMX로 돌린) ADC설정 소스이다. 나는 CPU내부의 온도센서를 이용해서 LED의 밝기를 변화시키는 소스를 짰었는데 일단 ADC값을 받고, 인터럽트를 돌린다. 인터럽트 서비스 루틴 소스에 LED를 키고 끄기를 설정해 놓았다. 위 그림에서는 ADC_ISR 함수가 그 소스이다. 나는 일단 DMA도 사용을 할 것이라 DMA도 Enable로 놓았다. 위 설정대로 한 뒤에, HAL_ADC_Start_IT(&g_AdcHandle);라고 main에 써주면 바로 된다. b^^
이렇게 기본 설정만 알아봐도 많았는데... 이걸 레지스터로 보려니 약간은 막막했다. 어차피 기능은 똑같았지만 더 막막한 느낌이랄까...뭐가 필수인지도 모르겠고...에휴.
다음 포스팅에선 DMA설정에 대해 자세히 알아보자!
- 11월 21일 추가 -
왜 인터럽트를 실행하면 xxx_IRQHandler로 들어가는지 궁금했는데 디버거를 사용해보니 임의의 주소에서 저 함수를 호출하는 게 발견되었다. 타고 들어가보니 어셈으로 짜여져있는 것을 확인했고... 결국 내 맘대로 바꾸고 싶으면 어셈블리어를 공부해야 한다. 흠... 능력있는 사람이 되기 힘들구만
또한 ADC는 기능이 많다. 여러가지 경우의 수(가능한 조합)이 30가지는 넘는다고 하고, 그 모든 조합에 대한 설명이 있는 매뉴얼도 찾아보면 있다고 한다. 여기에서 가장 내 목적에 맞는 조합으로 쓰면 될 듯하다.
※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.
'공부 > STM32F407(m-4보드)' 카테고리의 다른 글
STM32F407 5장. ADC인터럽트를 Timer와 연동시켜 내가 원하는 타이밍에 ADC값 받기(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
---|---|
STM32F407 4장. DMA(Direct Memory Access)(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
STM32F407 2장. 타이머 인터럽트(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
STM32F407 1장. GPIO(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |