当前位置:网站首页 > 探索 > 第二十四章 内部温度传感器实验-STM32F4开发指南

第二十四章 内部温度传感器实验-STM32F4开发指南

第二十四章 内部温度传感器实验-STM32F4开发指南STM32F4开发指南(库函数ALIENTEK探索者STM32F407开发板教程331第二十四章内部温度传感器实验本章我们将向大家介绍STM32F4的内部温度传感器。在本章中

STM32F4开发指南(库函数ALIENTEK探索者STM32F407开发板教程331第二十四章内部温度传感器实验本章我们将向大家介绍STM32F4的内部温度传感器。在本章中,我们将使用STM32F4的内部温度传感器来读取温度值,并在TFTLCD模块上显示出来。本章分为如下几个部分:24.1STM32F4内部温度传感器简介24.2硬件设计24.3软件设计24.4下载验证24.1STM32F4内部温度传感器简介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的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下: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硬件设计本实验用到的硬件资源有:指示灯DS0STM32F4开发指南(库函数ALIENTEK探索者STM32F407开发板教程332TFTLCD模块内部温度传感器前三个之前均有介绍,而内部温度传感器也是在STM32F4内部,不需要外部设置,我们只需要软件设置就OK24.3软件设计打开本章实验工程中可以看到,我们并没有增加任何文件,而是在adc.c文件修改和添加了一些函数,adc.c文件中Adc_Init函数内容如下:voidAdc_Init(void)GPIO_InitTypeDefGPIO_InitStructure;ADC_CommonInitTypeDefADC_CommonInitStructure;ADC_InitTypeDefADC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能PA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1时钟//先初始化IO口GPIO_InitStructure.GPIO_PinGPIO_Pin_5;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPdGPIO_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_ModeADC_Mode_Independent;//独立模式ADC_CommonInitStructure.ADC_TwoSamplingDelayADC_TwoSamplingDelay_5Cycles;ADC_CommonInitStructure.ADC_DMAAccessModeADC_Prescaler_Div4;ADC_CommonInit(&ADC_CommonInitStructure);ADC_InitStructure.ADC_ResolutionADC_Resolution_12b;//12位模式ADC_InitStructure.ADC_ScanConvModeDISABLE;//非扫描模式ADC_InitStructure.ADC_ContinuousConvModeDISABLE;ADC_InitStructure.ADC_ExternalTrigConvEdgeADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;//右对齐STM32F4开发指南(库函数ALIENTEK探索者STM32F407开发板教程333ADC_InitStructure.ADC_NbrOfConversion个转换在规则序列中ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//开启AD转换器这部分代码与上一章的Adc_Init代码几乎一摸一样,我们仅仅在里面增加了如下一句代码:ADC_TempSensorVrefintCmd(ENABLE);//使能内部温度传感器这句我们就是使能内部温度传感器。

然后在adc.c里面添加了获取温度函数:Get_Temprate,该函数代码如下://得到温度值//返回值:温度值(扩大了100倍,单位:.)shortGet_Temprate(void)u32adcx;shortresult;doubletemperate;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 returnresult; 该函数读取ADC_Channel_16 通道(即通道 16)采集到的电压值,并根据前面的计算 公式,计算出当前温度,然后,返回扩大了100 倍的温度值。 adc.h 代码比较简单,我们就不多说了。接下来,我们看看main 函数如下: int main(void) shorttemp; 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");//固定位置显示小数点 STM32F4 开发指南(库函数 ALIENTEK探索者STM32F407 开发板教程 334 while(1) temp=Get_Temprate();//得到温度值 if(temp0) temp=-temp;LCD_ShowString(30+10*8,140,16,16,16,"-"); //显示负号 elseLCD_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,0); //显示小数部分 LED0=!LED0; delay_ms(250); 这里同上一章的主函数也大同小异,这里,我们通过Get_Temprate 函数读取温度值, 并通过TFTLCD 模块显示出来。 代码设计部分就为大家讲解到这里,下面我们开始下载验证。

上一篇: MasterGo: 在线产品UI原型协作设计工具
下一篇: 海贼王编年史完整版本

为您推荐

发表评论