3501|2

109

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第二十三章 内部温度传感器实验 [复制链接]

第二十三章 内部温度传感器实验
        本章我们将向大家介绍STM32的内部温度传感器。在本章中,我们将使用STM32的内部温度传感器来读取温度值,并在TFTLCD模块上显示出来。本章分为如下几个部分:
23.1 STM32 内部温度传感器简介
23.2 硬件设计
23.3 软件设计
23.4 下载验证  

23.1 STM32 内部温度传感器简介
        STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推荐采样时间是17.1μs。 STM32的内部温度传感器支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右。
STM32内部温度传感器的使用很简单,只要设置一下内部ADC,并激活其内部通道就差不多了。关于ADC的设置,我们在第十八章已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的2个地方。
第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2的AWDEN位(bit23)设置。设置该位为1则启用内部温度传感器。
第二个地方,STM32的内部温度传感器固定的连接在ADC的通道16上,所以,我们在设置好ADC之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:
                    T(℃)={(V25-Vsense)/Avg_Slope}+25
上式中:
       V25=Vsense在25度时的数值(典型值为:1.43)。
       Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为4.3Mv/℃)。
利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。
现在,我们就可以总结一下STM32内部温度传感器使用的步骤了,如下:
1)设置ADC,并开启ADC_CR2的AWDEN位。
        关于如何设置ADC,上一节已经介绍了,我们采用与上一节一样的设置,这里我们只要增加使能AWDEN位这一句就可以了。
2)读取通道16的AD值,计算结果。
       在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温度值了。
23.2 硬件设计
       本实验用到的硬件资源有:
1)  指示灯DS0
2)  TFTLCD模块
3)  ADC
4)  内部温度传感器
        前三个之前均有介绍,而内部温度传感器也是在STM32内部,不需要外部设置,我们只需要软件设置就OK了。

23.3 软件设计
        打开上一章的工程,打开adc.c,修改Adc_Init函数代码如下:
