51.内部温度传感器实验

发布者:心动代码最新更新时间:2018-10-17 来源: eefocus关键字:内部  温度传感器  STM32 手机看文章 扫描二维码
随时随地手机看文章

一。STM32内部温度传感器概述

     学习这一节之前要对ADC有一个清楚的理解。因为STM32内部温度传感器本质上就是ADC。

(一)内部温度传感器框图

      51.内部温度传感器实验


内部温度传感器连接到ADC1的通道16,在使用之前要去使能相应的控制位TSVREFE,使能了之后内部温度传感器就连接到了通道16.

(二)STM32内部温度传感器概述

51.内部温度传感器实验

由于它在芯片的内部,因此一般都用了测试芯片内部的温度,不同于环境温度,要稍微偏高一些。

51.内部温度传感器实验
温度传感器模拟输入推荐采样时间是17.1us,不能太快。

(三)内部温度传感器使用注意是像。

51.内部温度传感器实验

把CR2的TSVREFE位(bit23)设置为1就启用了温度传感器。

51.内部温度传感器实验
V25是温度传感器在25度时输出的电压数值,典型值为1.43.
输出的电压跟温度的关系基本上是一条直线。我们以一条直线处理。

内部温度传感器温度和电压关系图


51.内部温度传感器实验

知道了这条直线的斜率,同时知道某一个点,那么这根线也就确定了。确定了这根线就可以确定在这根线上任何一点的对应关系。

公式的计算方法:

比如我们知道了斜率是A,同时知道了这个点:在25度的时候电压输出是V25

斜率是一个直角的高度/宽度。

A=(V25-V)/(T-25度)

因此 T=25+(V25-V)/A

(三)开启内部温度传感器的步骤

51.内部温度传感器实验

二。实验程序讲解

tsensor.c

//初始化ADC

//这里我们仅以规则通道为例

//我们默认将开启通道0~3

void T_Adc_Init(void)  //ADC通道初始化

{

ADC_InitTypeDef ADC_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );  //使能GPIOA,ADC1通道时钟

  

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz

  ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值

 

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式

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通道的数目

ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器

 

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //重置指定的ADC1的复位寄存器

    while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待

ADC_StartCalibration(ADC1); //

while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待

}

u16 T_Get_Adc(u8 ch)   

{

 

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道16,第一个转换,采样时间为239.5周期      

 

ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果

}

//得到ADC采样内部温度传感器的值,读出来的是采样的值

//取10次,然后平均

u16 T_Get_Temp(void)

{

u16 temp_val=0;

u8 t;

for(t=0;t<10;t++)

{

temp_val+=T_Get_Adc(ADC_Channel_16);  //TampSensor,获取通道16的ADC值

delay_ms(5);

}

return temp_val/10;

}

//得到温度值

//返回值:温度值(扩大了100倍,单位:℃.),比如温度是10.5度,返回值是1050.

short Get_Temprate(void) //获取内部温度传感器温度值

{

u32 adcx;

short result;

  double temperate;

adcx=T_Get_Adc_Average(ADC_Channel_16,20); //读取通道16,20次取平均

temperate=(float)adcx*(3.3/4096); //电压值 

temperate=(1.43-temperate)/0.0043+25; //转换为温度值 

 

result=temperate*=100; //扩大100倍.

return result;

}

主函数main.c

