32_STM32内部温度传感器实验

news2024/11/19 1:42:37

目录

内部温度传感器简介

STM32ADC对应引脚

 内部温度传感器使用注意使用事项

开启内部温度传感器步骤

实验源码

内部温度传感器简介

内部温度传感器框图

从图上可以看出温度传感器可通过TSVREFR控制位连接到ADC的固定通道16,温度的值最终肯定是被转换成电压值,电压值然后通过我们ADC测量,电压值和温度之间是有一种线性的关系。

1.STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。

2.该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。

3.温度传感器模拟输入推荐采样时间是17.1us。

4.STM32的内部温度传感器支持的温度范围为: -40~125度。精度比较差,为土1.5℃左右。内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝度温度,应该使用一个外部温度传感器。

STM32ADC对应引脚

 内部温度传感器使用注意使用事项

第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2的TSVREFE位(bit23)设置。设置该位为1则启用内部温度传感器。

 第二个地方, STM32的内部温度传感器固定的连接在ADC的通道16上,所以,我们在设置好ADC之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:

 

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

Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/或uv/) (典型值为4.3Mv/℃)利用以上公式,我们就可以方便的计算出当前温度传感器的温度。

 取斜率为A,A=(V25-V)/(T-25),T=25+((V25-V)/A)

开启内部温度传感器步骤

1.选择ADC_IN16输入通道。
2.设置采样时间大于17.1us
3.设置ADC_CR2的TSVREFE位,打开内部温度传感器
4.设置ADON位启动转换
5.读取ADC结果
6.计算

实验源码

/**
  ******************************************************************************
  * @file           : user_rcc_config.c
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "user_rcc_config.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

/*!
	\brief		RCC配置
	\param[in]	none
	\param[out]	none
	\retval 	none
*/
void Rcc_config(void)
{	
	/*使能GPIOA时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	/*使能UART1时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	/*使能ADC1通道时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE );	
	/*设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
}

/************************************************************** END OF FILE ****/
 
/**
  ******************************************************************************
  * @file           : user_gpio.c
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "user_gpio.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

/*!
	\brief		GPIO初始化函数
	\param[in]	none
	\param[out]	none
	\retval 	none
*/
void Gpio_Init(void)
{	
	/*GPIO结构体*/
	GPIO_InitTypeDef GPIO_InitTypeDefstruct;
	
	/*UART1发送引脚配置*/
	GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_AF_PP;//推挽复用输出
	GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_9;
	GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;
	/*写入结构体到GPIOA*/
	GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
	
	/*UART1接收引脚配置*/
	GPIO_InitTypeDefstruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_InitTypeDefstruct.GPIO_Pin   = GPIO_Pin_10;
	GPIO_InitTypeDefstruct.GPIO_Speed =	GPIO_Speed_10MHz;
	/*写入结构体到GPIOA*/	
	GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct);
	
	/*PA1作为模拟通道输入引脚*/                      
	GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitTypeDefstruct);	
	
	
		
}

/************************************************************** END OF FILE ****/
 
/**
  ******************************************************************************
  * @file           : user_adc.c
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "user_adc.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

/*!
	\brief		ADC初始函数
	\param[in]	none
	\param[in]	none
	\retval 	none
*/
void Adc_Init(void)
{	
	/*ADC结构体*/
	ADC_InitTypeDef ADC_InitStructure;
	
	/*复位ADC1*/
	ADC_DeInit(ADC1); 
	/*ADC配置*/
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC1独立模式
	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通道的数目
	/*写入ADC1里面*/
	ADC_Init(ADC1, &ADC_InitStructure);	
	/*开启内部温度传感器检测*/
	ADC_TempSensorVrefintCmd(ENABLE);
	/*使能ADC1*/
	ADC_Cmd(ADC1, ENABLE);	
	/*使能复位校准*/
	ADC_ResetCalibration(ADC1);
	/*等待复位校准结束*/
	while(ADC_GetResetCalibrationStatus(ADC1));
	/*开启AD校准*/
	ADC_StartCalibration(ADC1);
	/*等待校准结束*/
	while(ADC_GetCalibrationStatus(ADC1));
 
}

/*!
	\brief		获取ADC1通道数值函数
	\param[in]	none
	\param[in]	none
	\retval 	none
*/
uint16_t Get_Adc(uint8_t Channel)
{
	/*ADC1,通道Channel,转换顺序1第一个转换,采样时间239.5个周期*/
	ADC_RegularChannelConfig(ADC1, Channel, 1, ADC_SampleTime_239Cycles5 );
	/*使能ADC1软件转换*/
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	/*等待转换结束*/
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ) == 0);
	/*返回最近一次ADC1转换结果*/	
	return ADC_GetConversionValue(ADC1);	

}

/*!
	\brief		获取ADC1内部温度转换取平均值
	\param[in]	none
	\param[in]	none
	\retval 	none
*/
uint16_t Get_Adc_Average(uint8_t Channel,uint8_t Count)
{
	uint32_t val = 0;
	uint8_t i;
	for(i =0;i<Count;i++)
	{
		val+=Get_Adc(Channel);
		delay_ms(5);
	}

	return val/Count;
}

/*!
	\brief		获取内部传感器温度值
	\param[in]	none
	\param[in]	none
\retval 	返回温度值(扩大100倍)
*/
uint16_t Get_Adc_Teprate(void)
{
	uint32_t val;
	uint16_t result;
	double temp;
	/*读取ADC1通道16,20次取取平均值*/
	val = Get_Adc_Average(ADC_Channel_16,20);
	/*电压是3.3V,12位精度的十进制就是4096,采样数值每一格代表几V电压=3.3/4096*/
	temp = (float)val*(3.3/4096);
	/*转换为温度值*/
	temp = (1.43-temp)/0.0043+25;
	/*放大100倍*/
	result = temp*=100;
	return result;
	
}


/************************************************************** END OF FILE ****/
 
/**
  ******************************************************************************
  * @file           : user_uart.c
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "user_uart.h"
/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/

extern uint16_t USART_RX_STA;
extern uint8_t USART_RX_BUF[200];


/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/
#if 1
#pragma import(__use_no_semihosting)  
/*实现Printf代码*/
struct __FILE 
{ 
	int handle; 

}; 
FILE __stdout;       

void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 




/*!
	\brief		UART1初始化
	\param[in]	none
	\param[out]	none
	\retval 	none
*/

void Uart1_Init(u32 bound)
{
	/*UART结构体*/
	USART_InitTypeDef USART_InitTypeDefstruct;
	
	/*UART结构体配置*/
	USART_InitTypeDefstruct.USART_BaudRate = bound; //波特率
	USART_InitTypeDefstruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //不使用硬件流
	USART_InitTypeDefstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收使能
	USART_InitTypeDefstruct.USART_Parity = USART_Parity_No; //不使用奇偶校验
	USART_InitTypeDefstruct.USART_StopBits = USART_StopBits_1; //1个停止位
	USART_InitTypeDefstruct.USART_WordLength = USART_WordLength_8b; //8个数据位
	/*写入USART1*/
	USART_Init(USART1,&USART_InitTypeDefstruct);
	
	/*使能串口1*/
	USART_Cmd(USART1,ENABLE);

}


/*!
	\brief		UART1中断服务函数
	\param[in]	none
	\param[out]	none
	\retval 	none
*/

void USART1_IRQHandler(void)
{

}
	

/************************************************************** END OF FILE ****/
 
