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.rhkb.cn/news/347587.html

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

相关文章

最强:智慧物流装备大全

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 在科技日新月异的今天&#xff0c;物流行业正经历着…

创新共享经济:探索Web3对新商业模式的启迪

随着Web3时代的到来&#xff0c;我们正在见证着一场数字经济的革命。在这个革命中&#xff0c;区块链技术作为一种基础设施&#xff0c;正为创新的共享经济模式提供新的契机。本文将深入探讨Web3对新商业模式的启迪&#xff0c;以及如何借助区块链技术构建更加开放、公平、高效…

程序员,真有不变的技术和稳定的工作吗?

在程序员这个充满变化和创新的领域&#xff0c;很多人追求“稳定”的工作&#xff0c;认为找到一个合适的公司和岗位就能安心一辈子。然而&#xff0c;技术的快速更新迭代和市场需求的不断变化&#xff0c;使得真正的稳定变得越来越难以捉摸。作为程序员&#xff0c;我们需要反…

手撕算法 | 华盛顿大学教授用45页PPT搞定了八大神经网络算法,全面解析

以下是八大常见的神经网络算法 1️⃣卷积神经网络&#xff08;CNN&#xff09;&#xff1a; 卷积神经网络&#xff08;CNN&#xff09;是一种深度学习模型&#xff0c;专门用于处理图像和音频等网格结构数据。它通过卷积操作提取特征&#xff0c;并通过池化操作降低数据维度。C…

IDM下载器2024快如闪电,告别等待!

网络时代&#xff0c;资源下载成为日常工作和生活的必需部分。然而&#xff0c;面对日益增长的数据量和多样化的下载需求&#xff0c;传统的下载方式往往显得捉襟见肘&#xff0c;不仅耗时耗力&#xff0c;还可能影响工作效率。 IDM马丁版下载如下: https://wm.makeding.com/…

破解动态网页:如何用JavaScript获取自动消失的联想词

前几天在做数据分析时&#xff0c;我尝试获取某网站上输入搜索词后的联想词&#xff0c;输入搜索词后会弹出一个显示联想词的框。有趣的是&#xff0c;当我尝试通过按F12定位这个弹框在HTML中的位置时&#xff0c;输入框失去焦点后&#xff0c;联想词弹框就自动消失了。我观察到…

【PowerDesigner】PDM生成REPORT

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. PDM生成REPORT &#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用PowerDesigner的…

你觉得前端开发人员有必要学习Rust吗?

有必要&#xff0c;为什么&#xff1f; 1. 性能优势 Rust能编译成高效的机器码&#xff0c;这对于需要高性能处理的前端项目尤其有利。例如&#xff0c;处理复杂的数据计算或图像处理时&#xff0c;Rust可以提供接近于C/C的性能&#xff0c;同时避免诸如内存泄漏或缓冲区溢出…

外汇天眼:Equals集团发布战略评估通知:MDP不再考虑收购提议

Equals Group plc (LON)今天发布了一份关于其战略评估的通知。 Equals公司不再与Madison Dearborn Partners, LLC (MDP)就公司的收购提议进行讨论。MDP因此发布了一份声明&#xff0c;确认其不打算为公司提出收购提议。 然而&#xff0c;MDP与其投资组合公司MoneyGram Interna…

Vue 面试通杀秘籍

理论篇&#xff1a; 1. 说说对 Vue 渐进式框架的理解&#xff08;腾讯医典&#xff09; a) 渐进式的含义&#xff1a; 主张最少, 没有多做职责之外的事 b) Vue 有些方面是不如 React&#xff0c;不如 Angular.但它是渐进的&#xff0c;没有强主张&#xff0c; 你可以在原有…

LogicFlow 学习笔记——1. 初步使用 LogicFlow

什么是 LogicFlow LogicFlow 是一个开源的前端流程图编辑器和工作流引擎&#xff0c;旨在帮助开发者和业务人员在网页端创建、编辑和管理复杂的业务流程和工作流。它提供了一个直观的界面和强大的功能&#xff0c;使得设计和管理工作流变得更加高效和便捷。 官网地址&#xff…

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错&#xff1a; 解决 这个大概率是缓存问题&#xff0c;我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示&#xff0c;说我包版本不对&#xff08;但是这个是警告应该没事&#xff0c;但是我还是装了&#xff09; npx expo install --…

企事业单位安全生产月活动怎样向媒体投稿?

作为一名单位的信息宣传员,我肩负着将每一次重要活动的精彩瞬间转化为文字,向外界传递我们单位声音的重任。初入此行时,我满怀热情,坚信通过传统的方式——电子邮件投稿,能够有效地将我们的故事传播出去。然而,现实却给我上了生动的一课。 记得在筹备“安全生产月”活动的宣传时…

Ubuntu22.04之解决:emacs无法输入中文问题(二百四十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

代码随想录 | Day18 | 二叉树:完全二叉树的节点个数平衡二叉树

代码随想录 | Day18 | 二叉树&#xff1a;完全二叉树的节点个数&&平衡二叉树 主要学习内容&#xff1a; 1.完全二叉树的性质&#xff0c;满二叉树的节点数量的计算 2.树的高度和深度问题要用后序遍历更加合适 222.完全二叉树的节点个数 222. 完全二叉树的节点个数…

MT2096 数列分段

代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e5 10; int n, m; int a[N]; int ans 1; int main() {cin >> n >> m;for (int i 1; i < n; i)cin >> a[i];int num 0;for (int i 1; i < n; i){if (num a[i…

【QT】记录一次QT程序发布exe过程

记录一次QT程序发布exe过程 使用windeploy与enigma发布独立的QT程序第一步 QT编译输出 **release** 版本第二步 QT 自带 windepoyqt 补全链接库第三步 enigma virtual box压缩打包为单一exe最后【2024-06-07 17】- 【补充】 贴一个自己用的bat脚本【**QtDeploy2exe.bat**】半自…

6月11号作业

思维导图 #include <iostream> using namespace std; class Animal { private:string name; public:Animal(){}Animal(string name):name(name){//cout << "Animal&#xff1b;有参" << endl;}virtual void perform(){cout << "讲解员的…

WordPress——Argon主题美化

文章目录 Argon主题美化插件类类别标签页面更新管理器文章头图URL查询监视器WordPress提供Markdown语法评论区头像设置发信设置隐藏登陆备份设置缓存插件 主题文件编辑器页脚显示在线人数备案信息(包含备案信息网站运行时间)banner下方小箭头滚动效果站点功能概览下方Links功能…

Spring Boot入门

目录 前言 1.安装Spring Boot Help插件 1.1查找插件并下载 2.2安装插件 2.Idea创建SpringBoot项⽬ 3.其他方式创建SpringBoot项⽬ 3.1 Spring 官网创建 3.2 阿里云创建 3.3 不基于任何页面&#xff0c;插件进行创建 4.⽬录介绍 5.项目启动 5.1项目启动前可能会遇到…