사용 MCU: STM32F103VCT
사용 IDE: TrueSTUDIO 9.3.0
STM32F HAL드라이브에서 HAL_ADCEx_Calibration_Start라는 함수가 있습니다.
/**
* @brief Perform an ADC automatic self-calibration
* Calibration prerequisite: ADC must be disabled (execute this
* function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
* During calibration process, ADC is enabled. ADC is let enabled at
* the completion of this function.
* @param hadc: ADC handle
* @retval HAL status
*/
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc);
이 함수를 꼭 써야하는가 ? 의문이 들어서 Calibration을 하고 안 하고의 차이점을 확인하기 위해 직접 실험 해 보았습니다.
STM32F103VCT6가 달려있는 보드를 사용했고 ADC한 회로는 아래와 같이 가변저항으로 실험 했고 확인하기 좋게
한쪽으로 끝까지 돌려 PC5_SBT에 3.3V가 들어가도록 하였습니다.
이론적으로 ADC결과는 4095(12bit ADC)가 나와야합니다.
실험한 코드는 아래와 같습니다.
/* 100ms마다 ADC결과 전송 */
void adc_task()
{
static uint32_t time = 0;
uint16_t value;
if (HAL_GetTick() - time < 100) {
return;
}
time = HAL_GetTick();
/* ADC 시작 */
HAL_ADC_Start(&hadc1);
/* ADC가 완료될 때까지 대기 */
while(HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK);
/* ADC 값 가져오기 */
value = HAL_ADC_GetValue(&hadc1);
/* ADC 중지 */
HAL_ADC_Stop(&hadc1);
printf("%d\r\n", value);
}
int main(void)
{
...
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
...
/* ADC Calibration ? 실험 포인트 */
while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK);
while(1)
{
adc_task();
}
}
결과 확인
결과는 제가 확인하기 편하게 Electron으로 GUI툴을 작성하여 Serial값을 수신하여 값과 차트로 표현하도록 하였습니다.
1. while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); 를 주석처리 하고 ADC 결과 값 확인
이론적이라면 ADC값이 최대값인 4095가 나와야하는데 4030~40대가 나오네요.
2. while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); 호출한 후 ADC 결과 값 확인
중간에 하나씩 튀는 값이 있지만 이론값대로 4095가 나오는 것을 볼 수 있습니다.
아래는 위 두 실험을 한 차트에 표현했을 때 차트입니다. 차이가 있는것을 볼 수 있습니다.
(Calibration 후 ADC가 flat하니 보기 좋은데 최대 전압이라 그렇지 전압을 조금 내리면 노이즈 정도는 비슷합니다.)
'MCU > STM32:HAL' 카테고리의 다른 글
[STM32F]FSMC와 LCD (0) | 2021.02.28 |
---|---|
[STM32F]FSMC로 LCD(SSD1963) 제어하기 (2) | 2021.02.07 |
[STM32F][HAL] USART Interrupt (0) | 2020.12.23 |
[STM32F][HAL] DAC (Digital to Analog Converter) (0) | 2020.12.22 |
[STM32F][HAL] OUTPUT COMPARE 사용하기 (0) | 2020.06.01 |
[STM32F][HAL] USB CDC (Virtual Port Com) 사용하기 (1) | 2020.05.28 |
[STM32F][HAL] HAL_Delay (0) | 2020.05.21 |
[STM32F][HAL]GPIO (0) | 2020.05.10 |