pipizhu1211 发表于 2014-1-6 09:51:38

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

本帖最后由 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_ti;
        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 )
        {
                temp = 100;
        }
        else if ( gu16ADCTempAvg > RoomTemperature_12bit_TAB )
        {
                temp = 0;
        }
        else
        {
                for ( i = 0;i < 50/*(sizeof(RoomTemperature_12bit_TAB)/sizeof(RoomTemperature_12bit_TAB))*/ ;i++ )
                {
                        buff = RoomTemperature_12bit_TAB;
                               
                        if (gu16ADCTempAvg >= buff)
                        {
                                temp = i*2;// + offset_temp;
                                  
                                if (i != 0 )
                                {
                                        tmp = RoomTemperature_12bit_TAB + RoomTemperature_12bit_TAB;
                                  
                                        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 >= 9 )
                {               
                        gu8RoomTemperature += stSet.General - 9;                                       
                }
                else
                {
                        gu8RoomTemperature -= 9 - stSet.General;
                }
        }
        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;
}

FSL_TICS_TIANZH 发表于 2014-1-6 15:39:20

你的意思是TOD如果关掉,ADC转换出来的值就没有问题了? 我指的不是刚上电的时候. 你可以把TOD的程序注释掉,然后看一下,ADC转换出来的是不是准确的.
页: [1]
查看完整版本: LL16的ADC采样疑惑,BDGP电压不对(已解决)