Internal Temperature STM32H7 delivers wrong value
Hi all,
I need to measure the internal CPU temperature sensor from the STM32H743. I activated the ADC3 using STM32CUBEMX (V. 5.0.1) and selected Temperature Channel.
However the calculated temperatures are far too high. When switching on the cooled system at 22° Temperature, the delivered value is 55 °C. This is definitely by far too high!
Can anybody tell what might be wrong with my init code?
ADC input clock is set to 32 MHz
Clock Prescaler = devided by 1
Resolution 16 Bit
Continuous Mode Enabled
In Rank 1:
Sampling Time set to 810.5 Cycles
Generated initialisation code is as follows:
//////////////////////////////////////////////////////////////////
void MX_ADC3_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/**Common config
*/
hadc3.Instance = ADC3;
hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc3.Init.LowPowerAutoWait = DISABLE;
hadc3.Init.ContinuousConvMode = ENABLE;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc3.Init.BoostMode = DISABLE;
hadc3.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc3) != HAL_OK)
{
Error_Handler();
}
/**Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
////////////////////////////////////////////////////////////////////
// Reading Temperature in Interrupt mode:
// started after power on in continuous mode:
// HAL_ADC_Start_IT(&hadc3);
#define TEMP110_CAL_ADDR ((uint16_t*)((uint32_t)0x1FF1E840))
#define TEMP30_CAL_ADDR ((uint16_t*)((uint32_t)0x1FF1E820))
double adc_ReadInternalTemp(void)
{
double dTemp;
uint32_t adcConVal;
uint32_t T1_30;
uint32_t T2_110;
adcConVal = HAL_ADC_GetValue(&hadc3);
// Temp = 80 / (TS_CAL2 - TS_CAL1) * (ValTS - TS_CAL1) + 30
// TS_CAL1 = T1_30 = at 30 Degrees
// TS_CAL2 = T2_110 = at 110 Degrees
T1_30 = (int32_t)* TEMP30_CAL_ADDR; // Reads 0x3073
T2_110 = (int32_t)* TEMP110_CAL_ADDR; // Reads 0x3F63
dTemp = (double)(110 - 30) / (double)(T2_110 - T1_30);
dTemp *= (double)(adcConVal - T1_30);
dTemp += 30;
return dTemp; // 55-59 °C at startup, 80°C after warming up
}
Any help is very much appreciated!
