STM32内部温度传感器使用方法详解

news2024/11/18 14:42:41

STM32内部温度传感器使用方法详解

前言

STM32内部集成了一个片上温度传感器,可以用来测量MCU及周围的温度。测量范围:-40~125,精度±1.5℃。虽然精度不高,但在某些应用场景下是够了的,相比于外部接入传感器,使用内部温度传感器既可以节省成本,又可以简化电路。

1 温度传感器简介

1.1 工作原理

STM32内部温度传感器在芯片内部与ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值,继而换算成温度值。因此,我们只需设置一下内部ADC,并激活其内部通道就可以了。

在这里插入图片描述

温度换算公式如下:
T(℃)= ((V25 - Vsense) / Avg_Slope) + 25
注:
1、V25:Vsense在25度时的数值(典型值为:1.43)。
2、Avg_Slope:温度与Vsense曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为4.3mv/℃)。
3、Vsense:温度传感器的当前输出电压(温度传感器模拟输入推荐最快采样时间是17.1μs)。

温度传感器特性如下:
在这里插入图片描述

1.2 软件配置步骤

1、配置ADC参数。
2、使能内部温度传感器。
3、读取ADC数值并转换成温度值。

1.3 注意事项

1、温度传感器输出电压随温度线性变化,由于生产过程的变化,温度变化曲线的偏移在不同芯片上会有不同(最多相差45°C)。
2、内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度,如果需要测量精确的温度,应该使用一个外置的温度传感器。
3、硬件设计上注意VREF+和VREF-的接入电压(如果该MCU封装有VREF引脚的话,一般64pin及以下的没有)。

2 程序编写

根据上面的原理介绍,使用ADC1的通道16作为采集输入信号,采集到ADC电压值以后根据温度转换公式转换成温度数据。

参考测试代码:

#include "delay.h"
#include "sys.h"
#include "usart.h"     

// 初始化配置ADC参数(以规则通道为例)
void T_Adc_Init(void)  
{
    ADC_InitTypeDef ADC_InitStructure; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO, ENABLE);      // 使能ADC1通道时钟
  
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);   // 分频因子6时钟为72M/6=12MHz
	
    ADC_DeInit(ADC1);  // 将外设ADC1的全部寄存器重设为缺省值
	
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                   // ADC工作模式:ADC1和ADC2工作在独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;                        // 模数转换工作在单通道模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                  // 模数转换工作在单次转换模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  // 转换由软件而不是外部触发启动
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;               // ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;                              // 顺序进行规则转换的ADC通道的数目
    ADC_Init(ADC1, &ADC_InitStructure);    // 根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

	ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);    // ADC1规则通道转换,采样时间为239.5周期 
 
    ADC_Cmd(ADC1, ENABLE);    // 使能指定的ADC1
	ADC_TempSensorVrefintCmd(ENABLE);  // 开启内部温度传感器
	
    ADC_ResetCalibration(ADC1);     // 重置指定的ADC1的复位寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));    // 获取ADC1重置校准寄存器的状态,设置状态则等待

    ADC_StartCalibration(ADC1);     // ADC1校准
    while(ADC_GetCalibrationStatus(ADC1));        // 获取指定ADC1的校准程序,设置状态则等待

	// ADC_SoftwareStartConvCmd(ADC1,ENABLE); // 软件触发开始
}

// 获取ADC值
uint16_t T_Get_Adc(uint8_t ch)   
{
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);    // ADC1规则通道转换,采样时间为239.5周期                      
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);         // 使能指定的ADC1的软件转换启动功能
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));  // 等待转换结束
    return ADC_GetConversionValue(ADC1);            // 返回最近一次ADC1规则组的转换结果
}

// 获取通道ch的转换值(取times次平均值)
uint16_t T_Get_Adc_Average(uint8_t ch, uint8_t times)
{
    uint32_t temp_val = 0;
    uint8_t t;
    for(t = 0; t < times; t++)
    {
        temp_val += T_Get_Adc(ch);
        delay_ms(5);
    }
    return temp_val / times;
}        

