本帖最后由 龙鳞铁碎牙 于 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数据手册,里面有详细的描述
其中 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
使能ADC
2.时钟96MHZ
3.使能串口1作为调试接口
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.编译,烧录代码
6.打开串口助手
可以看到板子温度值为31度,非常的准确
|