STM32学习和实践笔记(35):内部温度传感器实验

1.STM32F1内部温度传感器介绍

1.1 STM32F1内部温度传感器简介

  STM32F1内部含有一个温度传感器,可用来测量 (STM32芯片的)CPU 及周围的温度(TA)。(实际并不用来测周围的温度,仅用来测试CPU的温度)

此温度传感器与ADC1内部输入通道相连接,如下图所示。它连接在ADC1_IN16上。ADC1可以将传感器输出的电压转换成数字值。STM32F1的内部温度传感器支持的温度范围为:-40~125 度,精度为±1.5℃左右。 (因为一方面温度的精度比较差,另一方面STM32工作时CPU会发热,所以不要利用这个温度传感器来测试STM32周围的环境温度,因为太不准确了~)    

  STM32F1 内部温度传感器的使用很简单,只要初始化下ADC1_IN16通道,并激活其内部温度传感器通道就差不多了。关于 ADC 的初始化,在上一节已经进行了详细的介绍,这里就不多说。接下来我们介绍一下和温度传感器设置相关的 2 个地方       

1)要使用 STM32F1 的内部温度传感器,必须先激活 ADC 的内部通道,这里通过ADC_CCR 的 TSVREFE 位( bit23)设置。设置该位为 1 则启用内部温度传感器,否则关闭内部温度传感器。

2)STM32F103ZET6的内部温度传感器固定的连接在 ADC1_IN16上,所以,我们在设置好 ADC1 之后只要读取通道 16 的AD值,就知道温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:

  T(℃) ={( V25 - Vsense) /Avg_Slope}+25

公式中

Vsebse:ADC读到并转换成电压的值

V25=Vsense 在 25 度时的数值(典型值为:1.43V)。

Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为4.3mV/℃,即0.0043V/℃)

通过上面公式,我们就能非常方便的计算出当前内部温度传感器测试的温度。           

2.内部温度传感器配置步骤

具体步骤如下:(ADC相关库函数在stm32f10x_adc.c和stm32f10x_adc.h文件中)

1)初始化ADC1_IN16相关参数,开启内度温度传感器

ADC1_IN16的初始化步骤与上一章介绍AD模数转换实验一样,这里我们只需要开启内部温度传感器即可,调用的库函数为:

ADC_TempSensorVrefintCmd(ENABLE);//打开ADC内部温度传感器

2)读取ADC1_IN16 AD值,将其转换为对应温度

上一步配置好后,我们就可以读取温度传感器的电压值,根据温度计算公式,可以求出对应电压值的温度,具体方法与上一章一样。 

3.硬件电路

  本实验使用到硬件资源如下

1)D1指示灯

2)串口1

3)内部温度传感器

  D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,至于内部温度传感器它属于STM32F1芯片内部的资源,连接的是ADC1_IN16通道。

4.编写内部温度传感器控制程序

  本实验所要实现的功能是:通过芯片内部温度传感器读取温度,并将读取的温度数据打印出去,D1指示灯闪烁提示系统正常运行。程序框架如下:

(1)初始化内部温度传感器(初始化ADC1_IN16,开启温度传感器)

(2)编写温度读取函数

(3)编写主函数

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "usart.h"
#include "adc_temp.h"int main()
{u8 i=0;int temp=0;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();USART1_Init(9600);ADC_Temp_Init();while(1){i++;if(i%20 ==0){led1=!led1;//LED1闪,用来指示主程序循环是否运行}if(i%50==0){temp=Get_Temperature();if(temp<0){temp=-temp;printf("芯片内部温度检测值为:-");}else{printf("芯片内部温度检测值为:+");}printf("%.2f 度 \r\n",(float)temp/100);}delay_ms(10);}}

              adc_temp.c

#include "adc_temp.h"
#include "SysTick.h"void ADC_Temp_Init()
{ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC的分频因子,6分频,因此ADC时钟频率为12MHZADC_TempSensorVrefintCmd(ENABLE);//打开ADC内部温度传感器ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;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_InitStructure.ADC_NbrOfChannel = 1;//转换通道数量ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化ADC_Cmd(ADC1, ENABLE);//开启AD转换器ADC_ResetCalibration(ADC1);//ADC复位校准while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开始指定 ADC1 的校准状态while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC开始转换}u16 Get_ADC_Temp_Value(u8 ADC_Chanle,u8 times)
{u8 t;u32 temp=0;ADC_RegularChannelConfig(ADC1, ADC_Chanle, 1, ADC_SampleTime_239Cycles5 );for(t=0;t<times;t++){ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC开始转换while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束temp+=ADC_GetConversionValue(ADC1);//读到的值累加delay_ms(5);}return temp/times; //返回累加的平均值}int Get_Temperature(void)
{u16 adc_value;double voltage;int temperature;//因为温度可能为负值所以定为int类型adc_value=Get_ADC_Temp_Value(ADC_Channel_16,10);voltage=(float)adc_value*(3.3/4096);temperature=((1.43-voltage)/0.0043+25)*100; //转换为温度值;*100是为了保留小数点后的两位数因为温度为int类型return temperature;}

             

程序写到开发板上,实验结果如下所示。实验是成功的!

    

                             

    

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

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

相关文章

以keepalived为例说明程序不能正常被gdb调试的原因

现象 通过gdb att $keepalived_pid发起对当前运行keepalived的调试&#xff1b; 在放行keepalived继续执行后&#xff0c;想通过CtrlC按键中断执行&#xff0c;观察下被调试程序的当前内部状态&#xff0c; 但是&#xff0c;在终端输入CtrlC后&#xff0c;导致keepalived被调…

通过语言大模型来学习LLM和LMM(四)

一、大模型学习 新的东西&#xff0c;学习的东西就是多&#xff0c;而且最简单最基础的都需要学习&#xff0c;仿佛一点基础知识都要细嚼慢咽&#xff0c;刨根问底&#xff0c;再加上一顿云里雾里的吹嘘&#xff0c;迷迷糊糊的感觉高大上。其实就是那么一回事。再过一段时日&a…

【Mongodb-02】springboot整合mongodb(详解)

springBoot整和mongodb 一&#xff0c;springboot整合mongodb1&#xff0c;依赖加入2&#xff0c;yml文件配置3&#xff0c;_class 字段过滤(可选)4&#xff0c;实体类定义5&#xff0c;索引创建6&#xff0c;数据插入6.1&#xff0c;insert方式6.2&#xff0c;使用save的方式实…

awtk如何实现键盘和输入框

1.创建默认键盘 新建窗体-keyboard 2.新建编辑框 3.设置编辑框属性 4.点击编辑框即可打开默认键盘&#xff0c;若想修改键盘样式可以在默认键盘修改或自定义键盘 5.获取输入字符 widget_t* wifi_edit widget_lookup(win, "edit", TRUE);//获取单行编辑控件 widge…

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

0-1 构建用户画像数仓

目录 前言 一、用户画像概述 1.1 用户画像 1.2 用户标签 1.3 用户群组 二、建设标签和标签体系 2.1 标签体系 2.1.1 统计类标签 2.1.2 规则类标签 2.1.3 机器学习挖掘类标签 2.2 标签建设流程 2.2.1 需求收集与分析 2.2.2 产出标签需求文档 2.2.3 标签的开发 H…

ffmpeg封装和解封装介绍-(8)解封装和封装重构

头文件&#xff1a; xformat.h #pragma once/// 封装和解封装基类#include <mutex> struct AVFormatContext; struct AVCodecParameters; struct AVPacket; struct XRational {int num; ///< Numeratorint den; ///< Denominator }; class XFormat { public:/// &…

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…

比特币全节点搭建

比特币全节点搭建 参考: https://www.cnblogs.com/elvi/p/10203927.html

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展&#xff0c;信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术&#xff0c;其重要性不言而喻。中国在密码学领域也取得了显著的成就&#xff0c;其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林&#xff08;Random Forest&#xff09;2. 其他Bagging方法 二、Boosting方法1. 梯度提升树&#xff08;Gradient Boosting Machine, GBM&#xff09;解释GBM的基本原理和…

【网络编程】进程间的通信

进程间通信意味着两个不同进程间交换数据&#xff0c;操作系统中应提供两个进程可以同时访问内存空间。 管道实现进程间通信 管道不属于进程资源&#xff0c;与套接字一样属于操作系统。两个进程通过操作系统提供内存空间进行通信 #include<unistd.h> int pipe(int fil…

IS022000认证:食品安全管理的金标准

食品安全是食品行业的命脉&#xff0c;IS022000食品安全管理体系认证作为最权威的认证之一&#xff0c;为企业提供了强有力的保障。要理解IS022000认证的意义&#xff0c;我们需要先了解它与HACCP和IS09001认证的关系。 HACCP&#xff08;Hazard Analysis and Critical Control…

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…

[Kubernetes] etcd 单机和集群部署

文章目录 1.etcd基本概念2.etcd的基本知识3.etcd优势4.etcd单机部署4.1 linux部署4.2 windows部署4.3 docker安装etcd 5.etcd集群部署 1.etcd基本概念 etcd是一个高可用的分布式键值存储系统&#xff0c;是CoreOS&#xff08;现在隶属于Red Hat&#xff09;公司开发的一个开源…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…

关于如何使用不到 ¥800 实现电动升降桌自由(双电机)

前言 在房子装修之前&#xff0c;就想着拥有一个书房。但是如果书房里面没有书桌&#xff0c;那不扯淡么&#xff1f;之后想着天天坐这么久&#xff0c;腰部颈部经常不适&#xff0c;所以又开始纠结买哪款人体工学椅子比较合适。 说时迟那时快。当天偶然刷小红书的时候&#x…

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样&#xff0c;官方没有提供一个统一的管理入口进行申请插件&#xff0c;以及查看插件&#xff0c;没有小程序方便的&#xff1b; 小程序申请查看插件入口如下图所示&#xff1a; 小游戏的插件可以通过以下的方式进行申请&#xff1a; 如下…

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业&#xff0c;八大员证的持有者是广受尊重的专业人士。然而&#xff0c;要成为一名合格的八大员&#xff0c;首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片&#xff0c;以确保个人信息准确无误。那么&#xff0c;你是否清楚报名时照片的要求以…