完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:alientek 阿波罗 STM32F767 开发板
2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子 第二十四章 内部温度传感器实验 本章我们将向大家介绍 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,上一章已经介绍了,我们采用与上一章一样的设置。在 HAL 库 中开启内部温度传感器,只需要将 ADC 通道改为 ADC_CHANNEL_TEMPSENSOR 即可, 调用 HAL_ADC_ConfigChannel()函数配置通道的时候,会自动检测如果是温度传感器通道 会在函数中设置 TSVREFE 位。 2)读取通道 16 的 AD 值,计算结果。 在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式 计算温度值了。具体方法跟上一讲是一样的。 24.2 硬件设计 本实验用到的硬件资源有: 1) 指示灯 DS0 2) TFTLCD 模块 3) ADC 4) 内部温度传感器 前三个之前均有介绍,而内部温度传感器也是在 STM32F4 内部,不需要外部设置,我 们只需要软件设置就 OK 了。 24.3 软件设计 打开本章实验工程中可以看到,我们并没有增加任何文件,而是在 adc.c 文件修改和添 加了一些函数,内容如下: //得到温度值 //返回值:温度值(扩大了 100 倍,单位:℃.) short Get_Temprate(void) { u32 adcx; short result; double temperate; adcx=Get_Adc_Average(ADC_CHANNEL_TEMPSENSOR,10); //读取内部温度传感器通道,10 次取平均 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; HAL_Init(); //初始化 HAL 库 Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz delay_init(168); //初始化延时函数 uart_init(115200); //初始化 USART usmart_dev.init(84); //初始化 USMART LED_Init(); //初始化 LED KEY_Init(); //初始化 KEY LCD_Init(); //初始化 LCD MY_ADC_Init(); //初始化 ADC1 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 的不停闪烁,提示程序在运行。大家可以看看你的温度值与实际是否相符合(因为芯片会发热,而且貌似准确度也不怎么好,所以一般会比实际温度偏高)? |
|
相关推荐
|
|
1107 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1055 浏览 2 评论
2159 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1253 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1678 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:56 , Processed in 0.606826 second(s), Total 66, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号