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.