📄 ad.h.bak
字号:
//******************************************************************************
//函数: void ad_init(void);
//描述: 初始化AD转换器作为单一转换
//参数: none
//返回值: none
//*******************************************************************************
#define prewarm_ad_en PTE_PTE2
#define water_ad_en PTE_PTE3
#define sump_ad_en PTE_PTE4
//********AD转换参考值定义********************
//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}; //预热温度采样值
unsigned char ad_count=0;
//转至signal_group.h定义
//COUN Flag; //标志位
//#define AD_warm_up Flag.Bit.BIT3 //预热温度AD采样标志
//#define AD_water Flag.Bit.BIT4 //水温AD采样标志
//#define AD_sump Flag.Bit.BIT5 //机油压力AD采样标志
//******************************************************************************
//函数: void ad_init(void);
//描述: 初始化AD转换器作为单一转换
//参数: 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电源关闭,AD通道选择
//ADCO=0 单次转换
//AIEN=0 禁止中断
//COCO=0 1转换结束,0忙
ADCLK=0x10;
//0~1为NC
//MODE0=0
//MODE1=0 转换结果为无符号8位
//ADICLK=1 0晶振、1总线
//ADIV0=1
//ADIV1=1
//ADIV2=0 //27.669ms
}
//*******************************************************************************
//函数: unsigned char ad_single(unsigned char ch);
//参数: unsigned char ch---选择A/D 通道;
//返回值: A/D 转换值
//说明: 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启动连续AD转换
while(i<8) //8次采样
{
if(ADSCR_COCO==1)
{
ad[i] = ADRL; //取AD寄存器,8位AD量
i++;
}
}
ADSCR=0X1F; //写ADSCR关闭AD转换
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; //求余数
ad_sum=ad_sum/6; //求平均
if(ad_temp>3) //判断余数,4舍5入
{
ad_sum++;
}
ad_temp=ad_sum%0x100; //确定最后结果
return ad_temp; //返回结果
}
//*******************************************************************************
//函数: void ad_warm_u(void);
//返回值: A/D 转换值对应的CAN报文值(预热温度)
//*******************************************************************************
void ad_warm_up(void)
{
unsigned char i = 0;
unsigned char _warm_up;
unsigned int temp;
_warm_up=ad_single(3); //预热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; //预热温度
_warm_up=temp%0x100;
}
CAN_data3.Byte=_warm_up; //返回值
}
//*******************************************************************************
//函数: void ad_water(void);
//返回值: A/D 转换值对应的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;
}
//*******************************************************************************
//函数: void ad_sump(void);
//返回值: A/D 转换值对应的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;
}
//*******************************************************************************
//函数: void AD_sampling(void);
//说明: A/D 转换过程,每次循环只执行一路AD
//*******************************************************************************
void AD_sampling(void)
{
ad_count++; //AD计数器
if(ad_count==5) //5循环执行一次
{
ad_count=0;
if(AD_warm_up==1) //预热温度
{
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;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -