打印
[STM32F4]

【正点原子探索者STM32F407开发板】第24章 内部温度传感器实

[复制链接]
3464|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyang86|  楼主 | 2014-12-19 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第二十四章 内部温度传感器实验
实验19 内部温度传感器实验.zip (527.68 KB)


第二十四章 内部温度传感器实验-STM32F4开发指南-正点原子探索者STM32开发板.pdf.pdf (470.93 KB)

1.硬件平台:正点原子探索者STM32F407开发板2.软件平台:MDK5.13.固件库版本:V1.4.0

      
本章我们将向大家介绍STM32F4的内部温度传感器。在本章中,我们将使用STM32F4的内部温度传感器来读取温度值,并在TFTLCD模块上显示出来。本章分为如下几个部分:
24.1 STM32F4 内部温度传感器简介
24.2 硬件设计
24.3 软件设计
24.4 下载验证

24.1 STM32F4 内部温度传感器简介
STM32F4有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。该温度传感器在内部和ADC1_IN16(STM32F40xx/F41xx系列)或ADC1_IN18(STM32F42xx/F43xx系列)输入通道相连接,此通道把传感器输出的电压转换成数字值。 STM32F4的内部温度传感器支持的温度范围为:-40~125度。精度为±1.5℃左右。
STM32F4内部温度传感器的使用很简单,只要设置一下内部ADC,并激活其内部温度传感器通道就差不多了。关于ADC的设置,我们在上一章已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的2个地方。
第一个地方,我们要使用STM32F4的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CCR的TSVREFE位(bit23)设置。设置该位为1则启用内部温度传感器。
第二个地方,STM32F407ZGT6的内部温度传感器固定的连接在ADC1的通道16上,所以,我们在设置好ADC1之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:
                    T(℃)={(Vsense - V25)/Avg_Slope}+25
上式中:
       V25=Vsense在25度时的数值(典型值为:0.76)。
       Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为2.5mV/℃)。
利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。
现在,我们就可以总结一下STM32F4内部温度传感器使用的步骤了,如下:
1)设置ADC1,开启内部温度传感器。
关于如何设置ADC1,上一章已经介绍了,我们采用与上一章一样的设置,这里我们只要增加使能内部温度传感器这一句就可以了。方法为:
ADC_TempSensorVrefintCmd(ENABLE);//使能内部温度传感器
2)读取通道16的AD值,计算结果。
在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温度值了。具体方法跟上一讲是一样的。
24.2 硬件设计
本实验用到的硬件资源有:
1)  指示灯DS0
2)  TFTLCD模块
3)  ADC
4)  内部温度传感器
前三个之前均有介绍,而内部温度传感器也是在STM32F4内部,不需要外部设置,我们只需要软件设置就OK了。
24.3 软件设计
打开本章实验工程中可以看到,我们并没有增加任何文件,而是在adc.c文件修改和添加了一些函数,adc.c文件中Adc_Init函数内容如下:
void  Adc_Init(void)
{   
  GPIO_InitTypeDef  GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef       ADC_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟

  //先初始化IO口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;// 下拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);      //ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);     //复位结束   

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

  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
  ADC_CommonInitStructure.ADC_TwoSamplingDelay =
ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInitStructure.ADC_DMAAccessMode =
ADC_DMAAccessMode_Disabled; /
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  ADC_CommonInit(&ADC_CommonInitStructure);

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式  
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐      
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中
  ADC_Init(ADC1, &ADC_InitStructure);

ADC_Cmd(ADC1, ENABLE);//开启AD转换器   
}   
这部分代码与上一章的Adc_Init代码几乎一摸一样,我们仅仅在里面增加了如下一句代码:
ADC_TempSensorVrefintCmd(ENABLE);//使能内部温度传感器
这句我们就是使能内部温度传感器。然后在adc.c里面添加了获取温度函数:Get_Temprate,该函数代码如下:
//得到温度值
//返回值:温度值(扩大了100倍,单位:℃.)
short Get_Temprate(void)
{
       u32 adcx;  short result;
      double temperate;
       adcx=Get_Adc_Average(ADC_Channel_16,20);  //读取通道16,20次取平均
       temperate=(float)adcx*(3.3/4096);                     //电压值
       temperate=(temperate-0.76)/0.0025+25;      //转换为温度值
       result=temperate*=100;                              //扩大100倍.
       return result;
}
该函数读取ADC_Channel_16通道(即通道16)采集到的电压值,并根据前面的计算公式,计算出当前温度,然后,返回扩大了100倍的温度值。
adc.h代码比较简单,我们就不多说了。接下来,我们看看main函数如下:
int main(void)
{
       short temp;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
       delay_init(168);     //初始化延时函数
       uart_init(115200);  //初始化串口波特率为115200
       LED_Init();              //初始化LED
      LCD_Init();         //液晶初始化
       Adc_Init();         //内部温度传感器ADC初始化
       POINT_COLOR=RED;
       LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");      
       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,"2014/5/6");        
       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,temp%100,2,16,0);          //显示小数部分

              LED0=!LED0; delay_ms(250);   
       }
}
这里同上一章的主函数也大同小异,这里,我们通过Get_Temprate函数读取温度值,并通过TFTLCD模块显示出来。
代码设计部分就为大家讲解到这里,下面我们开始下载验证。
24.4 下载验证
在代码编译成功之后,我们通过下载代码到ALIENTEK探索者STM32F4开发板上,可以看到LCD显示如图24.4.1所示:

图24.4.1 内部温度传感器实验测试图
伴随DS0的不停闪烁,提示程序在运行。大家可以看看你的温度值与实际是否相符合(因为芯片会发热,而且貌似准确度也不怎么好,所以一般会比实际温度偏高)?


实验详细手册和源码下载地址:http://www.openedv.com/posts/list/41586.htm


正点原子探索者STM32F407开发板购买地址:http://item.taobao.com/item.htm?id=41855882779
  






沙发
mmuuss586| | 2014-12-19 19:05 | 只看该作者

支持下楼主;

使用特权

评论回复
板凳
lindeijun| | 2022-10-1 07:57 | 只看该作者
学习一下,谢谢啦!!

使用特权

评论回复
地板
mattlincoln| | 2022-10-4 15:23 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
5
saservice| | 2022-10-4 15:39 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
6
alvpeg| | 2022-10-4 16:34 | 只看该作者
以后学习就方便了                                 

使用特权

评论回复
7
abotomson| | 2022-10-4 16:42 | 只看该作者
以后学习就方便了                                 

使用特权

评论回复
8
linfelix| | 2022-10-4 17:30 | 只看该作者
以后多交流交流                  

使用特权

评论回复
9
10299823| | 2022-10-5 10:48 | 只看该作者
正准备用 来做产品,刚好用上。         

使用特权

评论回复
10
hellosdc| | 2022-10-5 11:51 | 只看该作者
回复查看一下相关的内容。                                 

使用特权

评论回复
11
iyoum| | 2022-10-5 12:31 | 只看该作者
以后多交流交流                  

使用特权

评论回复
12
xiaoyaozt| | 2022-10-5 13:26 | 只看该作者
正准备用 来做产品,刚好用上。         

使用特权

评论回复
13
sdlls| | 2022-10-5 14:06 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
14
loutin| | 2022-10-5 15:17 | 只看该作者
感觉今后应该用的人很多                                   

使用特权

评论回复
15
jf101| | 2022-10-6 14:08 | 只看该作者
很好,收藏了,例程很好!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:正点原子STM32开发板购买单击这里

80

主题

916

帖子

51

粉丝