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.hqwc.cn/news/239288.html

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

相关文章

Python 流程控制

目录 程序流程 顺序结构 分支结构 单分支 双分支 多分支 if 嵌套 循环结构 while循环 for 循环 退出循环 循环与分支嵌套 附录 程序流程 程序是由语句构成&#xff0c;而流程控制语句 是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑…

ipa应用测试平台怎么开开具发票

控制台-个人中心-发票管理 ●点击申请发票可以开具发票 ●申请发票-填写资料-勾选订单 ●个人发票开具以及公司发票开具 ●提交发票申请 ●等待申请成功开具发票 ●发票开具成功&#xff0c;我们可以开具或者查看发票

Leetcode—392.判断子序列【简单】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—392.判断子序列 双指针实现代码 bool isSubsequence(char* s, char* t) {int lens strlen(s);int lent strlen(t);int left 0, right 0;if(lens 0) {return true;}while(right < lent) {if(t[right] s[left])…

pta模拟题(7-15 BCD解密、7-16 数列求和-加强版、7-17 出租、7-18 反向数相加、7-19 一帮一、7-20 连续因子)

7-15 BCD解密 BCD数是用一个字节来表达两位十进制的数&#xff0c;每四个比特表示一位。所以如果一个BCD数的十六进制是0x12&#xff0c;它表达的就是十进制的12。但是小明没学过BCD&#xff0c;把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制…

周报:浅谈对豆瓣网页实战的注意事项

制作整体网页时HTML代码和CSS代码的常用处理方法&#xff1a; 分开HTML代码和CSS代码&#xff0c;专门制作一个CSS文件专门来放置css代码&#xff0c;css文件里一般有作者样式(XXX.css)和通用样式(common.css)。这样会使代码更易维护&#xff0c;且整齐美观。 写代码前的注意…

6 新建工程——寄存器

文章目录 6.1 本地新建工程文件夹6.2 新建工程6.2.1 选择CPU型号6.2.2 在线添加库文件6.2.3 添加文件6.2.4 复制存储器分配文件6.2.5 配置选项卡 版本说明&#xff1a;MDK5.24 6.1 本地新建工程文件夹 可随意命名&#xff0c;该目录下新建 2 个文件夹 Listings 和 Objects 6…

GPC-SCP03安全通道协议

概述&#xff1a; 规范全称&#xff1a; GlobalPlatform Technology Secure Channel Protocol 03 Card Specification V2.3 - Amendment D Version 1.1.2 安全通道的建立的标志即通讯双方都形成三个安全通道共享密钥(Derived Session Key)&#xff0c;它们是Kmac, Krmac, Kenc…

Sass 同时导出JavaScript 和 CSS变量

Sass 官网 安装插件 注意 sass-loader 版本没设太高&#xff0c;否则会报错 Syntax Error: TypeError: this.getOptions is not a function npm i sass sass-loader10 -D创建 Sass 文件 variables.module.scss。注意这里是 module.scss&#xff1a; 否则报错 Cant find st…

docker 搭建开发环境,解决deepin依赖问题

本机环境&#xff1a; deepin v23b2 删除docker旧包 sudo apt-get remove docker docker-engine docker.io containerd runc注意卸载docker旧包的时候Images, containers, volumes, 和networks 都保存在 /var/lib/docker 卸载的时候不会自动删除这块数据&#xff0c;如果你先…

PyQt6 QRadioButton单选按钮控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计33条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

SQL Server 2016(创建数据库)

1、实验环境。 某公司有一台已经安装了SQL Server 2016的服务器&#xff0c;现在需要新建数据库。 2、需求描述。 创建一个名为"db_class"的数据库&#xff0c;数据文件和日志文件初始大小设置为10MB&#xff0c;启用自动增长&#xff0c;数据库文件存放路径为C:\db…