2024-04-15 10:12 AM
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
Solved! Go to Solution.
2024-04-23 04:57 AM
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.
2024-04-15 10:28 AM
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
2024-04-15 12:31 PM
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...
2024-04-15 12:49 PM
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
2024-04-16 04:52 AM
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
2024-04-23 04:37 AM
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
2024-04-23 04:57 AM
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.