登录/注册

stm32内部温度传感器显示温度

stm32内部温度传感器显示温度

更多

在 STM32 微控制器中读取并显示内部温度传感器的温度,通常需要以下步骤(以标准外设库或 HAL 库为例)。请注意,这个传感器主要用于监测芯片结温的变化趋势,精度有限(典型误差在 ±1°C 到 ±5°C 之间),不适合做精确的温度测量。

以下是实现步骤和关键代码示例(使用 HAL 库):

  1. 使能相关时钟和功能:

    • 使能 ADC 时钟。
    • 使能内部温度传感器通道(通常连接到特定的 ADC 通道,如 ADC_CHANNEL_TEMPSENSORADC_CHANNEL_16 / ADC_CHANNEL_18,具体取决于系列)。
    • 使能内部参考电压通道(VREFINT,用于提高精度,可选但推荐)。
  2. 配置 ADC:

    • 初始化 ADC 参数(分辨率、扫描模式、连续转换模式、触发源、数据对齐等)。
    • 配置 ADC 通道。将温度传感器通道和(可选的)VREFINT 参考电压通道添加到 ADC 的转换序列中。
    • 设置采样时间。温度传感器通道需要较长的采样时间(查阅芯片数据手册中的 t<sub>SAMP</sub>ST 参数,通常建议 >= 10us)。对于 VREFINT 也建议较长的采样时间。
  3. 校准 ADC:

    • 执行 ADC 校准(线性校准和偏移校准)。
  4. 启动 ADC 和温度传感器:

    • 启动 ADC。
    • 在 ADC 初始化后,需要单独启用内部温度传感器(通过设置 ADC_CCR 寄存器中的 TSVREFE 位)。HAL库通常有对应的函数(如 HAL_ADCEx_EnableVREFINT()__HAL_ADC_ENABLE_TEMPSENSOR())。
  5. 读取 ADC 值:

    • 启动 ADC 转换(单次或连续模式)。
    • 等待转换完成标志。
    • 读取温度传感器通道的原始 ADC 值 (ADC_Value_Temp)。
    • (可选)读取 VREFINT 通道的原始 ADC 值 (ADC_Value_Vrefint)。
  6. 计算温度:

    • STM32 数据手册会提供计算温度的公式和参数(通常在电气特性章节)。通用公式如下: T (°C) = ((V<sub>SENSE</sub> - V<sub>25</sub>) / Avg_Slope) + 25
      • V<sub>SENSE</sub>:温度传感器在实测温度下的电压值。
      • V<sub>25</sub>:温度传感器在 25°C 时的电压值(典型值,单位:伏特 V)。
      • Avg_Slope:温度传感器输出电压随温度变化的平均斜率(典型值,单位:mV/°C 或 V/°C)。
    • 需要将读取到的原始 ADC 值转换为电压值: V<sub>SENSE</sub> = (ADC_Value_Temp * V<sub>REF+</sub>) / ADC_Resolution
      • V<sub>REF+</sub>:ADC 的参考电压(通常等于 VDDA 引脚电压)。
      • ADC_Resolution:ADC 的最大数值(例如,12位 ADC 是 4095,10位是 1023)。
    • 关键点: V<sub>REF+</sub> 通常未知且可能波动。强烈推荐使用内部参考电压 VREFINT 来推算实际的 V<sub>REF+</sub> V<sub>REF+</sub> = (VREFINT_CAL * ADC_Resolution) / ADC_Value_Vrefint
      • VREFINT_CAL:芯片出厂时存储在系统存储器(特定地址)的 VREFINT 在 3.3V 和 30°C 下的校准值(单位:ADC 码值)。这个地址在数据手册或芯片头文件(如 stm32f4xx.h 中的 VREFINT_CAL_ADDR)中定义。
      • ADC_Value_Vrefint:实际读取到的 VREFINT 通道的 ADC 值。
    • 最终计算步骤:
      1. VREFINT 计算实际 V<sub>REF+</sub>
      2. 用计算出的 V<sub>REF+</sub>ADC_Value_Temp 转换为 V<sub>SENSE</sub>
      3. V<sub>SENSE</sub>V<sub>25</sub>Avg_Slope 代入温度公式计算温度。
    • 简化(如果 VDDA 稳定且已知,如 3.3V): 可以跳过 VREFINT 测量,直接用设定的 V<sub>REF+</sub>(如 3.3V)计算 V<sub>SENSE</sub>,但精度会受 VDDA 波动影响。
  7. 显示温度:

    • 将计算得到的浮点数温度值 T 通过你选择的输出方式显示出来:
      • 串口 (UART): 使用 printf 通过串口发送到 PC 终端(需要重定向 _write 函数)。
      • 显示屏 (LCD/OLED): 调用相应的显示屏驱动库函数显示数值。
      • 其他外设。

重要提示:

  1. 查阅文档: 务必查阅你所使用的 具体 STM32 型号的数据手册 (Datasheet)参考手册 (Reference Manual)。不同系列(F0, F1, F3, F4, F7, H7, L0, L1, L4, G0, G4 等)和型号的内部温度传感器参数(V<sub>25</sub>, Avg_Slope)、连接的 ADC 通道号、启用方式(TSVREFE 位)、VREFINT 校准值地址等可能不同
  2. 参数值: V<sub>25</sub>Avg_Slope 是典型值,每个芯片有差异。如果需要更高精度,可能需要在已知温度下进行校准。
  3. 采样时间: 确保为温度传感器通道设置足够长的采样时间。
  4. 启用传感器: 不要忘记在 ADC 初始化后启用温度传感器(设置 TSVREFE 位)。
  5. VREFINT 使用: 使用 VREFINT 来推算 V<sub>REF+</sub> 是提高测量精度的关键步骤。
  6. 滤波: 对 ADC 值进行软件滤波(如多次采样取平均)可以降低噪声影响。

简化示例代码片段 (HAL库, 使用VREFINT, 概念性):

// 1. 已配置好ADC基本参数 (hadc1), 时钟, GPIO等...
// 2. 添加通道到ADC序列 (Rank 1: VREFINT, Rank 2: TempSensor)
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_VREFINT; // 内部参考电压通道
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; // 使用长采样时间
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
    Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; // 内部温度传感器通道
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
    Error_Handler();
}

// 3. 校准ADC
if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) {
    Error_Handler();
}

// 4. 启用内部温度传感器和VREFINT测量 (设置TSVREFE位)
//    对于很多HAL库版本,启用VREFINT通常也同时启用温度传感器通道
HAL_ADCEx_EnableVREFINT(); // 或者 __HAL_ADC_ENABLE_TEMPSENSOR();

// 5. 启动ADC
if (HAL_ADC_Start(&hadc1) != HAL_OK) {
    Error_Handler();
}

// ... (在主循环或定时器中)

// 6. 读取两个通道的值
uint32_t adc_value_vrefint = 0, adc_value_temp = 0;

// 启动转换并等待完成 (这里假设是单次模式,需要每次启动)
if (HAL_ADC_Start(&hadc1) == HAL_OK) {
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
        adc_value_vrefint = HAL_ADC_GetValue(&hadc1); // 读取Rank1 (VREFINT)
    }
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
        adc_value_temp = HAL_ADC_GetValue(&hadc1); // 读取Rank2 (Temp)
    }
    HAL_ADC_Stop(&hadc1);
}

// 7. 计算实际VDDA (VREF+)
//    获取存储在Flash中的VREFINT校准值 (地址需根据芯片型号查)
#define VREFINT_CAL_ADDR  (0x1FFF7A2A) // 示例地址,F4系列常见值,务必查手册确认!
uint16_t vrefint_cal = *((uint16_t *)VREFINT_CAL_ADDR);
// 计算 (假设12位ADC, Resolution = 4095)
float vdda = (3.3f * vrefint_cal) / adc_value_vrefint; // 3.3V是VREFINT校准时的电压

// 8. 计算温度传感器电压Vsense
float vsense = (adc_value_temp * vdda) / 4095.0f; // 12位ADC

// 9. 计算温度 (使用数据手册提供的典型参数, 例如F4系列)
float v25 = 0.76f;    // F4典型值: 0.76V @ 25°C
float avg_slope = 0.0025f; // F4典型值: 2.5 mV/°C = 0.0025 V/°C
float temperature = ((vsense - v25) / avg_slope) + 25.0f;

// 10. 显示温度 (例如通过串口)
printf("Temperature: %.2f °C\n", temperature);
// 或者发送到显示屏...

请务必:

通过以上步骤和代码框架,你就可以在 STM32 上读取并显示其芯片内部的温度了。记得核心是查阅你所使用芯片的官方文档获取精确参数和配置细节。

STM32内部温度传感器的相关资料分享

温度传感器STM32有一个内部的

2022-01-10 08:12:11

STM32内部温度传感器的工作原理及其使用

3.1内部温度传感器工作原理STM32 有一个

2021-12-17 08:28:02

STM32内部温度传感器简介

.概述内部ADC及温度传感器采集MCU内部电压及

2021-12-17 06:21:09

基于STM32单片机内部温度传感器实验使用库文件设计源代码

基于STM32单片机内部温度传感器实验使用库文件设计源代码

资料下载 木头1233 2023-04-26 14:41:28

stm32CubeMx ADC多通道扫描模式DMA + 采集STM32内部温度传感器的值

项目简介任务:通过CubeMx实现ADC多通道扫描采集DMA方式(无中断) 采集内部温度传感器的

资料下载 佚名 2021-12-08 21:06:22

嵌入式单片机基础篇(十三)之 STM32 内部温度传感器

STM32 内部温度传感器1、

资料下载 佚名 2021-11-23 18:21:37

STM32的ADC采集内部温度传感器数据,并以DMA的方式传输

stm32 ADC测量内部温度传感器

资料下载 吴湛 2021-11-15 20:36:06

使用1602LCD显示DS18B20数字温度传感器温度值程序免费下载

本文档的主要内容详细介绍的是使用1602LCD显示DS18B20数字温度传感器的温度

资料下载 佚名 2019-09-20 17:19:00

STM32内部温度传感器概述

记录一下,方便以后翻阅~主要内容:1)STM32内部温度传感器概述;2)

2021-12-10 06:11:04

STM32内部温度传感器简介

STM32 内部温度传感器1、

2021-12-06 06:40:31

如何用ADC测量内部温度传感器温度

stm32 ADC测量内部温度传感器

2021-11-24 06:11:35

STM32内部温度传感器简介

声明:此文件参考原创博客支持原创。1.简介:STM32有一个内部的温度传感器

2021-08-12 07:32:00

利用STM32F1的内部温度传感器来读取温度

本章介绍STM32F1的内部温度传感器,利用

2021-08-12 06:48:52

STM32内部温度传感器

实验目的STM32内部集成了一个温度传感器,可以用来测量芯片的

2021-08-12 06:40:58

STM32内部温度传感器参数

STM32内部温度传感器概要

2021-02-02 07:32:44
7天热门专题 换一换
相关标签