?? adc.c
字號:
/**************** (c) 2005 佛山菱電 *****************************************
PROJECT : AUX VRV
COMPILER : AVR GCC/ICC
MODULE : adc.c
VERSION : 1.0.0
DATE : 2006/01/02
AUTHOR : 朱坤
MODIFICATIONS :
DESCRIPTION : ADC routines
******************************************************************************/
#include "adc.h"
#include "main.h"
#define ADVALMAX 0x0E0
#define ADVALMIN 0x10
/* 3470B 采樣值轉換表,溫度加 128 偏移 */
const u8 Temp_Tab[]={98, 99, 100,101,102,103,104,105,106,107,108,109, /* 00-0B*/
109,110,111,112,112,113,114,114,115,116,116,117, /* 0C-17*/
118,118,119,119,120,120,121,122,122,123,123,124, /* 18-23*/
124,125,125,126,126,127,127,128,128,129,129,130, /* 24-2F*/
130,131,131,132,132,133,133,133,134,134,135,135, /* 30-3B*/
136,136,137,137,137,138,138,139,139,139,140,140, /* 3C-47*/
141,141,142,142,142,143,143,144,144,144,145,145, /* 48-53*/
146,146,146,147,147,148,148,149,149,149,150,150, /* 54-5F*/
151,151,151,152,152,153,153,153,154,154,155,155, /* 60-6B*/
155,156,156,157,157,157,158,158,159,159,160,160, /* 6C-77*/
160,161,161,162,162,162,163,163,164,164,165,165, /* 78-83*/
166,166,166,167,167,168,168,169,169,170,170,171, /* 84-8F*/
171,171,172,172,173,173,174,174,175,175,176,176, /* 90-9B*/
177,178,178,179,179,180,180,181,181,182,183,183, /* 9C-A7*/
184,184,185,186,186,187,187,188,189,189,190,191, /* A8-B3*/
192,192,193,194,194,195,196,197,198,198,199,200, /* B4-BF*/
201,202,203,204,205,206,207,208,209,210,211,212, /* C0-CB*/
213,214,216,217,218};/*,219,221,222,223,225,226,227,228};*/
const u8 BitMask[]= {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 AdCntr; /* A/D 采樣計數 */
u8 AdChCnt; /* A/D 通道計數 */
u8 AdvTemp[ADSMPMAX]; /* 采樣值緩存 */
u8 AdFailCnt[ADCHMAX]; /* A/D 監測計時 5S on 20mS */
TempUnion TempVal;
u8 DefstCnt; /* 化霜期間及化霜后3分鐘內不檢測溫度傳感器故障 */
/*-----------------------------------------------------------------------------
ROUTINE Name : ADC_Init
Description:
初始化
Input/Output:
Comments:
可以不要
-----------------------------------------------------------------------------*/
void ADC_Init(void)
{
//AdCntr = AdChCnt=0;
//AdFailCnt[0] = 0;
//AdFailCnt[1] = 0;
//AdFailCnt[2] = 0;
//AdFailCnt[3] = 0;
AmbientTp = 0x96;
TubeInTp = 0x80;
TubeMidTp = 0x80;
TubeOutTp = 0x80;
}
/*-----------------------------------------------------------------------------
ROUTINE Name : ADC_Get
Description:
Input/Output:
Comments:
每20mS 調用一次
-----------------------------------------------------------------------------*/
void ADC_Get(void)
{
u8 i;
u8 j;
ADCSRA = 0x86; /* 8Mhz/64 sampling, ADC on */
i = 50;
while(i--);
ADCH;
/* ADMUX:REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 */
ADMUX = (u8)((0x60)|AdChCnt); /* 選擇通道 */
j = 50;
while(j--);
ADCH;
SetBit(ADCSRA,ADSC);
while (!ValBit(ADCSRA,ADSC)); /* wait till end of conversion */
AdvTemp[AdCntr] = j = (u8)ADCH;
//ClrBit(ADCSRA,ADEN); /* shutdown ADC peripheral */
if (AdCntr++ > 0){ /* 如果兩次采樣值差值超過20,則重行啟動采樣 */
i = (u8)(AdvTemp[AdCntr - 2]);
if ((u8)((i >= j) ? (i - j) : (j - i)) > 20) {
AdCntr = 0;
} else {
i = (u8)(AdCntr - 1);
while ((i > 0) && (j < AdvTemp[i - 1])){ /* 按升序排列 */
AdvTemp[i] = AdvTemp[i - 1];
i--;
AdvTemp[i] = j;
}
/* 采樣五次 */
if (AdCntr >= ADSMPMAX){ /* 同一個通道下一次采樣 */
if ((AdvTemp[2] < 0x04) || ( AdvTemp[2] >= 0x0E9)){
/* 化霜期間及化霜后3分鐘內不檢測溫度傳感器故障 */
if (DefstCnt == 0){
if (AdFailCnt[AdChCnt]++ >= 10){
Errorflg |= (u8)BitMask[AdChCnt];
}
} else{
AdFailCnt[AdChCnt] = 0;
}
} else {
AdFailCnt[AdChCnt] = 0;
Errorflg &= (u8)(~BitMask[AdChCnt]);
TempVal.TArray[AdChCnt] = Temp_Tab[((AdvTemp[2] <= ADVALMIN)? 0 :
((AdvTemp[2] >= ADVALMAX)? ADVALMAX - ADVALMIN : (AdvTemp[2] - ADVALMIN)))];
}
AdCntr = 0;
if (++AdChCnt >= ADCHMAX){
AdChCnt = 0; /* 下一個通道 */
}
}
}
}
}
/*** (c) 2005 佛山菱電 **************************** END OF FILE *************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -