?? ad.h.bak
字號:
//******************************************************************************
//函數(shù): void ad_init(void);
//描述: 初始化AD轉(zhuǎn)換器作為單一轉(zhuǎn)換
//參數(shù): none
//返回值: none
//*******************************************************************************
#define prewarm_ad_en PTE_PTE2
#define water_ad_en PTE_PTE3
#define sump_ad_en PTE_PTE4
//********AD轉(zhuǎn)換參考值定義********************
//unsigned char tab_sump[7] = {0x0c,0x31,0x4a,0x5d,0x6d,0x79,0x8b}; //機油壓力刻度采樣值
unsigned char tab_sump[4] = {0x18,0x57,0x79,0x92}; //機油壓力刻度采樣值
unsigned char tab_water[5] = {0xe3,0x9f,0x7d,0x57,0x3a}; //水溫刻度采樣值
unsigned char tab_warm_up[3]= {0xe2,0x7d,0x39}; //預(yù)熱溫度采樣值
unsigned char ad_count=0;
//轉(zhuǎn)至signal_group.h定義
//COUN Flag; //標(biāo)志位
//#define AD_warm_up Flag.Bit.BIT3 //預(yù)熱溫度AD采樣標(biāo)志
//#define AD_water Flag.Bit.BIT4 //水溫AD采樣標(biāo)志
//#define AD_sump Flag.Bit.BIT5 //機油壓力AD采樣標(biāo)志
//******************************************************************************
//函數(shù): void ad_init(void);
//描述: 初始化AD轉(zhuǎn)換器作為單一轉(zhuǎn)換
//參數(shù): none
//返回值: none
//*******************************************************************************
void AD_init(void)
{
prewarm_ad_en=0;
water_ad_en=1;
sump_ad_en=1;
ADSCR=0x1f;
//ADCH0=1
//ADCH1=1
//ADCH2=1
//ADCH3=1
//ADCH4=1 此時AD電源關(guān)閉,AD通道選擇
//ADCO=0 單次轉(zhuǎn)換
//AIEN=0 禁止中斷
//COCO=0 1轉(zhuǎn)換結(jié)束,0忙
ADCLK=0x10;
//0~1為NC
//MODE0=0
//MODE1=0 轉(zhuǎn)換結(jié)果為無符號8位
//ADICLK=1 0晶振、1總線
//ADIV0=1
//ADIV1=1
//ADIV2=0 //27.669ms
}
//*******************************************************************************
//函數(shù): unsigned char ad_single(unsigned char ch);
//參數(shù): unsigned char ch---選擇A/D 通道;
//返回值: A/D 轉(zhuǎn)換值
//說明: channel為AD通道取值0-7
//*******************************************************************************
unsigned char ad_single(unsigned char channel)
{
unsigned char i = 0;
unsigned int ad_sum = 0;
unsigned char ad_max = 0;
unsigned char ad_min = 0xff;
unsigned char ad_temp = 0;
unsigned char ad[8];
ADSCR=0X20+channel; //寫ADSCR啟動連續(xù)AD轉(zhuǎn)換
while(i<8) //8次采樣
{
if(ADSCR_COCO==1)
{
ad[i] = ADRL; //取AD寄存器,8位AD量
i++;
}
}
ADSCR=0X1F; //寫ADSCR關(guān)閉AD轉(zhuǎn)換
for(i=0;i<8;i++)
{
if(ad[i]>ad_max) ad_max=ad[i]; //取得最大值
if(ad[i]<ad_min) ad_min=ad[i]; //取得最小值
ad_sum+=ad[i]; //求和
}
ad_sum=ad_sum-ad_max; //去掉最大值
ad_sum=ad_sum-ad_min; //去掉最小值
ad_temp=ad_sum%6; //求余數(shù)
ad_sum=ad_sum/6; //求平均
if(ad_temp>3) //判斷余數(shù),4舍5入
{
ad_sum++;
}
ad_temp=ad_sum%0x100; //確定最后結(jié)果
return ad_temp; //返回結(jié)果
}
//*******************************************************************************
//函數(shù): void ad_warm_u(void);
//返回值: A/D 轉(zhuǎn)換值對應(yīng)的CAN報文值(預(yù)熱溫度)
//*******************************************************************************
void ad_warm_up(void)
{
unsigned char i = 0;
unsigned char _warm_up;
unsigned int temp;
_warm_up=ad_single(3); //預(yù)熱AD3,采樣
if(_warm_up>0xe1) _warm_up = 40; // <40℃?
else if(_warm_up<0x3a)_warm_up = 120; // >120℃?
else // 40℃-120℃?
{
while(tab_warm_up[i]>_warm_up) i++;//確定上限
_warm_up = tab_warm_up[i-1]-_warm_up;
temp = _warm_up*40;
_warm_up = tab_warm_up[i-1]-tab_warm_up[i];
temp/=_warm_up;
temp+=40*i; //預(yù)熱溫度
_warm_up=temp%0x100;
}
CAN_data3.Byte=_warm_up; //返回值
}
//*******************************************************************************
//函數(shù): void ad_water(void);
//返回值: A/D 轉(zhuǎn)換值對應(yīng)的CAN報文值(水溫)
//*******************************************************************************
void ad_water(void)
{
unsigned char i = 0;
unsigned char _water;
unsigned int temp;
_water=ad_single(6);
if(_water>0xe3) _water = 40;
else if(_water<0x3b)_water = 120;
else
{
while(tab_water[i]>_water) i++;
_water = tab_water[i-1]-_water;
temp = _water*20;
_water = tab_water[i-1]-tab_water[i];
temp = temp/_water;
i--;
temp = temp+20*i+40;
_water=temp%0x100;
}
CAN_data1.Byte=_water;
}
//*******************************************************************************
//函數(shù): void ad_sump(void);
//返回值: A/D 轉(zhuǎn)換值對應(yīng)的CAN報文值(機油壓力)
//*******************************************************************************
void ad_sump(void)
{
unsigned char i = 0;
unsigned char _sump;
unsigned int temp;
_sump=ad_single(7);
// if(_sump<0x19) _sump = 0x00;
if(_sump<0x2c) _sump=0x00; //<0.5kg
else if(_sump>0x91) _sump = 0x26;
else
{
while(tab_sump[i]<_sump) i++;
_sump=_sump-tab_sump[i-1];
temp=_sump*200;
_sump=tab_sump[i]-tab_sump[i-1];
temp=temp/_sump;
i--;
temp=(temp+200*i)/16;
_sump=temp%0x100;
}
CAN_data0.Byte=_sump;
}
//*******************************************************************************
//函數(shù): void AD_sampling(void);
//說明: A/D 轉(zhuǎn)換過程,每次循環(huán)只執(zhí)行一路AD
//*******************************************************************************
void AD_sampling(void)
{
ad_count++; //AD計數(shù)器
if(ad_count==5) //5循環(huán)執(zhí)行一次
{
ad_count=0;
if(AD_warm_up==1) //預(yù)熱溫度
{
ad_warm_up();
prewarm_ad_en=1;
AD_warm_up=0;
AD_sump=0;
sump_ad_en=1;
AD_water=1;
water_ad_en=0;
}
else if(AD_water==1) //水溫
{
ad_water();
water_ad_en=1;
prewarm_ad_en=1;
sump_ad_en=0;
AD_warm_up=0;
AD_water=0;
AD_sump=1;
}
else if(AD_sump==1) //機油壓力
{
ad_sump();
AD_sump=0;
sump_ad_en=1;
AD_warm_up=1;
prewarm_ad_en=1;
AD_water=0;
water_ad_en=1;
}
else
{
prewarm_ad_en=0;
water_ad_en=1;
sump_ad_en=1;
AD_warm_up=1;
AD_water=0;
AD_sump=0;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -