查看: 6503|回复: 17

[分享] KL02Z 内部温度传感器读出来的温度感觉不对

[复制链接]
  • TA的每日心情
    开心
    2017-4-27 08:44
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    26

    主题

    577

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1703
    最后登录
    1970-1-1
    发表于 2014-6-6 10:23:54 | 显示全部楼层 |阅读模式
     如题,读出来的ADC值为245或246,进计算为24°。相关代码如下:
     
    #define TEMP_CHANNEL    0x1A     //Temp Sensor is selected as input
    #define BG_CHANNEL    0x1B        //Bandgap  is selected as input
    #define AD_DISABLE      0x1F        //Module Disable
     
    #define ADCR_TEMP25     239     // 25℃时ADC值
    #define TempSlope_Cold      56      //低温时的斜率,ADC值大于ADCR_TEMP25
    #define TempSlope_Hot       60      //高温时的斜率,ADC值小于ADCR_TEMP25
     
     
    void InitADC( void )
    {
            SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;  // enable ADC0 clock
     
              /*ADC0_CFG1 = ADC_CFG1_ADIV(1)|
                                      ADC_CFG1_MODE(2)|
                                      ADC_CFG1_ADICLK(3);*/
     
        ADC0_CFG1 = ADC_CFG1_ADIV(0)|       //The divide ratio is 1 and the clock rate is (input clock)/1.
                                    ADC_CFG1_MODE(2)|       //It is single-ended 10-bit conversion.
                                    ADC_CFG1_ADICLK(0)|     //Bus clock
                                    ADC_CFG1_ADLPC_MASK|
                                    ADC_CFG1_ADLSMP_MASK; 
     
        ADC0_SC2 = 0;
     
        ADC0_SC1A = ADC_SC1_AIEN_MASK | ADC_SC1_ADCH(0X1A); 
             
    }
            
    unsigned char TriggerADC(unsigned char Channel)
    {
      
      if(Channel == 0x1B)                                          // Bandgap is selected as input
          PMC_REGSC |= PMC_REGSC_BGBE_MASK;                        // Bandgap buffer enabled
       ADC0_SC1A = Channel;                   // update the channel value
       return 1;
    }
     
    unsigned int ReadADCPoll(void)
    {
        while((ADC0_SC1A & ADC_SC1_COCO_MASK) == 0);
        //ADC0_SC1A &= ~ ADC0_SC1A_COCO_MASK;
        return ADC0_RA;
    }
     
    unsigned int ReadADC_TempChannel(void)
    {
        unsigned int i = 0, adc_value = 0;
     
        for(i=0; i> 4;
     
        TriggerADC(AD_DISABLE);
     
        return adc_value;
    }
     
    int Get_Temperature(void)
    {
        unsigned int adc_temp;
        int value, temp_value;
     
        adc_temp = ReadADC_TempChannel();
        DEBUG_TRACE(MOD_ADC,"adc_temp = %d", adc_temp);
        if (adc_temp >= ADCR_TEMP25)
        {
            value = (adc_temp - ADCR_TEMP25) * 10 / TempSlope_Cold;
            temp_value = (int)(25 - value);
        }
        else
        {
            value = (ADCR_TEMP25 - adc_temp) * 10 / TempSlope_Hot;
            temp_value = (int)(25 + value);
        }
     
        return temp_value;
    }
     
    回复

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-6 11:08:02 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    楼主你bandgap使能没有?
    很多网友读出来不对,都是bandgap没有使能。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1745
    最后登录
    1970-1-1
    发表于 2014-6-6 11:18:32 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    楼主请查看PMC_REGSC[BGBE]这个位是否使能。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-4-27 08:44
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    26

    主题

    577

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1703
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-6 13:29:05 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    回复2、3楼:
    unsigned char TriggerADC(unsigned char Channel)
    {
      
      if(Channel == 0x1B)                                          // Bandgap is selected as input
          PMC_REGSC |= PMC_REGSC_BGBE_MASK;                        // Bandgap buffer enabled
       ADC0_SC1A = Channel;                   // update the channel value
       return 1;
    }
    在选择通道时,如果是Bandgap,则使能PMC_REGSC[BGBE]。
    刚才有试了下载ADC初始化时加上PMC_REGSC |= PMC_REGSC_BGBE_MASK;也还是和原来的一样
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-6 13:58:35 | 显示全部楼层

    回复:KL02Z 内部温度传感器读出来的温度感觉不对

    回复第 4 楼 于2014-06-06 13:29:05发表:
    回复2、3楼:
    unsigned char TriggerADC(unsigned char Channel)
    {

    if(Channel == 0x1B)                                          // Bandgap is selected as input
    PMC_REGSC |= PMC_REGSC_BGBE_MASK;                        // Bandgap buffer enabled
    ADC0_SC1A = Channel;                   // update the channel value
    return 1;
    }
    在选择通道时,如果是Bandgap,则使能PMC_REGSC[BGBE]。
    刚才有试了下载ADC初始化时加上PMC_REGSC |= PMC_REGSC_BGBE_MASK;也还是和原来的一样
     

    看你这个#define TEMP_CHANNEL    0x1A     //Temp Sensor is selected as input
    你设为1A,但你程序里面是1B才使能。
    你直接初始化还不行吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-6 13:59:59 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    你参考下这篇文章的代码结构,
    https://www.nxpic.org.cn/bbs/article_1280_578313.html
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-6 14:02:57 | 显示全部楼层

    回复:KL02Z 内部温度传感器读出来的温度感觉不对

    突然想起来,我之前做过这个代码,是在FRDM_KL02上做的,而且测试时通过的,
    我用的是CW的PE做的,给你参考下:
    KL02_ADC_temp.rar (530.91 KB, 下载次数: 16)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-6 16:00:13 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    楼主请用我的程序试下,如果还有问题,欢迎继续交流。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-4-27 08:44
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    26

    主题

    577

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1703
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-6 17:34:44 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    OK,还没来得及试呢,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1745
    最后登录
    1970-1-1
    发表于 2014-6-9 09:51:59 | 显示全部楼层

    RE:KL02Z 内部温度传感器读出来的温度感觉不对

    楼主你是感觉测试的温度和实际温度偏差太大还是怎么样呢?
    如果是精度方面,那么就没必要去纠结,因为本身bandgap就是有一定的范围。
    所以如果在一两度的差别下,还是能够接受的。
    另外,你需要查看你的VDD是否是3.3V,如果不是偏差比较大的话,你就不能直接用公式Temp=25-((Vtemp-Vtemp25)/m) 去代了,你需要先计算当前VDD下的一些参数,然后再去计算实际的temp就比较准确的。
    具体:
    如果改变VDD值,那么就不能用以上公式直接计算,需要找到对应当前VDD值的Vtemp25以及m的ADC值去替换掉原来的Vtemp25以及m。下面直接给出计算公式:
    (1)   计算当前VDD
    VDD=(ADCRvdd*Vbg)/ADCRgb
    大家知道,内部的bandgap是固定的,通过datasheet可以知道,这个值的范围为0.97到1.03,典型值为1V。
    所以我们利用内部的bandgap值,读取在当前VDD下的ADC值,结合ADC满量程(比如12位为4095),计算出当前VDD的电压值。
    公式中,
    ADCRvdd:VDD对应的ADC满量程值,由你所选定的ADC位数决定,比如12位,就是2的12次方-1。
    Vbg:bandgap值,1V
    ADCRgb:ADC读取bandgap的值,实测。
    实际计算,会将VDD放大10倍计算,即公式变为:
    VDD*10=(ADCRvdd*Vbg)*10/ADCRgb
    VDD*10=VDDconv

    (2)   计算temp25对应的ADC值ADCtemp25
    ADCtemp25=(ADCRvdd*Vtemp25*10)/VDDconv
    公式中,
    ADCRvdd:VDD对应的ADC满量程值,由你所选定的ADC位数决定,比如12位,就是2的12次方-1。
           Vtemp25:25度,VDD=3v时对应的电压,此值由datasheet提供


    (3)   计算温度电压变化率m对应的ADC值ADCR100m
    ADCR100m=(ADCRvdd*m*1000)/ VDDconv
          其中,
           m:温度相对电压的变化率,这个也是由datasheet提供。

    (4)   最终温度公式
    Temp=25-((ADCRt- ADCtemp25)/ ADCR100m)*100
          其中,ADCRt:为实际测试的ADC值。
    其实,楼上板子写了一个关于KL02的内部温度测试的经验分享,具体过程以及代码都很齐全,你可以看看:https://www.nxpic.org.cn/bbs/article_1280_583073.html
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 21:35 , Processed in 0.106350 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表