void  Adc_Init(void)
{   
       //先初始化IO口
      RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
       GPIOA->CRL&=0XFFFFFF0F;//PA1 anolog输入
       //通道10/11设置                 
       RCC->APB2ENR|=1<<9;    //ADC1时钟使能   
       RCC->APB2RSTR|=1<<9;   //ADC1复位
       RCC->APB2RSTR&=~(1<<9);//复位结束      
       RCC->CFGR&=~(3<<14);   //分频因子清零   
       //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
       //否则将导致ADC准确度下降!
       RCC->CFGR|=2<<14;              
       ADC1->CR1&=0XF0FFFF;        //工作模式清零
       ADC1->CR1|=0<<16;      //独立工作模式  
       ADC1->CR1&=~(1<<8);   //非扫描模式   
       ADC1->CR2&=~(1<<1);   //单次转换模式
       ADC1->CR2&=~(7<<17);      
       ADC1->CR2|=7<<17;         //软件控制转换  
       ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!!   必须使用一个事件来触发
       ADC1->CR2&=~(1<<11);    //右对齐  
ADC1->CR2|=1<<23;      //使能温度传感器
ADC1->SQR1&=~(0XF<<20);
       ADC1->SQR1|=0<<20;   //1个转换在规则序列中 也就是只转换规则序列1                  //设置通道1的采样时间
       ADC1->SMPR2&=~(7<<3); //通道1采样时间清空   
      ADC1->SMPR2|=7<<3;     //通道1  239.5周期,提高采样时间可以提高精确度              ADC1->SMPR1&=~(7<<18);//清除通道16原来的设置   
       ADC1->SMPR1|=7<<18;   //通道16  239.5周期,提高采样时间可以提高精确度             ADC1->CR2|=1<<0;               //开启AD转换器  
       ADC1->CR2|=1<<3;       //使能复位校准  
       while(ADC1->CR2&1<<3);        //等待校准结束                  
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。                   ADC1->CR2|=1<<2;       //开启AD校准         
       while(ADC1->CR2&1<<2);        //等待校准结束
       //该位由软件设置以开始校准,并在校准结束时由硬件清除  
}                          
这部分代码与上一章的Adc_Init代码几乎一摸一样,我们仅仅在里面增加了如下三句代码:
ADC1->CR2|=1<<23;                 //使能温度传感器
ADC1->SMPR1&=~(7<<18);      //清除通道16原来的设置      
ADC1->SMPR1|=7<<18;             //通道16  239.5周期,提高采样时间可以提高精确度   
其中第一句是使能内部温度传感器,剩下的两句就是设置通道16,也就是温度传感器通道的采样时间。然后,我们保存一下该文件,接着打开adc.h,修改文件如下:
#ifndef __ADC_H
#define __ADC_H  
#define ADC_CH1              1           //通道1                  
#define ADC_CH_TEMP     16          //温度传感器通道
void Adc_Init(void);                          //ADC通道初始化
u16  Get_Adc(u8 ch);                        //获得某个通道值         
#endif
这里我们也只增加了一句,就是宏定义多增加了一个温度传感器通道TEMP_CH。接下来我们就可以开始读取温度传感器的电压了。在test.c文件里面我们修改main函数如下:
int main(void)
{     
       u16 adcx;
       float temp;
      float temperate;      
      Stm32_Clock_Init(9);    //系统时钟设置
       uart_init(72,9600);      //串口初始化为9600
       delay_init(72);                  //延时初始化
       LED_Init();                 //初始化与LED连接的硬件接口
      LCD_Init();                  //初始化LCD
       usmart_dev.init(72);      //初始化USMART                           
      Adc_Init();                  //ADC初始化   
       POINT_COLOR=RED;  //设置字体为红色
       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   
       LCD_ShowString(60,70,200,16,16,"ADC TEST");     
       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
       LCD_ShowString(60,110,200,16,16,"2012/9/7");      
       //显示提示信息                                                                                 
       POINT_COLOR=BLUE;//设置字体为蓝色
       LCD_ShowString(60,130,200,16,16,"TEMP_VAL:");      
       LCD_ShowString(60,150,200,16,16,"TEMP_VOL:0.000V");         
       LCD_ShowString(60,170,200,16,16,"TEMPERATE:00.00C");        
       while(1)
       {
              adcx=Get_Adc_Average(ADC_CH_TEMP,10);
              LCD_ShowxNum(132,130,adcx,4,16,0);//显示ADC的值
              temp=(float)adcx*(3.3/4096);
              temperate=temp;//保存温度传感器的电压值
              adcx=temp;
              LCD_ShowxNum(132,150,adcx,1,16,0);                //显示电压值整数部分
              temp-=(u8)temp;                                                  //减掉整数部分              
              LCD_ShowxNum(148,150,temp*1000,3,16,0X80);    //显示电压小数部分      
              temperate=(1.43-temperate)/0.0043+25;                    //计算出当前温度值     
              LCD_ShowxNum(140,170,(u8)temperate,2,16,0);     //显示温度整数部分
              temperate-=(u8)temperate;      
              LCD_ShowxNum(164,170,temperate*100,2,16,0X80);//显示温度小数部分
              LED0=!LED0;
              delay_ms(250);
       }
}
这里同上一章的主函数也大同小异,上面的代码将温度传感器得到的电压值,换算成温度值。然后,我们在TFTLCD模块上显示出来。
代码设计部分就为大家讲解到这里,下面我们开始下载验证。
23.4 下载验证
        在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图23.4.1所示:


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

《STM32开发指南》第二十三章 内部温度传感器实验.rar (481.42 KB, 下载次数: 32)



[ 本帖最后由 正点原子 于 2013-3-11 22:12 编辑 ]
此帖出自stm32/stm8论坛

最新回复

  详情 回复 发表于 2013-3-12 07:54
点赞 关注
个人签名我的淘宝:http://shop62103354.taobao.com
 

回复
举报

1万

帖子

16

TA的资源

版主

沙发
 

原子直接用寄存器

此帖出自stm32/stm8论坛

点评

my style.呵呵。  详情 回复 发表于 2013-3-12 21:08
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 

回复

109

帖子

0

TA的资源

纯净的硅(初级)

板凳
 

回复 沙发 ddllxxrr 的帖子

my style.呵呵。
此帖出自stm32/stm8论坛
 
个人签名我的淘宝:http://shop62103354.taobao.com
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表