cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H723 Internal Temperature Measurement vs. Ambient

ToddA
Associate II

All:

Setup - STM32H723 with VREFP = 3.00 V

I have connected internal temperature to ADC3, and I am able to display degrees C on "Live Expressions". With VREFP set to 3.00 V, I am seeing lower readings than ambient. Using __HAL_ADC_CALC_TEMPERATURE( ), I am seeing internal temperatures of 21 - 24 C, vs. ambient temperature of 25.8 C.

Is there a variation based on VREFP? (Earlier on Nucleo board, I was seeing internal temperature of 30 C with VREFP of 3.3 volts.)

Regards,

Todd Anderson

 

1 ACCEPTED SOLUTION

Accepted Solutions
LCE
Principal

The results I get from H723-Nucleo / H735-Discovery make sense.
I use slowly running ADC 3, I think VDDA / VREF on these boards is VCC = 3.3V.

I calculate it like this:

#define TEMPI_CAL_MULT	(float)( (float)(TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) \
								/ (float)((int32_t)*TEMPSENSOR_CAL2_ADDR - (int32_t)*TEMPSENSOR_CAL1_ADDR) )

/* convert averaged float ADC value to temperature */
float ConvAdc2Temp(float flAdcTemp)
{
	/* calculate temperature, see reference manual */
	float flTempVal = flAdcTemp;

	flTempVal -= (float)((int32_t)*TEMPSENSOR_CAL1_ADDR);
	flTempVal *= (float)TEMPI_CAL_MULT;
	flTempVal += (float)((int32_t)TEMPSENSOR_CAL1_TEMP);

	return flTempVal;
}

This might be the same as yours, but I'm too lazy to check!

flAdcTemp is just an averaged value of the ADC samples, so it's somewhere between 0.0 .. 4095.0.

View solution in original post

6 REPLIES 6

I'd expect the temperature sensor being supplied by VDDA rather than VREF+.

Of course, VREF+ has impact on ADC itself.

OTOH, the temperature sensor is far from being precise; a couple of degrees C deviation is to be expected.

Here is a relatively generic checklist of things which may go wrong, you may want have a look at it, just to be sure.

JW

I tried the following algorithm based on the reference manual, not sure if results are accurate.

Temperature (C) = ( ( TS_CAL2_TEMP - TS_CAL1_TEMP) / (TS_CAL2 - TS_CAL1) ) x (TS_DATA - TS_CAL1) ) 

                              + 30 C.

TS_CAL2_TEMP = 130

TS_CAL1_TEMP = 30

TS_CAL2 = 0x401 (from memory location) = 1025

TS_CAL1 = 0x306 (from memory location) = 774

CAL2_TEMP - CAL1_TEMP = 100 C

TS_CAL2 - TS_CAL1 = (1025 - 774) = 251

1st term = 100 / 251 = 0.398

Resulting equation:  Temperature (C) = (  (0.398) x (TS_DATA - 774) )  +  30 C

my data reading was 820 counts, so my Temperature (C) = ( (0.398) x ( 820 - 774) ) + 30

                                                                                            =  (0.398 x 46 ) + 30

                                                                                            =  18.3 + 30

                                                                                            = 48.3  internal temperature

Hopefully, the math is correct and that is a reasonable expectation. Tell me if there are flaws in my calculations...

 

 

You have to take into account difference between your VREF+ voltage and the voltage at which TS_CALx has been taken.

If your VREF+ is 3.0V and the datasheet values were taken at 3.3V, TS_CAL1 -> 1025 / 3.0 * 3.3 = 1127.5; TS_CAL2-> 774 / 3.0 * 3.3 = 851.4. Your readout is below TS_CAL1 so it will correspond to cca 18.6deg.C

That's somewhat suspicious.  Try go through the steps in checklist (GND cleanness on all related pins, VREF+ stability and exact value, proper ADC calibration, settling times; also check against internal reference VREFINT or other known precise voltage source); try to repeat on the "known good" board.

JW

 

Thanks, Jan

This makes sense. So far the processor is not working really hard, so a few degrees above ambient is not out of the question. I will look into this further.

Regards,

Todd Anderson

I needed to adjust the sample time to slow it down for reading temperature. It is now closer, but still a little below ambient. This will be as good as I can get with a VREF that is not 3.3 volts.

Todd Anderson

LCE
Principal

The results I get from H723-Nucleo / H735-Discovery make sense.
I use slowly running ADC 3, I think VDDA / VREF on these boards is VCC = 3.3V.

I calculate it like this:

#define TEMPI_CAL_MULT	(float)( (float)(TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP) \
								/ (float)((int32_t)*TEMPSENSOR_CAL2_ADDR - (int32_t)*TEMPSENSOR_CAL1_ADDR) )

/* convert averaged float ADC value to temperature */
float ConvAdc2Temp(float flAdcTemp)
{
	/* calculate temperature, see reference manual */
	float flTempVal = flAdcTemp;

	flTempVal -= (float)((int32_t)*TEMPSENSOR_CAL1_ADDR);
	flTempVal *= (float)TEMPI_CAL_MULT;
	flTempVal += (float)((int32_t)TEMPSENSOR_CAL1_TEMP);

	return flTempVal;
}

This might be the same as yours, but I'm too lazy to check!

flAdcTemp is just an averaged value of the ADC samples, so it's somewhere between 0.0 .. 4095.0.