Internal Temperature Sensor On STM32
前言
STM32 微控制器具有內部溫度傳感器。 該傳感器非常粗略 (±1.5 °C),並在內部連接到 ADC 通道的一個,這使得輕鬆獲取設備溫度成為可能,無需任何額外組件即可使用。但請注意此溫度為相對溫度非絕對溫度,且有溫度最高與最低限制無法完全取代一般sesnor
內部計算方式
這邊選用STM32WB35為主要參考(It support the temperature range –40 to 125 °C.)這部分可以參考各系列的reference manual
未經校準的內部溫度傳感器更適合用於檢測的應用溫度變化而不是絕對溫度。
數值位置要點
這邊是TS_CAL1/TS_CAL2要從Datasheet中抓取出對應Flash位置數值
TS_CAL1_TEMP與TS_CAL2_TEMP分別就是對應30與130
計算公式及修正如下
temperature = (int32_t)(((TS_CAL2_TEMP - TS_CAL1_TEMP) / ((float)(*TS_CAL2) - (float)(*TS_CAL1))) *
(adc_buffer[0] - (float)(*TS_CAL1)) + 30.0);
STM32CubeMX設定
這邊需要再ADC部份把Temperature Sensor Channel 與Vrefint Channel開啟,針對Vrefint Channel是可選的未得確定內部實際Vref電壓來提高精準度
STM32CubeIDE Code
這邊有2種方式可以選擇一種是直接寫公式如下code區域或使用官方給出Function
/* USER CODE BEGIN WHILE */
while (1)
{
if (Flg.ADCCMPLT) /* Conversion completed, do calculations */
{
/* Temperature Sensor ADC-value, Reference Voltage ADC-value (if use) */
Adc.IntSensTmp = TMPSENSOR_getTemperature(Adc.Raw[1], Adc.Raw[0]);
#if(DBG_UART) /* Send data with UART2 */
UART_Printf_Dbg("Reference: Adc.Raw[0] = %u\r\n", Adc.Raw[0]);
UART_Printf_Dbg("Sensor: Adc.Raw[1] = %u\r\n", Adc.Raw[1]);
UART_Printf_Dbg("Temperature: Adc.IntSensTmp = %.2f℃\r\n", Adc.IntSensTmp);
#endif
#if(DBG_UART) /* Delay */
HAL_Delay(250);
#endif
Flg.ADCCMPLT = 0; /* Nullify flag */
}/* USER CODE END WHILE */
這邊主可以參考網路範例TMPSENSOR_getTemperature把其數值抓取下來公式部分修正即可
#include "tmpsensor.h"
double TMPSENSOR_getTemperature(uint16_t adc_sensor, uint16_t adc_intref){
#if(TMPSENSOR_USE_INTREF)
double intref_vol = (TMPSENSOR_ADCMAX*TMPSENSOR_ADCVREFINT)/adc_intref;
#else
double intref_vol = TMPSENSOR_ADCREFVOL;
#endif
double sensor_vol = adc_sensor * intref_vol/TMPSENSOR_ADCMAX;
double sensor_tmp = (sensor_vol - TMPSENSOR_V25) *1000.0/TMPSENSOR_AVGSLOPE + 25.0;
return sensor_tmp;
}
Note
有反映讀取內部溫度時不是標準3.3V時會建議使用__HAL_ADC_CALC_TEMPERATURE()
The value returned by __HAL_ADC_CALC_TEMPERATURE()
seems to be closer to the temperature measured on the microcontroller’s casing.
在電壓Vref不是3.3時會建議使用__HAL_ADC_CALC_TEMPERATURE()
refer Web
參考
- Get temperature from STM32 internal temperature sensor (simple library)
- AN3964
- STM32 internal temperature and voltage reference
- Internal-Temperature-Sensor-STM32-HAL
- reference_manual
- Where is the calibration data for the Temperature sensor in the STM32G031?
- How to calibrate internal temperature sensor value in STM32 L496ZGT4
- 关于STM32内部温度传感器的算式话题