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

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart