搜索
bottom↓
回复: 1

LL16的ADC采样疑惑,BDGP电压不对(已解决)

[复制链接]

出0入0汤圆

发表于 2014-1-6 09:51:38 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZJJ 于 2014-1-27 17:29 编辑

ADC查询采样,现象是上电正常,然后TOD定时30S采样就不对了,不知道问题出在哪里,原来的程序修改的



程序代码如下

/**
* \brief    Start a Temperature conversion.
* \author   Rafael Peralez
* \param    void
* \return   void   
*/
void MeasurementStartConversion(void)
{
    static uint8_t TempADC_AverageCounter = _TEMPADC_SAMPLES_COUNT_;
    MeasurementInitADC();
       
    PTBDD_PTBDD6 = 1;        
    PTBD_PTBD6 = 1;
                  
        /* First Conversion is usually noisy and discarded */               
        TempADC_Start_conversion(THERMISTOR_CHAN);
    gu16ADCTempAvg = ADC_Get_Conversion();
    //gu8TempADCChannel = THERMISTOR_CHAN;
    gu16ADCTempAvg = 0;
       
        TempADC_AverageCounter = _TEMPADC_SAMPLES_COUNT_;
        while (TempADC_AverageCounter)
        {
                gu16ADCTempAvg += ADC_Get_Conversion();
                TempADC_AverageCounter--;
        }
        gu16ADCTempAvg /= _TEMPADC_SAMPLES_COUNT_;
        GetTemperature();
       
                          
        /* The first measurement is not accurate*/       
    TempADC_Start_conversion(BANDGAP_CHANNEL);//(BANDGAP_CHANNEL);
    gu16ADCTempAvg = ADC_Get_Conversion();       
    gu16ADCTempAvg = 0;       
       
        while (TempADC_AverageCounter)
        {
               
                gu16ADCTempAvg += ADC_Get_Conversion();
                TempADC_AverageCounter--;
               
        }


        gu16ADCTempAvg /= _TEMPADC_SAMPLES_COUNT_;       
        MeasurementGetVDD();
       
       
       
         
       
        //DISABLE_TEMP_ADC_CHANNEL;
        ADCCFG = 0x00;
        ADCSC2 = 0x00;
        ADCSC1 = 0x00;
        APCTL1 = 0x00;
        PTBDD_PTBDD6 = 1;        
    PTBD_PTBD6 = 0;
       
}
/***********************************************************
*Parameters:
*
*Description:
*
*Returns:
*
***********************************************************/
void MeasurementGetVDD(void)
{
        gu16ADCVDD = (uint16_t)(((uint32_t)(0xFFF) * BANDGAP_VALUE) / gu16ADCTempAvg);

        if ( gu16ADCVDD < BATT_LIFE_INDICATOR )
        {
                gu8LowBatteryFlag = 1;       
        }
        else if ( gu16ADCVDD >= BATT_LIFE_INDICATOR + 10 )
        {
                gu8LowBatteryFlag = 0;       
        }
}



/**
* \brief    State called after having the ADC measurements and average. Used to convert from an ADC value to temperature
* \author   Rafael Peralez
* \param    void
* \return   void
*/
const uint16_t RoomTemperature_12bit_TAB[] =
{
       
        // 100K
        2951        ,//        -9        12 0
        2906        ,//        -8        14 1
        2862        ,//        -7        16 2
        2816        ,//        -6        18 3
        2770        ,//        -5        20 4
        2723        ,//        -4        22 5
        2676        ,//        -3        24 6
        2628        ,//        -2        26 7
        2580        ,//        -1        28 8
        2531        ,//        0        30 9
        2482        ,//        1        32 10
        2433        ,//        2        34 11
        2384        ,//        3        36 12
        2334        ,//        4        38 13
        2285        ,//        5        40 14
        2236        ,//        6        42 15
        2186        ,//        7        44 16
        2137        ,//        8        46 17
        2088        ,//        9        48 18
        2039        ,//        10        50 19
        1991        ,//        11        52 20
        1942        ,//        12        54 21
        1895        ,//        13        56 22
        1847        ,//        14        58 23
        1800        ,//        15        60 24
        1754        ,//        16        62 25
        1708        ,//        17        64 26
        1663        ,//        18        66 27
        1618        ,//        19        68 28
        1574        ,//        20        70 29
        1531        ,//        21        72 30
        1488        ,//        22        74 31
        1447        ,//        23        76 32
        1406        ,//        24        78 33
        1365        ,//        25        80 34
        1326        ,//        26        82 35
        1287        ,//        27        84 36
        1249        ,//        28        86 37
        1213        ,//        29        88 38
        1176        ,//        30        90 39
        1141        ,//        31        92 40
        1106        ,//        32        94 41
        1073        ,//        33        96 42
        1040        ,//        34        98 43
        1008        ,//        35        100 44
         977        ,//        36        102 45
         947        ,//        37        104 46
         917        ,//        38        106 47
         888        ,//        39        108 48
         861        ,//        40        110 49
                    //
                    //
         834        ,//        41        112
         807        ,//        42        114
         782        ,//        43        116
         757        ,//        44        118
         733        ,//        45        120
         709        ,//        46        122
         687        ,//        47        124
         665        ,//        48        126
         644        ,//        49        128
         623        ,//        50        130
                         //
       
};

/***********************************************************
*Parameters:
*
*Description:
*
*Returns:
*
***********************************************************/
uint8_t ADC_ValueToTemperature (void)
{
    uint8_t  i;
        uint16_t buff;
        uint16_t tmp;
        uint8_t temp;

        if ( gu16ADCTempAvg         < 300 )
        {
                temp = 0xFF;
        }
        else if ( gu16ADCTempAvg > 4000 )
        {
                temp = 0xFF;
        }
       
        else if ( gu16ADCTempAvg < RoomTemperature_12bit_TAB[49] )
        {
                temp = 100;
        }
        else if ( gu16ADCTempAvg > RoomTemperature_12bit_TAB[0] )
        {
                temp = 0;
        }
        else
        {
                for ( i = 0;i < 50/*(sizeof(RoomTemperature_12bit_TAB)/sizeof(RoomTemperature_12bit_TAB[0]))*/ ;i++ )
                {
                        buff = RoomTemperature_12bit_TAB;
                               
                        if (gu16ADCTempAvg >= buff)
                        {
                                temp = i*2;// + offset_temp[channel_index];
                                  
                                if (i != 0 )
                                {
                                        tmp = RoomTemperature_12bit_TAB + RoomTemperature_12bit_TAB[i-1];
                                  
                                        tmp >>= 1;
                                          
                                        if (gu16ADCTempAvg < tmp)
                                        {
                                                temp += 1;
                                        }
                                }
                                break;
                        }
                }
        }
    return temp;
}
/**
* \brief    State called after having the ADC measurements and average. Used to convert from an ADC value to temperature
* \author   Rafael Peralez
* \param    void
* \return   void
*/
void GetTemperature(void)
{
        uint8_t ReadTemp;
       
        ReadTemp = ADC_ValueToTemperature();
       
        if (ReadTemp != 0xFF)
        {
                gu8RoomTemperature = ReadTemp;
                gu8RoomTemperature += 10;
               
                if ( stSet.General[TEMPERATURE_ROOM_CALIBRATE] >= 9 )
                {               
                        gu8RoomTemperature += stSet.General[TEMPERATURE_ROOM_CALIBRATE] - 9;                                       
                }
                else
                {
                        gu8RoomTemperature -= 9 - stSet.General[TEMPERATURE_ROOM_CALIBRATE];
                }
        }
        else
        {
                gu8RoomTemperature = 0xFF;
        }
       
       
   
   
    //DISABLE_TEMP_ADC_CHANNEL;
}



/***********************************************************
*Function Name:
*
*Parameters:
*
*Description:
*
*Returns:
*
***********************************************************/
void ADC_Init(void)
{
       
        ADCCFG = 0x15;
        ADCSC2 = 0x00;
        ADCSC1 = 0x3B;
        APCTL1 = 0x08;
        //pADC_Pointer = pADC_BufferPointer;
}
/****************************************************************************************************/
/**
* \brief    Start an ADC conversion in the specified channel
* \author   
* \param    uint8_t Chan
* \return   void
* \todo     
*/
void ADC_Start_conversion(uint8_t chan)
{
        ADCSC2 = 0;
        //ADCSC1 = ADCSC1_AIEN_MASK | chan;
        ADCSC1_ADCH = chan;       
}

/****************************************************************************************************/
/**
* \brief    Wait until the current conversion is finished and return the conversion value
* \author   
* \param    void
* \return   ADCR ADC Result
* \todo     
*/
uint16_t ADC_Get_Conversion(void)
{
        //while(ADCSC2_ADACT)
        while(!ADCSC1_COCO)
        {
            //_Wait;
        }
       
        return ADCR;
}

出0入0汤圆

发表于 2014-1-6 15:39:20 | 显示全部楼层
你的意思是TOD如果关掉,ADC转换出来的值就没有问题了? 我指的不是刚上电的时候. 你可以把TOD的程序注释掉,然后看一下,ADC转换出来的是不是准确的.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 07:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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