불안정한 VDDA문제, Vrefint를 이용한 ADC 측정 정밀도 높이기

STM32에서는 아래와 같은 VDD-VDDA 의 구성을 가지고 있습니다.

STM32G 시리즈 Power scheme

VDD와 VDDA는 완전하게 독립적으로 분리할 수 있습니다. 하지만 회로적으로 Digital 전원과 Analog 전원을 따로 분리하지 않는 경우가 더 많습니다. VDD는 디지털 회로에 들어가는 전원으로 디지털의 특성상 작은 ripple은 허용이 되는 편입니다.

하지만 ADC의 기준이 되는 VREF+는 작은 ripple이라도 ADC에 큰 오차를 만들 수 있습니다. 따라서 회로적으로 VREF+가 흔들리지 않도록 권장하는 Decoupling Capacitor 및 노이즈 원인으로 부터 떨어 뜨려야 합니다. 흔히 VDD - VDDA - VREF+ 를 같이 연결하여 사용하는데 디지털 전원인 VDD의 노이즈가 VDDA에 전달 될 수 있다는 것을 사전에 인지하여야 합니다.

오류의 예시를 보여 드리겠습니다.

VREF+ : 3.3 , ADC input 전압 1.0, ADC 변환 값 = 1241

VREF+ : 3.0 , ADC input 전압 1.0, ADC 변환 값 = 1365

결과적으로 124의 편차가 발생합니다.

STM32는 흔들리지 않는 Vrefint 1.2V 의 ADC 채널을 제공합니다.

이래 저래 ADC는 기준전압 VREF+는 여러가지 이유로 흔들릴 수 있습니다. 다행히도 STM32는 약 1.2V의 Vrefint(internal voltage reference) 를 가지고 있습니다.

STM32G4 Datasheet에는 아래와 같이 표현하고 있습니다.

내부 전압 레퍼런스(VREFINT)는 ADC와 Comparator에 안정적인(Bandgap) 전압 출력을 제공합니다. VREFINT는 내부적으로 ADC1_IN18 입력 채널에 연결됩니다. VREFINT의 정확한 전압은 ST에 의해 개별적으로 측정되어 시스템 메모리 영역에 저장되며 읽기 전용 모드에서 액세스할 수 있습니다.

STM32G4는 위의 Address에 VREF+ 전압이 저장되어 있습니다.

STM32G 시리즈는 1.212V의 Vrefint를 가집니다.

따라서 우리는 ST가 생산중에 기록한(VREF+ 3.0) Vrefint 약 1.212V의 ADC 값과 실제로 측정한 Vrefint 채널을 가지고 역으로 VREF+를 값을 추정할 수 있으며 이것을 이용하여 ADC 의 오류를 보정 할 수 있습니다.

단, STM32 개별 제품별로 Vrefint Voltage가 다를 수 있으며 저정된 메모리 주소로 다르니 꼭 해당 제품의 Datasheet를 확인해 보시길 바랍니다. 그리고 다른 일반 ADC Channel들과 다르게 Vrefint ADC Channel은 다소 Sampling - Conversion시간이 길 수 있으니 이 또한 Datasheet를 확인해 보시길 바랍니다.

Reference manual에는 실제 Vrefint를 이용하여 VREF+ 실제 전압과 ADC channel의 값을 보정하는 방법을 아래와 소개하고 있습니다.

VREF+ 도출 공식

  • VREF+_Charac : 제조 시 VREFINF 값을 측정하기 위해 사용했던 Vref+ 전압(3.0V)
  • VREFINT_CAL : MCU에 사전에 저장된 Calibration 값
  • VREFINT_DATA : ADC로 읽은 Vrefint 값

ADC Input channel 도출 공식

  • VREF+_Charac : 제조 시 VREFINF 값을 측정하기 위해 사용했던 Vref+ 전압(3.0V)
  • VREFINT_CAL : MCU에 사전에 저장된 Calibration 값
  • VREFINT_DATA : ADC로 읽은 Vrefint 값
  • ADC_DATA : ADC Input channel 을 읽은 값
  • FULL_SCALE : ADC 분해능에 의한 ADC 최대 값(예:12bit – 4096)

이처럼 STM32는 안정적인 Bandgap을 이용한 정확한 Internal reference voltage(Vrefint)를 제공하여 VREF+(VDDA)의 편차 교정하도록 하고 있습니다.

간단하게 위에서 제공한 수식을 C언어로 나타낸 예시는 아래 소스와 같으며 아래의 조건으로 코딩되어 있습니다.

  • ADC 3채널 Conversion
  • Vrefint는 세번째 Channel 임
  • 실제 VREF+(VDDA)를 구해 ADC 첫번째 채널을 보정함
 
vrefint_converted_value = adc_converted_values[2];
vdda_milli_volt = (VREFINT_CAL_VREF * (*VREFINT_CAL_ADDR)) / vrefint_converted_value;
channel1_converted_value = (int)((float)vdda_milli_volt * (float)((float)adc_converted_values[0] / 4096.0F));
 

 

자세한 사항은 아래 URL에 STM32G4에서 측정하여 ADC 채널들을 보정한 Full 소스를 참조해보시길 바랍니다.

https://github.com/soloungos/stm32g431rb_adc_vrefint

 

이상입니다.