Polling Conversion에서 유의해야 할 Overrun을 없애는 방법은 무엇일까요?
Overrun 제거
그것은 바로 AUTODLY를 Set하는 방법입니다. 아래 그림을 참조하도록 하겠습니다.
AUTDLY=1로 설정 한 후 Conversion을 보면 CH1 Conversion 이후 ADC_DR에서 Read하기 전까지는 다음 Channel CH2를 Conversion 하지 않는 것을 볼 수 있는데요, 이러한 이유로 Overrun이 발생하지 않게됩니다.
CubeMX 설정
지난 포스트에 이어서 CubeMX의 설정을 알아보겠습니다. 핀설정은 생략하고 Configruation 부분만 발췌하였습니다.
중요한 것은 우리는 여러채널을 한번에 Conversion 하기 위해서 Scan Conversion Mode을 Enable 합니다. 그리고 Overrun을 발생하지 않도록 Low Power Auto Wait (AUTDLY)를 Enable합니다.
총 3개의 Regular Channel을 선택하여 Scan Coversion 하도록 Rank를 설정해줍니다. STM32G4의 경우에는 각 Channel의 순서와 Sampling 시간도 제 각각 설정할 수 있는 기능이 있습니다. (모든 STM32가 이런 기능을 제공하는 것은 아닙니다. Reference Manual을 확인해 보세요)
Source Code
STM32 HAL Driver에서 대부분의 기능을 제공하므로 소스코드는 의외로 간단합니다.
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK)
{
Error_Handler();
}
ADC를 Start 하기전에 반드시 ADC Calibration을 해줍니다(Calibration에 대해서는 다음 기회에 설명하도록 하겠습니다).
아래 코드는 inifite loop에서 매 초마다 3개의 Channel을 Conversion하는 코드입니다. HAL Driver에서 제공하는 ADC Start와 ADC Polling을 주기적으로 해주면 됩니다.
while (1)
{
if(HAL_ADC_Start(&hadc1) != HAL_OK)
{
Error_Handler();
}
if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
adc_channel_1 = HAL_ADC_GetValue(&hadc1);
}
else
{
Error_Handler();
}
if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
adc_channel_5 = HAL_ADC_GetValue(&hadc1);
}
else
{
Error_Handler();
}
if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
{
adc_channel_6 = HAL_ADC_GetValue(&hadc1);
}
else
{
Error_Handler();
}
HAL_Delay(1000);
}
아시다시피 HAL PollForConversion 함수 내에는 EOC를 체크하여 Set 되는 순간 ADC_DR의 데이터를 반환하는 구조로 되어 있습니다.
Full source code는 아래 URL을 참조해주시기 바랍니다.
https://github.com/soloungos/stm32g431rb_adc_polling
오늘도 즐거운 C생활 하세요.
'▶ STM32 > Peripheral' 카테고리의 다른 글
UART(USART) Printf - HAL & Polling (0) | 2023.12.13 |
---|---|
STM32 Window watchdog 멈추기 (0) | 2023.12.13 |
STM32 에서 ADC Polling conversion 하는 방법(1) (0) | 2023.12.08 |
STM32F7과 STM32H7 의 L1 캐시에 대해 (1) | 2023.12.03 |
STM32H7 Inter-processor communication (5) - STM32CubeH7 examples (0) | 2023.12.03 |