2019年2月27日 星期三

利用Vrefint校正ADC

電池相關裝置,因為省電,一般不會安裝穩壓元件,Pin數少的MCU也無外部Vref可用。
可以利用STM32內建的ADC_IN17生成的固定電壓源做數值校正。
aADCxConvertedData[4]就是ADC_IN17,預設值為1510,若是現值變了,轉換值就存於v_factor。故ADC取值成功,就先做轉換值計算,其他的ADC值就可以依轉換值回推到原值。

int v_factor;
unsigned short adc_value[ADC_CONVETED_DATA_BUFFER_SIZE - 1];
#define V_STD (1510)
#define V_FACTOR_SET(n) (v_factor = ((V_STD << 16) / (n)))
#define V_FACTOR_ADJ(x) (((x)*v_factor) >> 16)
HAL_ADCEx_EnableVREFINT();
MX_ADC_Init();
HAL_ADC_Start_DMA(&hadc, (uint32_t *)aADCxConvertedData, ADC_CONVERTED_DATA_BUFFER_SIZE);
crDELAY(xHandle, MS(2));
V_FACTOR_SET(aADCxConvertedData[4]);
adc_value[0] = V_FACTOR_ADJ(aADCxConvertedData[0]);
adc_value[1] = V_FACTOR_ADJ(aADCxConvertedData[1]);
adc_value[2] = V_FACTOR_ADJ(aADCxConvertedData[2]);
adc_value[3] = V_FACTOR_ADJ(aADCxConvertedData[3]);