ADC 변환에는 크게 3가지로 구분 할 수 있습니다. 각각의 장단점은 아래와 같이 간단하게 말할 수 있습니다.
변환방법 | 장점 | 단점 |
Interrupt | - 변환시간 절약 - 소프트웨어 트리거 사용가능 - 하드웨어 트리거 사용가능 |
- 잦은 인터럽트 유발 - 인터럽트 처리가 늦으면 Overrun 발생 |
Polling | - 직관적인 사용성 - 소프트웨어 트리거 사용가능 - 변환시간 및 프로세싱 예측가능 |
- 프로세서 점유율이 높아짐 - 변환완료 처리가 늦어지면 Overrun 발생 - 하드웨어 트리거 사용이 어려움 |
DMA | - 변환시간 절약 - 하드웨어 트리거 사용가능 |
- 설정의 복잡함 - 변환완료 프로세스를 잘 처리하지 않으면 Overrun 발생 |
어플리케이션에 맞는 변환방법을 선택하면 사용성은 물론 최상의 성능을 구현할 수 있습니다.
오늘은 Polling conversion에 대해 실험해 보도록 하겠습니다. 먼저 STM32G4의 ADC의 타이밍을 알아보겠습니다.
위의 예시는 여러가지 ADC 타이밍 중에서 가장 이해하기 쉬운 타이밍도인 것 같아 첨부했습니다. 총 4개의 Channel을 아래의 순서대로 Sequence로 Scan하여 변환하고 있습니다.
- CH1 → CH9 → CH10 → CH17
중간에 ADSTP을 걸어주어 두번째 Scan Conversion 이후 CH10 에서 변환을 멈추고 있습니다. Polling 방식을 이해하기 위해서는 SW 처리 부분과 HW 처리 부분을 잘 알고있어야 합니다.
그림에는 없는 대부분 CubeMX에서 핀설정, ADC 설정은 자동으로 해줍니다. 그 부분을 제외하고 위의 그림대로라면 아래와 같은 방식으로 F/W를 구현해 주면됩니다.
- ADC START
- EOC 확인
- EOC가 Set 되면 ADC_DR에서 데이터를 읽음
- 다음 채널 변환확인을 위해 EOC 다시 확인
- EOC가 Set 되면 ADC_DR에서 데이터를 읽음
- 채널 수 만큼 위의 EOC 확인 및 ADC_DR 읽기 반복
- 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를 알아보도록 하겠습니다.
<계속>
'▶ STM32 > Peripheral' 카테고리의 다른 글
STM32 Window watchdog 멈추기 (0) | 2023.12.13 |
---|---|
STM32 에서 ADC Polling conversion 하는 방법(2) (0) | 2023.12.08 |
STM32F7과 STM32H7 의 L1 캐시에 대해 (1) | 2023.12.03 |
STM32H7 Inter-processor communication (5) - STM32CubeH7 examples (0) | 2023.12.03 |
STM32H7 Inter-processor communication (4) - Using STM32H7hardware resources (0) | 2023.12.03 |