STM32F4_内部温度传感器

news2024/12/23 4:05:02

目录

1. 什么是温度传感器

2. 温度传感器简介

3. 库函数配置内部温度传感器

4. 实验程序

4.1 main.c

4.2 ADC.c

4.3 ADC.h


1. 什么是温度传感器

        温度传感器是一种测量物体冷热程度的设备,以可读的方式通过电信号提供温度测量。比较常见的如热电偶温度传感器

        在实际应用中,温度传感器根据类型不同又可以分为接触式温度传感器非接触式温度传感器

        接触式温度传感器显然需要与被感测对象进行物理上的接触,由此进行温度上的传导,并且以此来检测温度变化。这种接触方式下的传感器可以在很宽的温度范围内检测固体、液体和气体。

        非接触式温度传感器显然不需要物理意义上的接触,这种温度传感器使用对流和辐射来监测温度变化。可用于检测液体和气体。其实质是根据这些液体和气体在热和冷的对流中沉降到底部而发射辐射能,或者检测以红外辐射(太阳)形式从物体上传输的辐射能。        

2. 温度传感器简介

温度传感器可用于测量CPU及器件的环境温度(T_{A})。

对于STM32F4xx器件,温度传感器内部连接到ADC1_IN16通道,ADC1用于将传感器的输入电压转换为数字值。在不使用的时候可以将传感器置于掉电模式。

主要特性

  • 支持感应的温度范围:-40℃到125℃
  • 精度:\pm1.5℃

 

V_{SENSE}是至ADC1_IN16的输入。

读取温度:

  • 选择ADC1_IN16输入通道。
  • 选择一个采样时间,该采样时间需要大于17.1us。(17.1us是数据手册设置的最低采样时间)
  • 在ADC_CCR寄存器中将TSVREFE位置1,以便将温度传感器从掉电模式中唤醒。
  • 通过将SWSTART位置1(软件触发)或者通过外部触发开始ADC转换。
  • 读取ADC_DR数据寄存器中生成的V_{SENSE}数据。
  • 使用相应的公式去计算温度:

        温度 ℃={(V_{SENSE}-V_{25 })/Avg_Slope}+25

其中V_{25}等于25℃时V_{SENSE}的值(典型数值:0.76)

Avg_Slope等于温度与V_{SENSE}曲线的平均斜率(典型值:2.5Mv/℃)   斜率可以通过下图计算出来

注意:

  1. 传感器从掉电模式中唤醒需要一个启动时间,启动时间过后其才能正确输出V_{SENSE}。ADC在上电过后同样需要一个启动时间,因此,为尽可能的减少延迟时间,应该同时将ADON位(开始ADC)和TSVREFE(从掉电模式中唤醒的标志位)位置1。
  2. 是使用STM32F4的内部温度传感器,必须先激活ADC的内部通道,通过ADC_CCR寄存器进行软件操作将相应位置1即可。

3. 库函数配置内部温度传感器

1. 设置ADC1,开启内部温度传感器

我们已经学习过了ADC1的设置方法,在设置ADC1的代码基础上加上使能内部温度传感器函数即可。

ADC_TempSensorVrefintCmd(ENABLE);       //使能内部温度传感器

2. 读取通道16的AD值,计算结果

因为温度传感器是接在ADC1_IN16上的,所以需要读取通道16的传感器电压值,用公式计算出温度值即可。

4. 实验程序

4.1 main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "lcd.h"
#include "usmart.h"
#include "Key.h"
#include "ADC.h"

//LCD状态设置函数
void led_set(u8 sta)//只要工程目录下有usmart调试函数,主函数就必须调用这两个函数
{
	LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
	led_set(sta);
}

int main(void)
{
	short temp;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);
	uart_init(115200);
	LED_Init();
	LCD_Init();
	Adc_Init();
	POINT_COLOR=RED;
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
	LCD_ShowString(30,70,200,16,16,"ADC TEST");
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2023/20/23");
	POINT_COLOR=BLUE;
	LCD_ShowString(30,130,200,16,16,"Temperature: 00.00C");//固定温度的小数点
	while(1)
	{
		temp=Get_Temperature();//获取温度值
		//同51单片机一样,需要判断温度是否小于0,如果小于0,需要在温度前面打印出负号
		if(temp<0)
		{
			temp=-temp;//把负的温度前的符号去掉,人为通过ShowString打印出负号
			LCD_ShowString(30+12*8,130,200,16,16,"-");
		}
		else   //否则表示此时的温度在正数
		{
			LCD_ShowString(30+12*8,130,200,16,16," ");//无符号
		}
		LCD_ShowxNum(30+13*8,130,temp/100,2,16,0);//显示整数部分 /除打印出整数因此拿出来的是整数部分
		LCD_ShowxNum(30+16*8,130,temp%100,2,16,0);//显示小数部分 %取余打印出的是小数部分
		LED0=!LED0;
		delay_ms(250);
	}
}

4.2 ADC.c

#include "stm32f4xx.h"                
#include "ADC.h"
#include "delay.h"

//初始化ADC
void Adc_Init(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 使能ADC1时钟
	
	//初始化ADC1通道5 IO口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;  //模式为模拟输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;  //PA5 通道5
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //不带上下拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   //ADC1复位
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    //复位结束
	
	ADC_TempSensorVrefintCmd(ENABLE);//使能内部温度传感器
	
	//初始化CCR通用控制寄存器配置
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; //DMA失能
	ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;  //独立模式
	ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;  //预分频值设置
	ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间延迟5个时钟
	ADC_CommonInit(&ADC_CommonInitStructure);
	
	//初始化ADC1相关参数
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;  //关闭连续转换
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;  //右对齐
	ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; //禁止触发检测,使用软件触发
	ADC_InitStructure.ADC_NbrOfConversion=1;  //1个转换在规则序列中
	ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;  //12位模式
	ADC_InitStructure.ADC_ScanConvMode=DISABLE; //非扫描模式
	ADC_Init(ADC1,&ADC_InitStructure); //ADC初始化
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);  //ADC5,ADC通道,480个周期
	ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_480Cycles);  //ADC16,ADC通道,480个周期
	ADC_Cmd(ADC1,ENABLE);   //开启AD转换器
}
//获取ADC值
//ch:通道值 0~16
//返回值:转换结果
u16 Get_Adc(u8 ch)
{
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_480Cycles);//设置ADC规则组通道,一个序列,采样时间480
	ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//读取状态寄存器的状态位EOC,等待转换结束
	return ADC_GetConversionValue(ADC1);//返回最近一次的ADC1规则组的转换结果
}
//获取通道ch的转换值,取times次,然后平均
//ch:通道编号  times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val=temp_val+Get_Adc(ch); //取times次通道值进行求和
		delay_ms(5);
	}
	return temp_val/times; //返回平均值
}
short Get_Temperature(void)
{
	u32 adcx;
	short result;
	double Temperature;
	adcx=Get_Adc_Average(ADC_Channel_16,20);
	Temperature=(float)adcx*(3.3/4096);  //计算传感器的电压值给到温度
	Temperature=(Temperature-0.76)/0.0025+25;  //通过公式计算出来的温度值
	Temperature=Temperature*100;   //扩大100倍
	result=Temperature;
	return result;
}


4.3 ADC.h

#ifndef _ADC__H_
#define _ADC__H_

void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
short Get_Temperature(void);
#endif

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

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

相关文章

越来越多的单身女性开始买房了

近日&#xff0c;越来越多的单身女性开始购买房产&#xff0c;这一现象引起了社会的广泛关注。 根据中国青年报社会调查中心联合问卷网对2006名受访者进行的一项调查显示&#xff0c;84.2%的受访者认为近几年身边单身女性购房的现象增多了&#xff0c;而93.9%的受访者支持单身女…

