STM32学习心得二十四:内部温度传感器原理及实验

记录一下,方便以后翻阅~
主要内容:
1) STM32内部温度传感器概述;
2) 相关实验代码解读。
实验功能:系统启动后,实时将内部温度传感器的值传至串口助手上。
官方资料:《STM32中文参考手册V10》第11章——温度传感器
1. 内部温度传感器框图
在这里插入图片描述
2. STM32内部温度传感器概述
2.1 STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA);
2.2 该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值;
2.3 温度传感器模拟输入推荐采样时间是17.1μs(最快);
2.4 STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右。
备注:内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝度温度,应该使用一个外部温度传感器。
3. STM32F10x系列芯片ADC通道和引脚对应关系
在这里插入图片描述
4. 内部温度传感器使用注意事项:
4.1 要使用STM32的内部温度传感器,必须先激活ADC的内部通道,通过ADC_CR2寄存器的TSVREFE位(bit23)设置。设置该位为1则启用内部温度传感器。
在这里插入图片描述
4.2 STM32的内部温度传感器固定的连接在ADC的通道16上,所以,在设置好ADC之后只要读取通道16的值,就是温度传感器返回来的电压值。根据该值,可计算出当前温度,公式如下:
T=[(V25-Vsense)/Avg_Slope]+25
上式中:
V25——Vsense在25度时的数值(典型值为:1.43);
Avg_Slope——温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为4.3Mv/℃);
利用以上公式,可以计算出当前温度传感器的温度。
在这里插入图片描述
5. 开启内部温度传感器步骤:
5.1 选择ADC_IN16输入通道;
5.2 设置采样时间大于17.1us;
5.3 设置ADC_CR2的TSVREFE位,打开内部温度传感器;
5.4 设置ADON位启动转换;
5.5 读取ADC结果;
5.6 计算。
6. 相关实验代码解读
6.1 tsensor.h头文件代码解读

#ifndef __TSENSOR_H
#define __TSENSOR_H 
#include "stm32f10x.h"  
short Get_Temprate(void);                
void Adc_Init(void);                     
u16  Get_Adc(u8 ch);                      
u16  Get_Adc_Average(u8 ch,u8 times);        
#endif 

6.2 tsensor.c文件代码解读

#include "tsensor.h"
#include "delay.h"
#include "sys.h" 
//编写Adc_Init初始化函数//
void Adc_Init(void)  
{
 ADC_InitTypeDef ADC_InitStructure; 
 //使能GPIOA,ADC1通道时钟//
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   
 //设置ADC时钟,对RCC_CFGR时钟配置寄存器的位[14~15] ADCPRE操作//
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);   
 ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值//
 //ADC_InitStructure参数设置//
 //ADC_CR1寄存器,位[19:16]:DUALMODE双模式选择,ADC_Mode_Independent=0x00000000,独立模式//
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
 //ADC_CR1寄存器,位8:SCAN扫描模式,0关闭扫描模式//
 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
 //ADC_CR2寄存器,位1:CONT连续转换,0单次转换模式//
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 
 //ADC_CR2寄存器,位[19:17]:EXTSEL选择启动规则通道组转换的外部事件,ADC_ExternalTrigConv_None=0x000E0000,SWSTART软件控制// 
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 
 //ADC_CR2寄存器,位11:ALIGN数据对齐,ADC_DataAlign_Right=0x00000000,右对齐//
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
 //ADC_SQR1寄存器,位[23:20]:L规则通道序列长度,1指1个转换,即位[23:20]设为0000//
 ADC_InitStructure.ADC_NbrOfChannel = 1; 
 ADC_Init(ADC1, &ADC_InitStructure); 
 //ADC_CR2寄存器,位23:TSVREFE温度传感器和Vrefint使能,启动温度传感器//
 ADC_TempSensorVrefintCmd(ENABLE); 
 ADC_Cmd(ADC1, ENABLE);                          //使能指定的ADC1//
 //下面四个函数用于校准//
 ADC_ResetCalibration(ADC1);                     //重置指定的ADC1的复位寄存器//
 while(ADC_GetResetCalibrationStatus(ADC1));     //获取ADC1重置校准寄存器的状态,设置状态则等待//
 ADC_StartCalibration(ADC1);                     //开启AD校准//
 while(ADC_GetCalibrationStatus(ADC1));          //获取指定ADC1的校准程序,设置状态则等待//
}
//编写Get_Adc函数,获取温度传感器的原始值(二进制转十进制的值)//
u16 Get_Adc(u8 ch)   
 {
  //设置指定ADC的规则组通道,四个入口参数//
 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );         
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);            //使能指定的ADC1的软件转换启动功能//
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));    //等待转换结束,EOC=1时,转换完成,则While停止//
 return ADC_GetConversionValue(ADC1);               //返回最近一次ADC1规则组的转换结果//
 }
//取times次,然后平均,取温度传感器采集的原始值(十进制值)//
u16 Get_Adc_Average(u8 ch,u8 times)
{
 u32 temp_val=0;
 u8 t;
 for(t=0;t<times;t++)
 {
  temp_val+=Get_Adc(ch);
  delay_ms(5);
 }
 return temp_val/times;
}     
short Get_Temprate(void)                     //获取内部温度传感器温度值//
{
 u32 adcx;
 double temperate;
 adcx=Get_Adc_Average(ADC_Channel_16,20);    //读取通道16,20次取平均//
 temperate=(float)adcx*(3.3/4096);           //先转成电压值//
 temperate=(1.43-temperate)/0.0043+25;       //再转换为温度值//   
 return temperate;
}

6.3 main.c文件代码解读

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"  
#include "tsensor.h"
 int main(void)
 {  
 float temp;   
 delay_init();          //延时函数初始化   
 uart_init(115200);     //串口初始化为115200
 LED_Init();            //初始化与LED连接的硬件接口
 Adc_Init();            //ADC初始化        
 while(1)
 {
  temp=Get_Temprate();  //得到温度值// 
  printf("芯片温度:%.1f\n",temp); 
  LED0=!LED0;
  delay_ms(500); 
 } 
}

7. 实验效果
在这里插入图片描述
旧知识点
1)复习如何新建工程模板,可参考STM32学习心得二:新建工程模板
2)复习基于库函数的初始化函数的一般格式,可参考STM32学习心得三:GPIO实验-基于库函数
3)复习寄存器地址,可参考STM32学习心得四:GPIO实验-基于寄存器
4)复习位操作,可参考STM32学习心得五:GPIO实验-基于位操作
5)复习寄存器地址名称映射,可参考STM32学习心得六:相关C语言学习及寄存器地址名称映射解读
6)复习时钟系统框图,可参考STM32学习心得七:STM32时钟系统框图解读及相关函数
7)复习延迟函数,可参考STM32学习心得九:Systick滴答定时器和延时函数解读
8)复习ST-LINK仿真器的参数配置,可参考STM32学习心得十:在Keil MDK软件中配置ST-LINK仿真器
9)复习ST-LINK调试方法,可参考STM32学习心得十一:ST-LINK调试原理+软硬件仿真调试方法
10)复习如何对GPIO进行复用,可参考STM32学习心得十二:端口复用和重映射
11)复习串口通信相关知识,可参考STM32学习心得十四:串口通信相关知识及配置方法
12)复习ADC原理及一般配置步骤,可参考STM32学习心得二十三:ADC转换原理及模数转换实验

  • 9
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先应该介绍STM32F411RET6的内部温度传感器: 首先此温度传感器主要用于测量设备所处环境的周围温度。 当没有使用此温度传感器时,传感器将处于断电模式。 主要的性能: •所支持的温度范围:-40℃到125℃ •测量的精度:±1.5℃ 然后是读取芯片内部温度传感器: ①选择ADC1_IN18作为输入通道。 ②选择一个采样的时间,但必须要大于用户参考手册上所指定的最小采样时间。 ③通过置位ADC_CCR寄存器中的TSVREFE标志位,使得温度传感器从掉电模式唤醒。 ④开始ADC传唤通过置位SWSTART(或者通过外部的触发) ⑤读取ADC数据寄存中的数值 ⑥使用下面的公式来计算温度: Tempereture={(V_SENSE-V25)/Avg_Slope}+25 在这个公式里面: —V25在25℃下的值 —Avg_Slope为给定的温度的斜率 通过查看电气特性手册来获得给定的V25和Avg_Slope的值 注意: 传感器在他能够正确的范围内输出V_SENSE之前,从掉电模式到唤醒有一个起始的时间。同样,ADC的上电也有一个起始的时间,因此为了使这个延时最小化,ADON和TSCREFE标志位可以在同一个时间被置位。 温度传感器的输出电压的改变与温度是呈现出线性关系的。这个线性函数的偏移是依赖于每一个芯片上处理器的不同。 内部温度传感器更加适合与那些用来察觉温度不差异的应用中,而非用于获取绝对的温度值,如果想要获取到精确的温度值,请使用一个外部的温度传感器来代替。 现在是相关的ADC初始化的代码和获取温度代码部分截图: 然后是主函数的读取,并且串口打印出来: 最后是套入用户手册所给出公式计算出的温度的结果: 然后下一步是调试W5500进行网络连接,并把温度数据上传到网络
STM32F407是一款高性能的32位ARM Cortex-M4微控制器,因其强大的处理能力和丰富的外设资源,被广泛应用于嵌入式系统开发中。 在STM32F407中,内部集成了一个温度传感器模块,可以实时测量芯片的温度。用户可以通过编程控制,读取芯片的温度值,并进行相应的处理。 STM32F407内部温度传感器实验.rar是一个文件,其中包含了有关STM32F407内部温度传感器实验代码和设计文档。该实验通过使用STM32F407开发板,连接外部显示屏和温度传感器,实现了读取温度值并在显示屏上显示的功能。 开启温度传感器模块需要进行一系列的配置和初始化工作,具体步骤在实验文档中有详细说明。一般流程包括启用内部温度传感器,配置ADC模块,设置采样周期和精度等。 在实验代码中,用户可以通过读取ADC模块的转换结果,获取温度值的原始数据。根据芯片的温度传感器特性和温度与电压的关系,可以将原始数据转换为实际温度值,并进行相应的处理和显示。 通过这个实验,用户可以了解STM32F407内部温度传感器的使用方法,并且可以根据自己的需求进行二次开发和应用。同时,这也是一个学习STM32F407芯片的ADC模块的好机会。 总之,STM32F407内部温度传感器实验.rar提供了一个完整的实验代码和设计文档,帮助用户了解和使用STM32F407内部温度传感器,为嵌入式系统开发提供了一种方便和可靠的温度测量方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天亮继续睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值