STM32 에서 ADC Polling conversion 하는 방법(1)

ADC 변환에는 크게 3가지로 구분 할 수 있습니다. 각각의 장단점은 아래와 같이 간단하게 말할 수 있습니다.

변환방법 장점 단점
Interrupt   - 변환시간 절약
 -  소프트웨어 트리거 사용가능
 -  하드웨어 트리거 사용가능
 -  잦은 인터럽트 유발
 -  인터럽트 처리가 늦으면 Overrun 발생
Polling  -  직관적인 사용성
 -  소프트웨어 트리거 사용가능
 -  변환시간 및 프로세싱 예측가능
 -  프로세서 점유율이 높아짐
 -  변환완료 처리가 늦어지면 Overrun 발생
 -  하드웨어 트리거 사용이 어려움
DMA  -  변환시간 절약
 -  하드웨어 트리거 사용가능
 -  설정의 복잡함
 -  변환완료 프로세스를 잘 처리하지 않으면 Overrun 발생

 

어플리케이션에 맞는 변환방법을 선택하면 사용성은 물론 최상의 성능을 구현할 수 있습니다. 

 

오늘은 Polling conversion에 대해 실험해 보도록 하겠습니다. 먼저 STM32G4의 ADC의 타이밍을 알아보겠습니다. 

STM32G4 ADC Timing

 

위의 예시는 여러가지 ADC 타이밍 중에서 가장 이해하기 쉬운 타이밍도인 것 같아 첨부했습니다. 총 4개의 Channel을 아래의 순서대로 Sequence로 Scan하여 변환하고 있습니다. 

  • CH1 → CH9 → CH10 → CH17

중간에 ADSTP을 걸어주어 두번째 Scan Conversion 이후 CH10 에서 변환을 멈추고 있습니다. Polling 방식을 이해하기 위해서는 SW 처리 부분과 HW 처리 부분을 잘 알고있어야 합니다.

 

그림에는 없는 대부분 CubeMX에서 핀설정, ADC 설정은 자동으로 해줍니다. 그 부분을 제외하고  위의 그림대로라면 아래와 같은 방식으로 F/W를 구현해 주면됩니다. 

 

  1. ADC START 
  2. EOC 확인
  3. EOC가 Set 되면 ADC_DR에서 데이터를 읽음
  4. 다음 채널 변환확인을 위해 EOC 다시 확인
  5. EOC가 Set 되면 ADC_DR에서 데이터를 읽음
  6. 채널 수 만큼 위의 EOC 확인 및 ADC_DR 읽기 반복
  7. Continuous Conversion Disable이면 ADCSTP가 자동으로 걸리고 Enable 이면 멈추고 싶을 때 ADCSTP를 수동으로 설정해야 함.

여기에서 가장 중요한 부분은 어디일까요? 

바로 EOC를 확인하고 ADC_DR에서 데이터를 읽는 타이밍입니다. 만약 EOC를 확인하고 ADC_DR에서 데이터를 곧바로 읽지 않고 지체(다른 Task나 인터럽트로 인한 지연)되고 있는 와중에 ADC Controller는 다음 Channel Conversion의 결과를 ADC_DR에 쓰는 시도를 하게 될 것이고 그 때 Overrun에러를 발생하게 되면 Overrun이 해결되기 전까지 ADC 동작을 멈추게 될 것입니다. 

 

다음 포스트에서는  이러한 문제를 근본적으로 해결하는 방법과 실제 CubeMX 설정과 Source code를 알아보도록 하겠습니다.

 

<계속>