📄 ad.h
字号:
#define fuel_ad_en PTE_PTE2
#define air1_ad_en PTE_PTE3
#define air2_ad_en PTE_PTE4
sys_data_type _AD_FLAGS;
#define fuel_flag _AD_FLAGS.Bit.BIT0 //燃油标志
#define air1_flag _AD_FLAGS.Bit.BIT1 //气压1标志
#define air2_flag _AD_FLAGS.Bit.BIT2 //气压2标志
#define ad_flag _AD_FLAGS.Bit.BIT3 //AD滤波标志
#define sampling_flag _AD_FLAGS.Bit.BIT4 //AD采样标志
//******************************************************************************
//函数: void ad_init(void);
//描述: 初始化AD转换器作为单一转换
//参数: none
//返回值: none
//*******************************************************************************
unsigned char tab_fuel[3] = {0x16,0x4d,0x9d};
//unsigned char tab_air1[11]= {0x0c,0x22,0x36,0x40,0x4a,0x54,0x5c,0x66,0x6b,0x72,0x76};//,0x7b,0x80,0x83,0x86,0x89,0x8c};
//unsigned char tab_air2[11]= {0x0c,0x22,0x36,0x40,0x4a,0x54,0x5c,0x66,0x6b,0x72,0x76};//,0x7b,0x80,0x83,0x86,0x89,0x8c};
//unsigned char tab_air1[11]={0x0f,0x25,0x3a,0x4d,0x52,0x5e,0x6e,0x72,0x80,0x87,0x8d};
//unsigned char tab_air2[11]={0x0f,0x25,0x3a,0x4d,0x52,0x5e,0x6e,0x72,0x80,0x87,0x8d};
unsigned char tab_air1[16]={0x14,0x35,0x4f,0x64,0x74,0x82,0x8d,0x96,0x9e,0xa5,0xaa,0xae,0xb3,0xb7,0xbb,0xbe};
unsigned char tab_air2[16]={0x14,0x35,0x4f,0x64,0x74,0x82,0x8d,0x96,0x9e,0xa5,0xaa,0xae,0xb3,0xb7,0xbb,0xbe};
void Init_AD(void)
{
fuel_ad_en=0;
air1_ad_en=1;
air2_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=0x40;
//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_fuel(void);
//返回值: A/D 转换值对应的CAN报文值(染油)
//*******************************************************************************
void ad_fuel(void)
{
unsigned char i = 0;
unsigned char _fuel;
unsigned int temp;
_fuel=ad_single(6); //AD采样,AD通道6
if(_fuel<0x17) _fuel = 0x00; //采样值<0x17结果为0x00
else if(_fuel>0x9d) _fuel = 0xff; //采样值>0x9d结果为0xff
else
{
while(tab_fuel[i]<_fuel) i++; //取得上限刻度
_fuel = _fuel-tab_fuel[i-1];
temp = _fuel*127;
_fuel = tab_fuel[i]-tab_fuel[i-1]; //取得下限刻度
temp/=_fuel;
i--;
temp+=127*i;
_fuel=temp%0x100; //最终结果CAN报文值
}
_fuel=255-_fuel;
CAN_CMD6.Byte=_fuel; //返回结果
}
//*******************************************************************************
//函数: void ad_air1(void);
//返回值: A/D 转换值对应的CAN报文值(气压1)
//*******************************************************************************
void ad_air1(void)
{
unsigned char i = 0;
unsigned char _air1;
unsigned int temp;
_air1=ad_single(5); //AD采样,AD通道5
if(_air1<0x15) _air1 = 0x00; //采样值<0x15结果为0x00
else if(_air1>0xbe) _air1 = 0x5d; //采样值>0xbe结果为0x5d(即93*16Kpa=1500Kpa)
else
{
while(tab_air1[i]<_air1) i++; //取得上限刻度
_air1 = _air1-tab_air1[i-1]; //取得下限刻度
temp = _air1*100;
_air1 = tab_air1[i]-tab_air1[i-1];
temp = temp/_air1;
i--;
temp = temp+100*i;
temp = temp/16;
_air1 = temp%0x100; //最终结果CAN报文值
}
CAN_CMD4.Byte=_air1; //返回结果
}
//*******************************************************************************
//函数: void ad_air2(void);
//返回值: A/D 转换值对应的CAN报文值(气压2)
//*******************************************************************************
void ad_air2(void)
{
unsigned char i = 0;
unsigned char _air2;
unsigned int temp;
_air2=ad_single(3); //AD采样,AD通道5
if(_air2<0x15) _air2 = 0x00; //采样值<0x15结果为0x00
else if(_air2>0xbe) _air2 = 0x5d; //采样值>0xbe结果为0x5d
else
{
while(tab_air2[i]<_air2) i++; //取得上限刻度
_air2 = _air2-tab_air2[i-1]; //取得下限刻度
temp = _air2*100;
_air2 = tab_air2[i]-tab_air2[i-1];
temp = temp/_air2;
i--;
temp = temp+100*i;
temp = temp/16;
_air2 = temp%0x100; //最终结果CAN报文值
}
CAN_CMD5.Byte=_air2; //返回结果
}
//*******************************************************************************
//函数: void AD_sampling(void);
//说明: A/D 转换过程,每次循环只执行一路AD
//*******************************************************************************
void AD_sampling(void)
{
// if(sampling_flag)
{
//sampling_flag=0;
if(fuel_flag) //燃油
{
ad_fuel();
fuel_ad_en=1;
fuel_flag=0;
air1_flag=1;
air1_ad_en=0;
air2_ad_en=1;
air2_flag=0;
}
else if(air1_flag) //气压1
{
ad_air1();
air2_ad_en=0;
fuel_ad_en=1;
air1_flag=0;
air2_flag=1;
fuel_flag=0;
air1_ad_en=1;
}
else if(air2_flag) //气压2
{
ad_air2();
air2_flag=0;
air1_ad_en=1;
air2_flag=0;
fuel_ad_en=0;
fuel_flag=1;
air2_ad_en=1;
air1_flag=0;
}
else //重新开始检测
{
fuel_flag=1;
air1_flag=0;
air2_flag=0;
//fuel_count=0;
//air1_count=0;
//air2_count=0;
fuel_ad_en=0;
air1_ad_en=0;
air2_ad_en=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -