Measuring temperature - voltage is off by factor of 2ish
I'm running a STM32G474RET6 on a Nucleo G474RE board, and trying to read the internal temperature.
I set up ADC1 with 2 ranks (the temperature and the vrefint) like so (not including the error checking and comments for better readability):
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.GainCompensation = 0;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 2;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.OversamplingMode = DISABLE;
multimode.Mode = ADC_MODE_INDEPENDENT;
HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode);
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
sConfig.Channel = ADC_CHANNEL_VREFINT;
sConfig.Rank = ADC_REGULAR_RANK_2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
TemperatureData.StoredVolt = *((uint16_t *) 0x1FFF75AA);
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
I then read the 2 ADC values:
FirstADC = true;
HAL_ADC_Start_IT(hadc1);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
BaseType_t xHigherPriorityTaskWoke = pdFALSE;
if (FirstADC)
{
TemperatureData.TempSensorRaw = HAL_ADC_GetValue(hadc);
FirstADC = false;
}
else
{
TemperatureData.VoltRefRaw = HAL_ADC_GetValue(hadc);
HAL_ADC_Stop_IT(hadc);
TemperatureData.VoltRef = __HAL_ADC_CALC_VREFANALOG_VOLTAGE(TemperatureData.VoltRefRaw, hadc->Init.Resolution);
TemperatureData.Temperature = __HAL_ADC_CALC_TEMPERATURE(TemperatureData.VoltRef,
TemperatureData.TempSensorRaw, hadc->Init.Resolution);
TemperatureData.State = hadc->State;
TemperatureData.ErrorCode = hadc->ErrorCode;
TemperatureData.Success = true;
}
portYIELD_FROM_ISR( xHigherPriorityTaskWoke );
}
What I get back doesn't look bad, TemperatureData.StoredVolt is 1654 which is a little higher than it
should be but it's in the ballpark. What's strange is that TemperatureData.VoltRef is 3275 which is
about double what it should be.
What am I doing wrong?
