|
本帖最后由 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;
} |
|