无监督域适应 (UDA)(3)

本帖介绍基于 bi-classifier adversarial learning 的改进。 一、动机 模型训练在两个步骤之间交替进行:(I)约束两个分类器的学习&#xff0c;以最大化未标记目标域数据的预测差异;(II)约束特征提取器的学习&#xff0c;以最小化这种差异。 尽管这种方法是一种优雅的表述&am…

Call for Papers丨第一届LLM@IJCAI‘23 Symposium,大会主席陈雷、杨强、唐杰

大规模语言模型&#xff08;LLMs&#xff09;&#xff0c;如ChatGPT和GPT-4&#xff0c;以其在自然语言理解和生成方面的卓越能力&#xff0c;彻底改变了人工智能领域。 LLMs广泛用于各种应用&#xff0c;如语音助手、推荐系统、内容生成模型&#xff08;如ChatGPT&#xff09…

开源进展 |WeBASE更新啦,快来了解新特性!

WeBASE&#xff08;WeBank Blockchain Application Software Extension&#xff09; 是在区块链应用和FISCO BCOS底层之间搭建的一套通用组件&#xff0c;围绕交易、合约、密钥管理、数据、可视化管理来设计各个模块&#xff0c;屏蔽了区块链底层的复杂度&#xff0c;从而极大降…

多模态GPT:国内发布一款可以在线使用的多模态聊天机器人!快来把玩~

论文: MultiModal-GPT: A Vision and Language Model for Dialogue with Humans代码: https://github.com/open-mmlab/Multimodal-GPT &#xff08;包含代码、数据、demo&#xff09;作者&#xff1a;OpenMMLab 深度学习自然语言处理 原创作者: 林哲乐 使用视觉和语言指令训练一…

Linux基础学习---3、时间日期类、用户管理命令、用户组管理命令

1、时间日期类 1、基本语法date [Option] ...[Format]2、选项说明 选项功能-d<时间字符串>显示指定的“时间字符串”表示的时间&#xff0c;而非当前时间-s<日期时间>设置日期时间 3、参数说明 参数功能<日期时间格式>指定显示时使用的日期时间格式 1.1…

一、数据库设计

整个项目的设计包括5个数据库&#xff1a; glkt_activity:优惠券的相关设计 glkt_order:订单的相关设计 glkt_user:得到微信授权的账号信息的相关设计 glkt_vod:课程信息的相关设计 glkt_wechat:微信公众号的相关设计 glkt_activity&#xff1a; coupon_info:优惠券的信息 cou…

java+iClient Openlayers实现土壤墒情旱情灾害模拟预报预警分析

应用及软件实现效果图&#xff1a; 一、应用背景 作为一个农村长大的人&#xff0c;我非常关注自然灾害和气候变化对土地旱情墒情影响。近年来&#xff0c;干旱和洪涝灾害在很多地方频繁发生&#xff0c;给人们的生命财产安全带来了极大的威胁。因此&#xff0c;旱情和墒情模拟…

在计算语义相似度中,我看网上说要加range,我不知道往哪里加?

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 行宫见月伤心色&#xff0c;夜雨闻铃肠断声。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银交流群【王王雪饼】问了一个Python处理语义相…

Python学习历程-元组的基本操作回顾

在学习元组之前&#xff0c;我们先再回过头看看之前写过的文章&#xff0c;看看列表的一些基本操作&#xff1a; Python中的列表介绍 记录我的Python学习历程-列表的基本操作&#xff0c; 接下来再快速回顾一下元组的一些重点&#xff1a; 列表属于可变序列&#xff0c;元组、字…

Powerlink协议使用极简入门教程

网上关于powerlink协议的知识太少&#xff0c;而且都太分散太零碎&#xff0c;容易让人一头扎进去摸不着头绪。新手看到demo源码可能都不知道有什么用途&#xff0c;怎么能联动的跑起来看到效果&#xff0c;有种无从下手的感觉。其实Powerlink协议的使用挺简单&#xff0c;特别…

STM32F4_光敏传感器

目录 1. 什么是光敏传感器、光敏电阻 2. 硬件分析 3. 实验程序 3.1 main.c 3.2 ADC3.c 3.3 ADC3.h 3.4 Lightsensor.c 3.5 Lightsensor.h 1. 什么是光敏传感器、光敏电阻 光敏传感器也称为光电传感器。是利用光电器件把光信号转换成电信号的一种传感器。它的敏感波长在…

opencv实践项目-多张图片拼接之stitcher

目录 1.简介2. 拼接算法流程3. 代码演示 1.简介 OpenCV从2.4.x版本之后多出来一个新的模型 图像拼接&#xff0c;该模块通过简单的高级API设置&#xff0c;可以获得比较好的图像拼接效果&#xff0c;OpenCV官方提供了一个高度集成的API函数 Stitcher&#xff0c;只要两行代码就…

SRE/DevOps不得不懂的:Prometheus的配置工程化!

原创不易&#xff0c;还请关注和转发&#xff5e;谢谢 背景 Prometheus有两个最基本的组件&#xff1a;一个是Prometheus程序&#xff0c;一个是Alertmanager程序。 它们的职责分工很明确&#xff1a; • Prometheus程序负责&#xff1a;定时拉取监控指标数据、存储指标数据、根…

谈谈IOC容器和AOP编程

Java发展的路途中&#xff0c;由刚开始的使用new创建对象&#xff0c;到使用抽象类&#xff0c;接口进行解耦&#xff0c;又到了提问时刻&#xff0c;什么是耦合度&#xff1f; 对于这个对象的关联和依赖关系&#xff0c;例如&#xff1a; 当一个对象要使用&#xff0c;但是&…

4.6k Star,SpringBoot+Vue+App+硬件实现的智能家居系统,一套带走

今天&#xff0c;推荐一个智能家居系统项目。这是我目前见过的最好的智能家居系统项目&#xff0c;功能完整&#xff0c;代码结构清晰。值得推荐。 4.6k Star&#xff0c;SpringBootVueApp硬件实现的智能家居系统&#xff0c;一套带走 简介 FastBee是一个简单易用的物联网平…

Cocos Shader实现HSL和RGB颜色模型

HSL和RGB是两种常见的颜色模型&#xff0c;被广泛应用于计算机图形学、数字图像处理、Web设计等领域。在进行颜色处理时&#xff0c;经常需要将HSL和RGB相互转换&#xff0c;本demo演示如何通过Cocos Creator 3.7游戏引擎&#xff0c;用HSL模型来调节图片颜色&#xff0c;并详细…

徐培:以数据智能技术助力制造型企业降本增效

导语 2023年4月7日&#xff0c;由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店盛大开启。次日&#xff0c;云和恩墨数据智能产品部总经理徐培博士在“智胜未来&#xff1a;数据技术创新应用”…

二、讲师管理接口开发总结

首先本项目将实体类单独放在model包中&#xff0c;方便后期集体的调用&#xff1a; 整个项目的建包结构都是在java包中建立com.lxl.ggkt包&#xff0c;方便后期包路径的扫描。 上述有三个包&#xff1a; enums包规定了一些状态规定&#xff0c;比如优惠券是否使用&#xff0c…

CVE-2017-7921漏洞复现

文章目录 漏洞描述 漏洞描述 0x01 CVE-2017-7921漏洞复现 许多HikvisionIP摄像机包含一个后门&#xff0c;允许未经身份验证的模拟任何配置的用户帐户。 0x02 漏洞复现&#xff1a; 利用工具发现漏洞&#xff08;CVE-2017-7921&#xff09;&#xff1a; 利用路径&#xff…