STM32系列第19篇--内部温度传感器

发布者:chenxiaohong68最新更新时间:2017-09-22 来源: eefocus关键字:STM32系列  内部温度传感器 手机看文章 扫描二维码
随时随地手机看文章

简介:

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

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

  2. 温度传感器模拟输入推荐采样时间是17.1μs

  3. STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右

  4. 内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝度温度,应该使用一个外部温度传感器,如DS18B20

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

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

温度计算公式:

T(℃)={(V25-Vsense)/Avg_Slope}+25

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

CODE:

//tsensor.c#include "tsensor.h"#include "delay.h"#include "sys.h"//初始化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通道3,第一个转换,采样时间为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
        delay_ms(5);
        }    return temp_val/10;
    }//获取通道ch的转换值//取times次,然后平均u16 T_Get_Adc_Average(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;    for(t=0;t


关键字:STM32系列  内部温度传感器 引用地址:STM32系列第19篇--内部温度传感器

上一篇:STM32系列第20篇--DAC
下一篇:STM32系列第18篇--ADC

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

基于STM32系列的模拟串口(非阻塞式)
STM32单片机一般少则3个串口,多则5个,而我这次的项目还偏偏5个硬件串口还是不够用. 至于不够用的原因,哎,是项目做到后面有定制,随便哪个串口都省不得,没得办法,只能另想法子咯~ 板子上有几个预留IO口,可以用来模拟串口. 模拟串口一般都选9600,速度最快试了也才19200, 所以限制还是较多的,一般不得以情况下才会用到. 在写程序之前我也是参考了前辈们,觉得写的不咋地,照抄他的代码,那我的系统啥事情也 不要干了,就在那里delay吧!!! 模拟串口分收和发:收比较难,发送比较容易,那就先将接收这块吧。 接收: 有2种思路: 一种是第一个下降沿开始启动定时器,每个bit都去采样Rx电平;
[单片机]
基于<font color='red'>STM32</font><font color='red'>系列</font>的模拟串口(非阻塞式)
STM32开发系列之寄存器(一)按键控制LED灯
入门学习STM32开发,首先要选择一种开发方式。STM32的开发方式主要有标准库开发、寄存器开发和HAL库开发(这个我没使用过,不太了解)。比较多的人选择的开发方式是库开发,使用这两种方式比较方便,但因经过函数封装,对底层的理解不足。由于我入门也是由标准库开发入门的,所以这里想专门写一下寄存器开发,边写边学习,欢迎一起探讨。 1、一般写法 注:采用的STM32F103ZET6芯片 ST官方提供了stm32f10x.h的头文件,里面有各个寄存器的地址定义,因此可以直接操作寄存器来对IO口进行配置,下面就以案件控制LED灯为例。 在stm32f10x.h头文件里有以下的IO口的宏定义及结构体 ①假设LED灯接在GPIOB5
[单片机]
<font color='red'>STM32</font>开发<font color='red'>系列</font>之寄存器(一)按键控制LED灯
STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询 HAL_StatusTypeDef HAL_ADC_PollForEve
[单片机]
<font color='red'>STM32</font> HAL库学习<font color='red'>系列</font>第1篇 ADC配置 及 DAC配置
STM32开发笔记52:STM32F4+DP83848以太网通信指南系列(六)
本章为系列指南的第六章,这一章我们暂时离开Keil,离开STM32,离开C语言,这一章我们要去了解一些以太网相关的知识,特别是学习使用大名鼎鼎的调试以太网通信程序的利器:WireShark。 帧结构 我们从小就听说过计算机中全都是二进制的0和1,这个道理几乎连考不上三本的文科生都懂,但是很难有直观的感受,甚至连由16个bit,也就是16个二进制的0/1构成的十六进制0/F,再由两个十六进制的0/F形成的0x00/0xFF这种Byte(字节),都很难直观感受到,毕竟计算机世界太丰富了,各类色彩,图片,网站,视频,游戏充斥着我们的日常,所谓「乱花渐欲迷人眼,浅草才能没马蹄」,形形色色的计算机资源就是「乱花」,其背后单调的Byte才是
[单片机]
<font color='red'>STM32</font>开发笔记52:STM32F4+DP83848以太网通信指南<font color='red'>系列</font>(六)
STM32 HAL库学习系列第10篇---串口空闲中断接收不定长数据
串口重定向配置: 可以直接复制使用 /************************************************* * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; } /** * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 *
[单片机]
STM32 HAL库学习系列第3篇 常使用的几种延时方式
1 自带的hal_delay 函数 毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); //获取tick值(毫秒) uint32_t wait = Delay; /* Add a period to guarantee minimum wait */ if (wait HAL_MAX_DELAY) { wait++;//传参,延时的时间 } while((HAL_GetTick() - tickstart) wait) { } } 也可以配置为us延时,改变函数参数 配置方法:
[单片机]
STM32系列可以通过FMSC接口来实现外扩并口SRAM
STM32MCU一般情况下配置有1~2MB双块Flash存储器和256KB SRAM,在某些应用设计中会出现内置RAM不足的情况,需要对STM32单片机进行外扩RAM的处理,可以选择更换更高RAM容量的单片机,除了价格贵还需要涉及其他被动器件的更改,STM32系列可以通过FMSC接口外扩并口SRAM,比如采用ISSI的IS62WV51216。 IS62WV51216 SRAM芯片是一个8M容量,组织结构为512K*16的高速率低功耗静态随机存储器。IS62WV51216高性能CMOS工艺制造。高度可靠的工艺水准再加创新的电路设计技术,造就了这款高性能,低功耗的器件。使用IS62WV51216的片选引脚和输出使能引脚,可以简单实
[单片机]
STM32系列第21篇--DMA
简介: DMA全称DirectMemory Access,即直接存储器访问。 比如串口发送用和不用DMA当然都可以发送。不用DMA发送是需要单片机实时参与,由单片机一个一个地发送数据并进行监控。但是如果用DMA,设置了起始地址,数据大小等参数后,就直接由专门的一个DMA模块进行数据发送,发送过程中单片机无需参与。发送完后会产生中断告知单片机。由此可知用DMA可以节省单片机资源,让单片可以在同一时间里干更多事。 STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道(通道1~通道7)。DMA2有5个通道(通道1~通道5)。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个
[单片机]
<font color='red'>STM32</font><font color='red'>系列</font>第21篇--DMA
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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