int main(void)

 {  

short temp; 

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

LED_Init();   //初始化与LED连接的硬件接口

  LCD_Init(); //初始化LCD

  T_Adc_Init();   //ADC初始化

   

POINT_COLOR=RED;//设置字体为红色 

LCD_ShowString(30,50,200,16,16,"WarShip STM32");

LCD_ShowString(30,70,200,16,16,"Temperature TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2015/1/14");  

POINT_COLOR=BLUE;//设置字体为蓝色    

  

LCD_ShowString(30,140,200,16,16,"TEMPERATE: 00.00C"); 

     

while(1)

{

temp=Get_Temprate(); //得到温度值 

if(temp<0)

{

temp=-temp;

LCD_ShowString(30+10*8,140,16,16,16,"-"); //显示负号

}else LCD_ShowString(30+10*8,140,16,16,16," "); //无符号

LCD_ShowxNum(30+11*8,140,temp/100,2,16,0); //显示整数部分

LCD_ShowxNum(30+14*8,140,temp0,2,16, 0X80); //显示小数部分

LED0=!LED0;

delay_ms(250);

}

51.内部温度传感器实验


关键字:内部  温度传感器  STM32 引用地址:51.内部温度传感器实验

上一篇:52. STM32的DAC实验
下一篇:50.待机唤醒实验

推荐阅读最新更新时间:2024-03-16 16:16

STM32 关于外部中断线、中断源和中断服务函数的问题
中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB1...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。 有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示) 如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断 出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断 编码盘 管脚会触发 而 出货光电1管脚
[单片机]
<font color='red'>STM32</font> 关于外部中断线、中断源和中断服务函数的问题
STM32 IAP应用编程几个要点
1关于ISP、ICP、IAP 1.ISP ISP:In System Programing,在系统编程。 比如:使用STC-ISP对STC芯片编程,利用Flash loader对STM32编程等。 支持ISP的芯片一般在芯片内部固化了一段(用ISP升级的)boot程序。 2.ICP In Circuit Programing,在电路编程。 ICSP:In-Circuit Serial Programming,在电路串行编程。如:对EEPROM编程等。 ICP编程方式网上各有说法,从字面含义(在电路)来说,所有处于编程的芯片都需要上电,都处于电路中。不严格来说利用J-Link、ST-Link、e-Link32等工具进行编程
[单片机]
<font color='red'>STM32</font> IAP应用编程几个要点
意法半导体二代STM32微处理器推动智能边缘发展,提高处理性能和工业韧性
新STM32MP2 MPUs搭载64位处理器和边缘 AI加速器 与生俱来的速度、安全性和可靠性 依托STM32生态系统,加快应用开发,安全配置网络 2024年3月12日,中国 -- 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST)发布了新一代的STM32MP2系列工业级微处理器 (MPUs),以推动智能工厂、智能医疗、智能楼宇和智能基础设施等领域未来的发展。 数字化转型席卷全球,它推动企业提高生产效率、改善医疗服务质量,加强楼宇、公用设施和交通网络的安全和能源管理。数字化的核心赋能技术包括云计算、数据分析、人工智能 (AI)和物联网 (IoT)
[单片机]
意法半导体二代<font color='red'>STM32</font>微处理器推动智能边缘发展,提高处理性能和工业韧性
STM32-USB虚拟串口-学习笔记
USB 用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。 USB 接口支持设备的即插即用和热插拔功能 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。目前用的最多的就是 USB1.1 和USB2.0,USB3.0 目前已经开始普及。STM32F103 自带的 USB 符合 USB2.0 规范。 USB驱动软件开发 usb_core(移植过程,代码一般不用修改) usb_core.c usb_croe.c 文件,该文件用于处理 USB2.0 协议。 usb_init.c usb_init.c 文件,该文件里面只有一个函数:USB_Init,用于 USB 控制器的初始化,不过对U
[单片机]
STM32 keil4 extern问题
最近一个项目,在stm32 keil中移植了别人的一些库文件,编译时出现如下错误提示 .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol FLAG_comerr (referred from master.o). .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol adcval (referred from master.o). .OBJW5100_SPI.axf: Error: L6218E: Undefined symbol nzval (referred from master.o). .OBJW5100_SPI.ax
[单片机]
STM32 JNTRST JTDI JTDO引脚用做普通IO方法
STM32默认启动时PB4、PB3、PA15三个引脚不是普通IO,而是JTAG的复用功能,分别为JNTRST、JTDI、JTDO。 当我们试用SWD接口调试仿真时,这三个引脚可以用作普通IO。 具体做法就是禁用JTAG功能。只需使用以下语句即可。 #define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /*! JTAG-DP Disabled and SW-DP Enabled */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /*使能SWD 禁用JTAG*/
[单片机]
STM32 外部(IO)中断EXTI的应用
a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。 b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_Cle
[单片机]
STM32的USB键盘及鼠标例程
STM32的USB键盘及鼠标例程通过网络可以搜到很,但是在同一个设备中集成键盘及鼠标的例程却比较少见(我通过GOOGLE只搜到圈圈的基于51+D12的版本)。以下为我参考圈圈的例程做出来的集成键盘及鼠标的STM32的程序。   程序上除了usb_desc.c及usb_endp.c外,其它部份同单一的键盘鼠标一样。下面着重说一下usb_desc.c及usb_endp.c的不同之处。   单一键盘鼠标跟集成键盘鼠标这区别主要是报告描述符不同。单一键盘鼠标的报告描述符因只有一组报告输入/输出,故没有报告ID,而集成的有两组报告(键盘及鼠标),所以每一组报告都有一个报告ID加以区别。   另外就是在usb_endp.c中对端点的数据
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved