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时钟频率为12MHZ
	
	ADC_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.mfbz.cn/a/720507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023数模A题——定日镜场的优化问题

A题——定日镜场的优化问题 思路&#xff1a;该题主要考察的几何知识和天文学知识&#xff0c;需要不同角度下的镜面和遮挡情况。 资料获取 问题1&#xff1a; 若将吸收塔建于该圆形定日镜场中心&#xff0c;定日镜尺寸均为 6 m6 m&#xff0c;安装高度均为 4 m&#xff0c;且…

Python使用策略模式生成TCP数据包

使用策略模式&#xff08;Strategy Pattern&#xff09;来灵活地生成不同类型的TCP数据包。 包括三次握手、数据传输和四次挥手。 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethodclass TcpPacketStrategy(A…

表面声波滤波器——设计方案(4)

设计步骤 设计声表面波滤波器&#xff0c;首先需要分析器件的指标要求&#xff0c;如中心频率、使用带宽、插入损耗等&#xff0c;结合产线工艺水平&#xff0c;选择合适的衬底材料和换能器材料。确认可以满足器件性能需求的换能器设计方案&#xff0c;然后通过软件仿真。对叉…

Tomcat Websocket应用实例研究

概述 本文介绍了如何根据Tomcat给出的websocket实例&#xff0c;通过对实例的学习&#xff0c;定制自己基于websocket的应用。 环境及版本&#xff1a; Ubuntu 22.04.4 LTSApache Tomcat/10.1.20openjdk 11.0.23 2024-04-16浏览器&#xff1a;Chrome 相关资源及链接 Class…

vue+springboot导入Excel表格

1.创建一个excel表格,与数据库需要的表头对应 2.(前端)导入excel的按钮 <template class"importExcel"><el-button type"primary" click"chooseFile">导入<i class"el-icon-upload el-icon--right"></i><…

Office 2021 mac/win版:智慧升级,办公新风尚

Office 2021是微软推出的一款高效、智能且功能丰富的办公软件套件。它集成了Word、Excel、PowerPoint等多个经典应用程序&#xff0c;旨在为用户提供更出色的办公体验。 Office 2021 mac/win版获取 Office 2021在继承了前代版本优点的基础上&#xff0c;进行了大量的优化和创新…

第7周作业——单片机定时器与串口通信的学习与应用

一、蜂鸣器 &#xff08;一&#xff09;蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号&#xff0c;按照驱动方式可以分为如下两种&#xff1a; 1、有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上…

警告:Hydration attribute mismatch on Note: this mismatch is check-only.(水合不匹配)

vue3Nuxt3运行代码是提示如下警告 [Vue warn]: Hydration attribute mismatch on <ul id​"sub_menu_5_$$_sub1-popup" class​"ant-menu ant-menu-sub ant-menu-inline" data-menu-list​"true" style​"display:​none;​">​…

苹果手机618多次降价:京东618iPhone 15 Pro Max降价超2300元 销量重回销量榜第一

一年一度的618大促快接近尾声&#xff0c;在大促期间&#xff0c;iPhone 15多次降价后重回销量榜第一名。 买手机这个一定要领&#xff0c;你懂的&#xff01; &#xff08;20号结束 &#xff09; 淘宝APP搜&#xff1a;领到就赚3300 京东APP搜&#xff1a;好运红包588 如下…

88. 合并两个有序数组(简单)

88. 合并两个有序数组 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;88. 合并两个有序数组 2.详细题解 两个数组均有序&#xff08;非递减&#xff09;&#xff0c;要求合并两个数组&#xff0c;直观的思路&#xff0c;借助第三个数…

【多线程】线程状态

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 枚举线程所有状态2. 线程转移2.1 示意图2.2 观察 NEW 、 RUNNABLE 、 TERMINATED 状态的转换2.3 观察 WAI…

体育世界杂志体育世界杂志社体育世界编辑部2024年第5期目录

体育社会学 高校体育专业学生思想政治教育实效性探析 王小会; 11-13 高海拔援建人员体育科学保障的探索实践 冯斌;陈宇;赵文男; 14-16 温州市小学小篮球运动发展现状及优化策略研究 林秀丽; 17-19《体育世界》投稿&#xff1a;cn7kantougao163.com 上海市空竹运…

面向对象的进阶---static

1.static 静态变量 package com.itheima.a01staticdemo01;public class Student {private String name;private int age;public static String teacherName;public Student() {}public Student(String name, int age) {this.name name;this.age age;}/*** 获取* return n…

前端传进来的单选值是0,到了后端加了个逗号

如上图所示&#xff0c;标记的var的值org和id的值orgOrNot不能一样&#xff0c;如果一样&#xff0c;通过id获取&#xff08;#(“#orgOrNot”).find(“option:selected”).val()&#xff09;时候就会出现这种情况 改成如下情况&#xff0c;区别开id

C++ 61 之 函数模版

#include <iostream> #include <string> using namespace std;void swapInt(int &a,int &b){int temp a;a b;b temp; }void swapDou(double& a, double& b){double temp a;a b;b temp; }// T代表通用数据类型&#xff0c;紧接着后面的代码&a…

做户用光伏代理需要多少钱?

随着全球对可再生能源和清洁能源的关注度日益提高&#xff0c;光伏技术作为其中的佼佼者&#xff0c;已经成为许多投资者和创业者关注的焦点。户用光伏系统作为其中的一个重要分支&#xff0c;其市场潜力巨大&#xff0c;吸引了越来越多的投资者和创业者进入这一领域。那么&…

Linux实现: 客户端(cli01)通过TCP(或UDP)连接到聊天服务器(serv)进行聊天?(伪代码版本)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

使用 C# 学习面向对象编程:第 7 部分

多态性 我们在程序中使用多态的频率是多少&#xff1f;多态是面向对象编程语言的第三大支柱&#xff0c;我们几乎每天都在使用它&#xff0c;却不去想它。 这是一个非常简单的图表&#xff0c;它将解释多态性本身。 简单来说&#xff0c;我们可以说&#xff0c;只要我们重载类…

音乐管理系统 SpringBoot + vue

文章目录 1、简要介绍2、数据库设计3、解决的问题1、图片和音频的上传和存储2、分页功能 4、数据返回 也算是进行了半个学期&#xff0c;跟着老师讲的进行 后端使用SpringBoot 前端 vue layui jdk 18 项目地址&#xff1a;gitee 1、简要介绍 只有管理端&#xff0c;但是对用…

超多细节—app图标拖动排序实现详解

前言&#xff1a; 最近做了个活动需求大致类似于一个拼图游戏&#xff0c;非常接近于咱们日常app拖动排序的场景。所以想着好好梳理一下&#xff0c;改造改造干脆在此基础上来写一篇实现app拖动排序的文章&#xff0c;跟大家分享下这个大家每天都要接触的场景&#xff0c;到底…