/**
  ******************************************************************************
  * @file           : user_mian.h
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "user_adc.h"


/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/
//最多一次接收200个字节
uint8_t USART_RX_BUF[200];
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
uint16_t USART_RX_STA=0;       //接收状态标记	 
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/


 int main(void)
 {	
	float Temp;
	/*配置系统中断分组为2位抢占2位响应*/
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	 /*延时函数初始化*/
	 delay_init();
	/*RCC配置*/
	 Rcc_config();
	/*GPIO初始化*/ 
	 Gpio_Init();
	 /*初始化ADC1*/
	 Adc_Init();
	/*USART1初始化*/
	 Uart1_Init(9600);
	/*死循环*/ 
	 while(1){
	
	Temp = (float) (Get_Adc_Teprate()/100);
	printf("内部温度是:%.1f\r\n",Temp);
    delay_ms(1000);
		 
		 
	 }
		

}
 
 /************************************************************** END OF FILE ****/

 

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

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

相关文章

学会python这十个语言技法,让你有上手风范

如何让你的代码更有python味&#xff1f; 大部分编程语言都有共性&#xff0c;也有个性。下手害怕个性&#xff0c;视为异端&#xff0c;抵触之&#xff1b;上手善用个性&#xff0c;欣欣然&#xff0c;妙用之。 1、三元表达式 别抱怨python没有三元表达式&#xff0c;请看&…

《大数据导论》之数据的概念、类型和组织形式

目录 说在前面 一、数据的概念 二、数据类型 ​三、数据组织形式 说在前面 大数据时代悄然来临&#xff0c;带来了整个信息技术发展的巨大变革&#xff0c;并深刻影响着社会生产和人们生活的方方面面。全球范围内&#xff0c;世界各国政府也非常重视整个大数据的研究和产业…

hadoop pig-0.17.0 安装配置

下载Apache Pig 首先&#xff0c;从以下网站下载最新版本的Apache Pig&#xff0c;下载Pig步骤取自W3C&#xff1a;Pig安装教程 步骤1 打开Apache Pig网站的主页。在News部分下&#xff0c;点击链接release page&#xff08;释放&#xff09;&#xff0c;如下面的快照所示。 步…

