Skip to main content
Explorer
April 15, 2024
Solved

STM32H723 Internal Temperature Measurement vs. Ambient

  • April 15, 2024
  • 3 replies
  • 2016 views

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

 

    This topic has been closed for replies.
    Best answer by LCE

    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.

    3 replies

    Super User
    April 15, 2024

    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

    ToddAAuthor
    Explorer
    April 15, 2024

    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...

     

     

    Super User
    April 15, 2024

    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

     

    ToddAAuthor
    Explorer
    April 16, 2024

    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

    ToddAAuthor
    Explorer
    April 23, 2024

    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

    LCEAnswer
    Graduate II
    April 23, 2024

    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.