Question
Have: STM32L151C8xxA Get VREFINT trouble (VREFINT voltage drifts depended on external power supply), how to get REAL input voltage?
Code for prepare MCU AD
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.NbrOfConversion = 1;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}Code for read ADC data:
void ADC_Select_Channel(uint32_t ADCChannel)
{
ADC_ChannelConfTypeDef conf =
{
.Channel = ADCChannel,
.Rank = 1,
.SamplingTime = ADC_SAMPLETIME_192CYCLES
};
if (HAL_ADC_ConfigChannel(&hadc, &conf) != HAL_OK)
{
Error_Handler();
}
}
uint32_t ADC_ReadChannel(uint32_t ADCChannel)
{
ADC_Select_Channel(ADCChannel);
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 100);
uint32_t RetVal = HAL_ADC_GetValue(&hadc);
HAL_ADC_Stop(&hadc);
return RetVal;
}Code for get data:
// Wait for reference ready
while (__HAL_PWR_GET_FLAG(PWR_FLAG_VREFINTRDY) == RESET) {}
// Get the VREF in mV value
uint32_t VREF = __LL_ADC_CALC_VREFANALOG_VOLTAGE(ADC_ReadChannel(ADC_CHANNEL_VREFINT), LL_ADC_RESOLUTION_12B);
// Out VREF + calc temp
ipf("MCU VREF: %u mV\n\r", VREF);
ipf("MCU Temp: %u C\n\r", __LL_ADC_CALC_TEMPERATURE(VREF, ADC_ReadChannel(ADC_CHANNEL_TEMPSENSOR), LL_ADC_RESOLUTION_12B));Results:
On lab power supply setted to 2.8V:
MCU VREF: 1792 mV
MCU Temp: 25 COn 3.6V:
MCU VREF: 2509 mV
MCU Temp: 26 C1792mV & 2509mV, but datasheet is ~1.22V, how to get REAL input Voltage???