解决git中出现的“bash syntax error near unexpected token ’(‘”错误

今天来分享一篇关于我在git使用过程中出现的一个错误。 错误信息&#xff1a; bash: syntax error near unexpected token (’ 翻译过来就是提示我在’(这里有错误&#xff0c;而这个错误是我在使用git commit提交时候产生的&#xff0c;我当时是这么写的&#xff1a; git c…

java中Optional的应用,以及map和flatMap的区别

关于Option的介绍可以看深入理解java8中的Optional 类就可以了&#xff0c;但是复杂一点的使用在网上却没有搜到&#xff0c;这里结合我开发时遇到的真实案例来讲一下Option的使用。 1.案例一 在真实业务操作过程中&#xff0c;都是对象里面套对象&#xff0c;这边先简单定义操…

flink window 框架详细解读

1. dataStream window group window time window 基于时间驱动 滚动时间窗口 tumble time window 滑动时间窗口 sliding time window 会话时间窗口 session time window count window 基于数据驱动 滚动计数窗口 tumble count window 滑动计数窗口 sliding count window 2. s…

皕杰报表之雷达图

雷达图&#xff08;又可称为戴布拉图、螂蛛网图&#xff09;是数据分析报表的一种。即将各项数据分析所得的数字或比率&#xff0c;就其比较重要的项目集中划在一个图表上&#xff0c;来表现一组数据的各项数据比率的情况&#xff0c;使用者能一目了然的了解这个数据的指标的变…

LeetCode中等题之通过最少操作次数使数组的和相等

题目 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间&#xff08;包含 1 和 6&#xff09;。 每次操作中&#xff0c;你可以选择 任意 数组中的任意一个整数&#xff0c;将它变成 1 到 6 之间 任意 的值&#xff08;包含 1 和 6&#…

计算机组成大题分析(三)

假定计算机 M 字长为 16 位&#xff0c;按字节编址&#xff0c;连接 CPU 和主存的系统总线中地址线为 20 位、数据线为 8位&#xff0c;采用 16 位定长指今字&#xff0c;指令格式及其说明如下: 其中&#xff0c;op1-op3 为操作码&#xff0c;rs&#xff0c;t 和 rd 为通用寄存…

【计算机视觉+CNN】keras+ResNet残差网络实现图像识别分类实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、深度卷积神经网络模型结构 1&#xff1a;LeNet-5 LeNet-5卷积神经网络首先将输入图像进行了两次卷积与池化操作&#xff0c;然后是两次全连接层操作&#xff0c;最后使用Softmax分类器作为多分类输出&#xff0c;它对…

MySQL插入汉字报错的解决方案

MySQL插入汉字报错的原因是字符集的问题&#xff0c;MySQL默认使用的是Latin&#xff08;拉丁文&#xff09;字符集&#xff0c;可以在创建数据库时指定其字符集&#xff1a;CREATE DATABASE test DEFAULT CHARACTER SET utf8 或者修改MySQL的配置文件&#xff0c;可以参考以下…

Qt事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

前言&#xff1a; 之前写过有关事件循环和条件变量的博客&#xff1a; Qt使用事件循环&#xff0c;信号&#xff0c;stop变量&#xff0c;sleep阻塞&#xff0c;QWaitConditionQMutex条件变量&#xff0c;退出子线程工作_大橘的博客-CSDN博客_qt stop函数 Qt事件循环&#x…

Unity3D导出Android工程中使用并交互

, 目录 1&#xff0c;版本信息 2&#xff0c;前期准备 Unity方面&#xff1a; Android方面&#xff1a; 3&#xff0c;Android与Unity3D交互 1&#xff0c;版本信息 unity2020 android studio 2021 *不要用android studio 2020系列&#xff0c;存在不能导入Library的b…

Spring学习 | Bean作用域生命周期

文章目录一、作用域1.1 xml文件中配置1.2 注解配置二、生命周期2.1 四个阶段2.2 添加后置处理器2.3 实现aware类型接口2.4 Bean 初始化的方式2.5 Bean 销毁的方式2.6 测试程序学习视频&#x1f3a5;&#xff1a;https://www.bilibili.com/video/BV1Vf4y127N5 一、作用域 ❓ 引入…

Linux系统中裸机按键中断的驱动方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何实现按键中断的驱动​方法。 目录 ​第一&#xff1a;外部中断头文件实现 ​第二&#xff1a;外部中断源文件的具体实现 ​第三&#xff1a;编写对应的main.c函数 ​第一&#xff1a;外部中断头文件实现 #ifndef _…

基于keras平台CNN神经网络模型的服装识别分析

在许多介绍图像识别任务的介绍中&#xff0c;通常使用着名的MNIST数据集。 最近我们被客户要求撰写关于图像识别的研究报告&#xff0c;包括一些图形和统计输出。但是&#xff0c;这些数据存在一些问题&#xff1a; 1.太简单了。例如&#xff0c;一个简单的MLP模型可以达到99…

Java搭建宝塔部署实战毕设项目springboot客户管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目&#xff0c;springboot客户管理系统源码&#xff0c;感兴趣的朋友可以自行下载搭建测试。 技术架构 技术框架&#xff1a;SpringBoot MySQL5.7 mybatis shiro Lay…

DDR4时序标准规范(一)

DDR4时序标准规范引脚描述DDR4 SDRAM寻址DDR4架构的模块描述功能描述简化状态机基本功能复位和初始化程序上电和初始化顺序电压稳定后的复位初始化顺序无控制的下电顺序引脚描述 标志类型功能CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的…

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析&#xff08;PCA&#xff09;是一种数据降维技巧&#xff0c;它能将大量相关变量转化为一组很少的不相关变量&#xff0c;这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析&#xff08;PCA&#xff09;的研究报告&#xff0c;包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows&#xff0c;MacOS&#xff0c;Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant&#xff0c;测试是否安装成功,显示如下&#xff1a; 2.下载安装virtua…