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

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=12MHzADC_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);    // 使能指定的ADC1ADC_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) + 25result = (temperate *= 100);                  // 扩大100倍.return result;
}int main(void)
{     int temp; SystemInit();delay_init();            // 延时函数初始化      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);       // 串口初始化为115200T_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.mzph.cn/news/190220.shtml

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

相关文章

最新Graphviz python安装教程及使用

文章目录 Graphviz 安装python安装graphviz库 Graphviz 安装 Graphviz是一个独立的软件&#xff0c;在用python的pip下载之前&#xff0c;需要先下载软件。 网址&#xff1a;https://graphviz.org/download/ 找到合适的版本进行下载安装。记住自己的安装位置&#xff0c;完…

Linux - 进程间通信

进程通信 初步理解进程通信 所谓进程之间的通信&#xff0c;就是两个进程之间的 数据层面的交互。 我们之前说过&#xff0c;父子进程之间是有一些数据通信的&#xff0c;子进程可以看到一些父进程 允许 子进程访问的数据&#xff0c;比如 父进程的 环境变量&#xff0c;子…

用通俗的方法讲解:大模型微调训练详细说明(附理论+实践代码)

本文内容如下 介绍了大模型训练的微调方法&#xff0c;包括prompt tuning、prefix tuning、LoRA、p-tuning和AdaLoRA等。 介绍了使用deepspeed和LoRA进行大模型训练的相关代码。 给出了petals的介绍&#xff0c;它可以将模型划分为多个块&#xff0c;每个用户的机器负责其中一…

InsCode实践分享

在当今信息爆炸的时代&#xff0c;如何从海量信息中脱颖而出&#xff0c;获取更多的关注和认可&#xff0c;成为了许多人的共同追求。作为知乎平台上的优质用户&#xff0c;我愿意分享一些自己的经验和技巧&#xff0c;帮助大家更好地运用InsCode&#xff0c;实现个人成长和进步…

【爬虫逆向分析实战】某笔登录算法分析——本地替换分析法

前言 作者最近在做一个收集粉币的项目&#xff0c;可以用来干嘛这里就不展开了&#x1f601;&#xff0c;需要进行登录换算token从而达到监控收集的作用&#xff0c;手机抓包发现他是通过APP进行计算之后再请求接口的&#xff0c;通过官网分析可能要比APP逆向方便多&#xff0…

01-使用Git操作本地库,如初始化本地库,提交工作区文件到暂存区和本地库,查看版本信息,版本切换命令等

Git的使用 概述 Git是一个分布式版本控制工具, 通常用来管理项目中的源代码文件(Java类、xml文件、html页面等)进行管理,在软件开发过程中被广泛使用 Git可以记录文件修改的历史记录并形成备份从而实现代码回溯, 版本切换, 多人协作, 远程备份的功能Git具有廉价的本地库,方便…

开源图床Qchan本地部署远程访问,轻松打造个人专属轻量级图床

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

如果你想成为一名提示词工程师(Prompt Engineer),这款工具你不能错过

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 前言 我们知道&#xff0c;如果想要通过AI得到更好更精确的答案&#xff0c;那么提示词Prompt的好坏至关重要。 因此&#xff0c;提示词工程师这个岗位应运而出。…

第一节:认识微服务

一、微服务技术对比 Dubbo SpringCloudSpringCloudAlibaba注册中心zookeeper、Redis Eureka、ConsulNacos、Eureka服务远程调用Dubbo协议Feign&#xff08;http协议&#xff09;Dubbo、Feign配置中心无SpringCloudGateway、ZuulSpringCloudConfig、Nacos服务网…

qemu网络通信

TAP&#xff08;官网参考地址&#xff09; TAP&#xff0c;即Tunneling traffic access point&#xff0c;是一种在Linux上使用的虚拟网卡技术&#xff0c;它可以为应用程序提供安全的网络连接。可以利用TAP搭建桥接网络&#xff0c;bridge两端分别为host和qemu虚拟机。 安装…

力扣 790. 多米诺和托米诺平铺(一维dp)

题目描述&#xff1a; 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 "L" 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都…

具有标记和笔记功能的文件管理器TagSpaces(续)

熟悉老苏的读者都知道&#xff0c;老苏通常只是推荐软件&#xff0c;并简单介绍如何运行它们&#xff0c;而具体的功能则需要读者自行研究。这种方式让老苏能够在工作之余&#xff0c;还能保持每周发布 4 篇的更新。 然而&#xff0c;这种方式也存在明显的缺点。由于老苏没有深…

通义千问 Qwen-7B-Chat-Int4 模型本地化部署

如需在本地或离线环境下运行本项目&#xff0c;需要首先将项目所需的模型下载至本地&#xff0c;通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。 以本项目中默认使用的 LLM 模型 THUDM/ChatGLM2-6B 与 Embedding 模型 moka-ai/m3e-base 为例&#xff1a; 下载模型…

WordPress采集器自动采集发布的工具

WordPress作为最受欢迎的内容管理系统之一&#xff0c;其强大的功能和灵活性使其成为许多网站、博客和电子商务平台的首选。WordPress采集器自动采集发布内置采集规则是一项备受关注的功能&#xff0c;让用户可以轻松收集并发布内容。WordPress采集器自动采集发布内置采集规则的…

「Verilog学习笔记」自动贩售机1

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 自动贩售机中可能存在的几种金额&#xff1a;0&#xff0c;0.5&#xff0c;1&#xff0c;1.5&#xff0c;2&#xff0c;2.5&#xff0c;3。然后直接将其作为状态机的几种状…

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.MySQL的主从复制 MySQL的主从复制是什么&#xff1f;MySQL主从复制是一种常见的…

11.28~11.29基本二叉树的性质、定义、复习;排序算法;堆

完全二叉树&#xff08;Complete Binary Tree&#xff09;是一种特殊的二叉树结构&#xff0c;它具有以下特点&#xff1a; 所有的叶子节点都集中在树的最后两层&#xff1b;最后一层的叶子节点都靠左排列&#xff1b;除了最后一层&#xff0c;其他层的节点数都达到最大值。 …

网络基础:网络通信基础

目录 1.网络通信基本单位 2.网络通信基础 3.调制技术 4.解调技术 5.载波调制 6.编码技术 6.1基本编码 6.2应用型编码 1.曼彻斯特编码 2.差分曼彻斯特编码 3.MLT-3编码 4.mB/nB编码 1.网络通信基本单位 Byte&#xff08;字节&#xff09;是用于计量存储容量的一种…

【开发PaaS】基于Postgresql的开发平台Supabase

Supadase是开源的。我们选择可扩展的开源工具&#xff0c;使其易于使用。 Supadase不是Firebase的1对1映射。虽然我们正在构建Firebase提供的许多功能&#xff0c;但我们不会以同样的方式进行&#xff1a; 我们的技术选择大不相同&#xff1b;我们使用的一切都是开源的&#…

xilinx系列FPGA基于VIVADO的pin delay列表生成说明

目录 1 概述2 示例平台3 操作说明4 注意事项 xilinx系列FPGA基于VIVADO的pin delay列表生成说明 1 概述 本文用于讲诉xilinx系列FPGA基于VIVADO的pin delay列表生成说明&#xff0c;以及一些注意事项&#xff0c;为FPGA设计人员探明道路。 Pin delay 即FPGA内部die到pin的延时…