[STM32U3] 【STM32U385RG 测评】——7.获取STM32U385RG 板子温度传感器温度值

[复制链接]
 楼主| 龙鳞铁碎牙 发表于 2025-8-7 18:17 | 显示全部楼层 |阅读模式
本帖最后由 龙鳞铁碎牙 于 2025-8-7 18:28 编辑

#有奖活动# #申请开发板# #申请原创# 很多人都不知道STM32芯片内部就有一个温度传感器,所以大多数人的做法其实就是外接温湿度传感器来做测评,其实如果不是必须做项目,是没有必要专门外接温度传感器来测试板子温度的,因为可以直接使用STM32内部的温度传感器即可。

STM32 内部有一个温度传感器,可以用来测量 CPU 及周围的温度。这个温度传感器会产生随温度线性变化的电压,转换的电压范围在 2~3.6V之间。 这个温度传感器的主要特性如下:

(1)对于 STM32F103 来说,温度传感器在内部和 ADC1_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。

(2)温度传感器模拟输入推荐采样时间是 17.1us。

(3)STM32F103 内部温度传感器支持的温度范围为:-40~125 度,精度为±1.5℃左右。

(4)温度传感器输出电压随温度线性变化,由于生产过程的变化,温度变化曲线的偏移在不同芯片上会有不同(最多相差45°C)。

(5)内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器。

打开STM32U385xx数据手册,里面有详细的描述 2090168947d7247f02.png

其中 Avg_Slope = 2.5mV/°C = 0.0025

       V30 = 752mV = 0.752V

对应的计算公式需要换算一下

温度(°C)= {(V30 -Vsensor)/Avg_Slope} +30

                   = {(0.752 - Vsensor)/0.0025} + 30

大家自己进行换算实现即可

按照上面的公式,就可以计算出准确的温度值

1.打开cubemx

5646668947dd6142c9.png

使能ADC

9489868947de75f8de.png

2.时钟96MHZ

7431568947dfcbba1f.png

3.使能串口1作为调试接口

3727368947e2254545.png

4.核心代码如下:

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "adc.h"

#include "icache.h"

#include "usart.h"

#include "gpio.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "esp8266.h"

#include <string.h>


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* Definitions of environment analog values */

  /* Value of analog reference voltage (Vref+), connected to analog voltage   */

  /* supply Vdda (unit: mV).                                                  */

  #define VDDA_APPLI                       (3300UL)


/* Definitions of data related to this example */

  /* Init variable out of expected ADC conversion data range */

  #define VAR_CONVERTED_DATA_INIT_VALUE    (__LL_ADC_DIGITAL_SCALE(LL_ADC_RESOLUTION_12B) + 1)


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */



/* USER CODE BEGIN PV */


/* Variables for ADC conversion data */

__IO uint16_t uhADCxConvertedData = VAR_CONVERTED_DATA_INIT_VALUE; /* ADC group regular conversion data */


/* Variables for ADC conversion data computation to physical values */

__IO  int16_t hADCxConvertedData_Temperature_DegreeCelsius = 0UL;  /* Value of temperature calculated from ADC conversion data (unit: degree Celsius) */

__IO  int16_t hADCxConvertedData_Temperature = 0UL;


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{


  /* USER CODE BEGIN 1 */

  uint16_t time = 0;


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_ADC1_Init();

  MX_ICACHE_Init();

  MX_UART5_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  

  /* Perform ADC calibration */

  if (HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED) != HAL_OK)

  {

    /* Calibration Error */

    Error_Handler();

  }





  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

   

    /* Init variable containing ADC conversion data */

    uhADCxConvertedData = VAR_CONVERTED_DATA_INIT_VALUE;


    /* Start ADC group regular conversion */

    if (HAL_ADC_Start(&hadc1) != HAL_OK)

    {

      /* Error: ADC conversion start could not be performed */

      Error_Handler();

    }


    /* Poll for conversion completion */

    if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)

    {

      /* Error: ADC conversion not completed set on time */

      Error_Handler();

    }


    /* Retrieve ADC conversion data */

    /* (data scale corresponds to ADC resolution: 12 bits) */

    uhADCxConvertedData = HAL_ADC_GetValue(&hadc1);


    /* Turn LED on after ADC conversion completion */

    HAL_Delay(200);

        //printf("Sensor: Adc = %u\r\n", uhADCxConvertedData);


    /* Computation of ADC conversions raw data to physical values             */

    /* using LL ADC driver helper macro.                                      */

    hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE(VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);

        hADCxConvertedData_Temperature = hADCxConvertedData_Temperature_DegreeCelsius+15;


        printf("STM32U385板子温度是: %d℃\r\n", hADCxConvertedData_Temperature_DegreeCelsius);


5.编译,烧录代码
5861268947e9dec444.png
6.打开串口助手
6092868947eefc550e.png 9568947f15c11b0.png
可以看到板子温度值为31度,非常的准确 3122268947fb4b796d.png 1555768947fb71d40d.png 3127068947fb8d3117.png


8183868947e0a00617.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

47

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

17

主题

47

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部