// 获取内部温度传感器温度值
// 返回值:温度值(扩大了100倍,单位:℃)
int Get_Temprate(void)
{
    uint32_t adcx;
    int result;
    double Vsense;
    double temperate;
    adcx = T_Get_Adc_Average(ADC_Channel_16, 20); // 读取通道16, 20次取平均
    Vsense = (double)adcx * 3.3 / 4096;           // 电压值 
    temperate = (1.43 - Vsense) / 0.0043 + 25;    // 转换为温度值,转换公式:T(℃)= ((V25 - Vsense) / Avg_Slope) + 25
    result = (temperate *= 100);                  // 扩大100倍.
    return result;
}

int main(void)
{     
    int temp; 
	SystemInit();
    delay_init();            // 延时函数初始化      
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);       // 串口初始化为115200
    T_Adc_Init();            // ADC初始化              
    while(1)
    {
        temp = Get_Temprate();  // 读取温度值 
        if(temp > 0)
        {// 温度为正数
            printf("temp: %d.%02dC", temp/100, temp%100);
        }
        else
        {// 温度为负数
            printf("temp: %d.%02dC", temp/100, -temp%100);
        }
        delay_ms(500);    
    } 
}

示例代码测试结果:

在这里插入图片描述

结束语

上面的测试例子只是给大家做一个参考,实际上需要根据项目的具体需求去补充细节,比如温度的采样方式和采样频率,本文只是用最简单的单次采样,实际上可以使用DMA进行连续采样,跟普通ADC使用是一样的,这里就不再多说了,大家根据自己的实际情况调整即可。

好了,关于STM32如何使用内部温度传感器就介绍到这里,如果你们还有什么问题,欢迎评论区留言。

如果这篇文章能够帮到你,就…懂的。
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1276295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

集成开发环境 PyCharm 的安装【侯小啾python领航班系列(二)】

集成开发环境PyCharm的安装【侯小啾python领航计划系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

【EMFace】《EMface: Detecting Hard Faces by Exploring Receptive Field Pyramids》

arXiv-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Ablation Study5.3 Comparison with State-of-the-Arts 6 Conclusion&#xff08;own&#xff09; 1 Background and Motivatio…

flutter-一个可以输入的数字增减器

效果 参考文章 代码 在参考文章上边&#xff0c;主要是改了一下样式&#xff0c;逻辑也比较清楚&#xff0c;对左右两边添加增减方法。 我在此基础上加了_numcontroller 输入框的监听。 加了数字输入框的控制 keyboardType: TextInputType.number, //设置键盘为数字 inputF…

MySQL 基础、进阶、运维的学习笔记

1. MySQL 基础篇 1.1 MySQL 概述 1.1.1 数据库相关概念 数据库(Database, 简称 DB): 存储数据的仓库&#xff0c;数据是有组织的进行存储。 数据库管理系统(Database Management System, 简称 DBMS): 操作和管理数据库的大型软件。 SQL(Structured Query Language, 简称 S…

高并发下缓存失效问题-缓存穿透、缓存击穿、缓存雪崩、Redis分布式锁简单实现、Redisson实现分布式锁

文章目录 缓存基本使用范式暴露的几个问题缓存失效问题---缓存穿透缓存失效问题---缓存击穿一、单机锁正确的锁粒度不正确的锁粒度无法保证查询数据库次数是唯一 二、分布式锁getCatalogJsonData()分布式锁演进---基本原理分布式锁(加锁)演进一&#xff1a;删锁失败导致死锁分布…

『IDEA』代码热部署和热加载

前言 在日常开发中&#xff0c;我们需要经常修改 Java 代码&#xff0c;手动重启项目&#xff0c;查看修改后的效果。如果在项目小时&#xff0c;重启速度比较快&#xff0c;等待的时间是较短的。但是随着项目逐渐变大&#xff0c;重启的速度变慢&#xff0c;等待时间 1-2 min…

第一届云南大学CTF校赛YNUCTF-PWN提示(hint)

文章目录 easy-ikun四种方法 black_ikunsyscall-ikunikun-runner_记第一次校赛出题如何运行服务器?保存镜像 easy-ikun s[i:j] 表示获取a[i]到a[j-1] s[:-1]去掉最后一个字符 s[:-n]去掉最后n个字符 s[-2:]取最后两个字符 s[i:j:k]这种格式呢&#xff0c;i,j与上面的一样&…

android https 证书过期

有的时候 我们android https 证书过期 &#xff0c;或者使用明文等方式去访问服务器 可能会碰到类似的 问题 &#xff1a; javax.net.ssl.SSLHandshakeException: Chain validation failed java.security.cert.CertPathValidatorException: Response is unreliable: its validi…

Pandas进阶:文本处理

引言 文本的主要两个类型是string和object。如果不特殊指定类型为string&#xff0c;文本类型一般为object。 文本的操作主要是通过访问器str 来实现的&#xff0c;功能十分强大&#xff0c;但使用前需要注意以下几点。 访问器只能对Series数据结构使用。 除了常规列变量df.c…

Python 高性能 web 框架 - FastApi 全面指南

原文&#xff1a;Python 高性能 web 框架 - FastApi 全面指南 - 知乎 一、简介 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.6 并基于标准的 Python 类型提示。 它具有如下这些优点&#xff1a; 快速&…

【Geoserver】SLD点位样式(PointSymbolizer)设计全通

SLD文件可以控制geoserver的样式管理&#xff0c;这里专门针对点位进行设计&#xff0c;首先点位的设计需要用到这面这个大标签 之前的项目中已经用到了很多关于面的样式管理&#xff0c;这里新学习的是关于点的样式管理 PointSymbolizer 参考资料地址&#xff1a;https://doc…

基于hadoop下的hbase安装

简介 HBase是一个分布式的、面向列的开源数据库&#xff0c;该技术来源于Fay Chang所撰写的Google论文“Bigtable&#xff1a;一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统&#xff08;File System&#xff09;所提供的分布式数据存储一样&#xff0c;…

机器人导航地图——Obstacle层的障碍物-Bresenham算法详细解释

文章目录 前言一、Bresenham算法源码解析1. 函数raytraceFreespace2. 函数inline void raytraceLine3. 函数bresenham2D 二、Bresenham算法——C代码实现总结 前言 作者在读源代码时&#xff0c;遇到了下述的代码void ObstacleLayer::raytraceFreespace&#xff0c;不是很好理…

股票要怎么买入卖出?

股票账户终于开好了&#xff01;恭喜你马上就可以开启刺激的炒股之旅了&#xff01;不过第一次买股票的你是不是还不知道怎么个买法呢&#xff1f;别担心~贴心的汇小鲸带着教程来了&#xff0c;咱们一起看看吧&#xff01; 首先一点&#xff0c;大家得知道&#xff1a;开好户还…

速通MySql

一、简介 1、什么是数据库 数据仓库&#xff0c;用来存储数据。访问必须用SQL语句来访问 2、数据库的类型 1、关系型数据库&#xff1a;Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询&#…

Postman如何导入和导出接口文件

本文介绍2种导出和导入的操作方法&#xff1a;一种是分享链接&#xff0c;导入链接的方式&#xff08;需要登录&#xff09;&#xff1b;另一种是导出json文件&#xff0c;再次导入。下面将详细介绍。 由于第一种分享链接&#xff0c;导入链接的方式需要登录&#xff0c;所以推…

项目实战之RabbitMQ死信队列应用

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 文章目录 &#x1f31f;架构图&#x…

开源 LLM 安全扫描器

Vigil 是一款开源安全扫描程序&#xff0c;可检测即时注入、越狱以及对大型语言模型(LLM) 的其他潜在威胁。 当攻击者使用专门设计的输入成功影响 LLM 时&#xff0c;就会出现即时注入。这导致 LLM 无意中实现了攻击者设定的目标。 ​ 我对 LLM 的可能性感到非常兴奋&#xff…

MFC、VC++操作excel后,excel程序进程无法正常退出的非暴力处理方法

先说处理方式 1、最low的方式&#xff1a;强制结束进程 //打开进程得到进程句柄 HANDLE hProcessOpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid); if(hProcess!NULL) { //结束进程 if (TerminateProcess(hProcess,0)){printf("结束进程成功\n");return 0;} }这种方式…