原创 STM32内置的温度传感器应用

2008-11-30 13:03 7415 11 8 分类: MCU/ 嵌入式

在看STM32的AD部分时,发现内置了温度采集功能,


拿来用用,监测下芯片温度蛮不错的。


根据用户手册,需要通过ADC1的第16通道来采集,然后根据计算公式换算成温度,软件实现分三步:


1) 初始化设置:


void ADC_HardInit(void)
{
    ADC_InitTypeDef ADC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);    
     /* ADC1 configuration ------------------------------------------------------*/   


     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);


    /* ADC1 regular channel14 configuration */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
 
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);


    /* Enable ADC1 reset calibaration register */  
    ADC_ResetCalibration(ADC1);
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GetResetCalibrationStatus(ADC1));


    /* Start ADC1 calibaration */
    ADC_StartCalibration(ADC1);
    /* Check the end of ADC1 calibration */
    while(ADC_GetCalibrationStatus(ADC1));
}


2) AD采集函数:


u8 ADC_GetChannel(u8 channel, u16* value)
{
    switch (channel)
    {
    case 0x16:
        channel = ADC_Channel_16;
        ADC_TempSensorVrefintCmd(ENABLE);
        break;
    case 0x17:
        channel = ADC_Channel_17;
        break;
    default:
        channel = ADC_Channel_16;
        break;
    }
    /* ADC1 regular channel14 configuration */
    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);


    ADC_Delay(2);
    *value = ADC_GetConversionValue(ADC1);
    if(channel == 0x16)
    {
            ADC_TempSensorVrefintCmd(DISABLE);
    }
    return 0;
}


3) 温度还原计算:


          u16 value;
           CPU_FP32 voltage;
           if(!ADC_GetChannel(0x16, &value))
           {
            /*Supported Temperature Range: –40 to 125 degrees
              Precision: ± 1.5 °C */
            /*Temperature (in °C) = {(V25 - VSENSE) / Avg_Slope} + 25.
                    Avg_Slope = 4.3 mV/°C
                    V25 = 1.43 V-------注:这里应用的全为典型值,在datasheet上可以查取。
            */
               voltage = value*3.3/0x1000;
               Shell_OutTXT("voltage = %.2f V\n",voltage);
               voltage = 25 + ((1.43 - voltage)/0.0043);
               Shell_OutTXT("STM32 tempsensor = %.2f °C\n",voltage);
           }
           else
           {
               Shell_OutTXT("tempsensor Fail. \n");
           }


我测出来的结果为31度左右,(办公室环境)

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2013-8-1 14:36

CPU_FP32 voltage; CPU_FP32这个是什么类型?

用户156476 2008-12-24 23:06

cool
相关推荐阅读
walnutcy_696810119 2012-11-21 08:37
Linux下使用smartCOM调试串口
在Windows下的串口调试一直使用sscom,在Linux下只找到一个cutecom,用了几次,很不喜欢,就着手开发了一款自己的串口调试工具,smartCOM。 smartCOM介绍:http...
walnutcy_696810119 2012-03-29 18:12
【博客大赛】原创--测量基础:什么是测量
写在正文之前: 适逢EDNChina搞活动,而我本人也算在测量业工作,就一起作下笔记吧。若有错误,请大家一起斧正。笔者写本文一方面是梳理知识,另一方面也希望与大家探讨有关测量的知识、应用等,希...
walnutcy_696810119 2011-12-20 18:29
GLONASS 15年来,首次实现24颗星在轨可用
  EDN的博客改版后,不太好用,在SINA重开一个,不过重点改为关注GNSS行业新闻 http://blog.sina.com.cn/s/blog_7420cd1701012en9....
walnutcy_696810119 2011-12-20 17:49
逆向工程第一步:通信协议分析
工程中常有这样的事,想分析下其他知名公司产品中的通信协议,以便生产设计兼容产品。 1) 逆向工程,首先要了解产品,知己知彼,百战不怠;     去年受命想仿一款GARMIN的导航盒,但无法...
walnutcy_696810119 2011-11-14 11:30
通用代码调试方法 (Keil, VCC)
调试代码一般需要定位问题,这里给出一个解决方案, 一般的编译器均支持这些宏指令。   #define DEBUG_WALT_1113     1 extern void log_t...
EE直播间
更多
我要评论
2
11
关闭 站长推荐上一条 /3 下一条