当前位置: 首页 > article >正文

stm32 内部温度传感器使用

文章目录

  • 一、STM32内部温度传感器简介
  • 二、温度传感器工作原理
  • 三、硬件配置与软件设置
  • 四、具体例程实现
  • 五、注意事项

STM32微控制器系列内置的温度传感器为此提供了一个经济高效的解决方案。本文将详细介绍如何在STM32微控制器上使用内部温度传感器,并通过一个具体的例程展示如何实现温度读取和计算。

一、STM32内部温度传感器简介

STM32系列微控制器内置了一个温度传感器,可用于测量CPU及其周围环境的温度。该传感器通过ADC(模数转换器)的特定输入通道(通常为ADC1_IN16或ADC1_IN18,具体取决于STM32的型号)连接,将温度转换为模拟电压信号,再由ADC转换为数字值。
STM32内部温度传感器的测量范围通常为-40°C至125°C,精度约为±1.5°C。尽管精度不高,但在许多应用场景中已足够使用,特别是在需要节省成本和简化电路设计的场合。

二、温度传感器工作原理

STM32内部温度传感器的输出电压随温度线性变化。通过读取该电压值,并使用特定的转换公式,可以计算出当前的温度。转换公式通常如下:
温度(°C) = {(V_SENSE - V_25) / Avg_Slope} + 25
其中:
V_SENSE是温度传感器的当前输出电压。
V_25是25°C时V_SENSE的电压值(典型值为1.43V)。
Avg_Slope是温度与V_SENSE曲线的平均斜率(典型值为4.3mV/°C)。

三、硬件配置与软件设置

硬件配置
选择STM32微控制器型号,确保支持内部温度传感器。
连接必要的电源和接地线。
根据需要,配置用于调试和通信的外部设备(如串口通信模块)。
软件设置
使用STM32CubeMX或类似的配置工具,启用ADC模块,并配置温度传感器相关的ADC通道(如ADC1_IN16)。
设置ADC的采样时间、分辨率等参数。
启用内部温度传感器功能。
配置串口通信(如USART),以便将温度数据输出到调试终端或上位机。

四、具体例程实现

以下是一个基于STM32 HAL库的简单例程,用于读取内部温度传感器的温度值,并通过串口输出。
#include “stm32f4xx_hal.h”
// ADC句柄声明
ADC_HandleTypeDef hadc1;
// 温度传感器校准参数(典型值)
#define V25_TYPICAL_VALUE 1430 // 25°C时的V_SENSE值(单位为mV)
#define AVG_SLOPE_TYPICAL 4300 // 温度与V_SENSE曲线的平均斜率(单位为μV/°C)
// 初始化ADC
void ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
// 启用ADC1时钟
__HAL_RCC_ADC1_CLK_ENABLE();
// 配置ADC1
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV6;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
// 配置ADC通道(ADC1_IN16,即内部温度传感器)
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
// 启用内部温度传感器
HAL_ADCEx_Calibration_Start(&hadc1);
while(HAL_ADCEx_Calibration_PollForEvent(&hadc1, HAL_ADCEX_CALIBRATION_EVENT) != HAL_OK);

// 启动ADC
HAL_ADC_Start(&hadc1);

}

// 读取温度值
float Read_Temperature(void)
{
HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
uint32_t adc_value = HAL_ADC_GetValue(&hadc1); // 获取ADC转换结果

// 将ADC值转换为电压值(单位为mV)
float voltage = (adc_value * 3300.0) / 4096.0;
// 使用转换公式计算温度值
float temperature = ((V25_TYPICAL_VALUE - voltage * 1000.0) / AVG_SLOPE_TYPICAL) + 25.0;

return temperature;

}
int main(void)
{
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟(根据具体项目需求配置)
MX_GPIO_Init(); // 初始化GPIO(根据具体项目需求配置)
MX_USART2_UART_Init(); // 初始化串口通信(根据具体项目需求配置)
ADC_Init(); // 初始化ADC

while (1)
{
    float temperature = Read_Temperature(); // 读取温度值
    char buffer[50];
    sprintf(buffer, "Temperature: %.2f °C\r\n", temperature); // 格式化温度值为字符串
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY); // 通过串口输出温度值
    HAL_Delay(1000); // 延时1秒
}

}

五、注意事项

温度传感器的线性度
尽管STM32内部温度传感器的输出电压随温度线性变化,但不同芯片之间的温度变化曲线可能存在偏移。因此,在使用时需要注意这一点,并根据实际情况进行校准。
采样时间
为了获得准确的温度读数,应确保ADC的采样时间足够长,以充分捕获温度传感器的输出信号。
电源稳定性
温度传感器的精度受电源稳定性影响。因此,在实际应用中,应确保电源电压稳定,以减少测量误差。


http://www.kler.cn/a/397216.html

相关文章:

  • 51单片机基础05 定时器
  • YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11 推理的 C++ 和 Python 实现
  • Java基础——多线程
  • 大模型基础BERT——Transformers的双向编码器表示
  • windows@多系统引导名字修改@默认引导系统修改@bcdedit配置
  • 什么是项目完整性管理?
  • 封装一个省市区的筛选组件
  • 【提高篇】3.3 GPIO(三,工作模式详解 上)
  • MuMu模拟器安卓12安装Xposed 框架
  • python爬虫快速获取商品历史价格信息
  • Ubuntu 系统端口查询与管理详细分析
  • linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
  • mongoDB的安装及使用
  • 中缀表达式转后缀表达式
  • 重学SpringBoot3-各种配置的优先级对比
  • [JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)
  • 使用 ts-node 运行 ts文件,启动 nodejs项目
  • 八、鸿蒙开发-网络请求、应用级状态管理
  • 去地面算法——depth_clustering算法调试(1)
  • 视频孪生技术在金融银行网点场景中的应用价值
  • 使用json配置动态区间及动态执行公式
  • IOPaint模型部署教程
  • 【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing
  • Oracle EBS FORM界面获取某LOV的方法
  • CentOS 源码安装FFmpeg
  • 【Qt】报错error: undefined reference to `vtable for的最简单解决