📄 ad_old.h
字号:
#define fuel_ad_en PTE_PTE2
#define air1_ad_en PTE_PTE3
#define air2_ad_en PTE_PTE4
unsigned char tab_fuel[3] = {0x16,0x4d,0x9d};
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 fuel_temp[16],air1_temp[4],air2_temp[4]; //燃油、气压1、气压2缓存
unsigned char fuel_count=0,air1_count=0,air2_count=0; //燃油、气压1、气压2计数器
sys_data_type _AD_FLAGS; //AD标志
#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
//*******************************************************************************
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=0 0晶振、1总线
//ADIV0=0
//ADIV1=1
//ADIV2=0 //1Mhz
}
//*******************************************************************************
//函数: unsigned char ad_filter(unsigned char ad_tab[],unsigned char ad_count)
//参数: unsigned char ad_tab[](需处理的数组),unsigned char ad_count(数组长度)
//返回值: 平均值
//说明: 虑除1/4最大值、1/4最小值,取剩余1/2数据平均值
//*******************************************************************************
unsigned char ad_filter(unsigned char ad_tab[],unsigned char ad_count)
{
unsigned char filter_count;
unsigned char filter_break;
unsigned char filter_temp;
unsigned int filter_sum=0;
filter_break=ad_count+1; //循环次数计数器赋值
ad_count--; //数组指针-1
ad_flag=1; //置位排序交换标志
while(ad_flag) //有数据交换,需继续排序
{
ad_flag=0; //清除排序交换标志
filter_break--; //循环计数器-1
if(filter_break==0) //循环计数器为0,排序错误
{
ad_flag=0; //标志清0,表示返回值异常
return 0; //返回0
}
for(filter_count=0;filter_count<ad_count;filter_count++)//排序,由大到小
{
if(ad_tab[filter_count]<ad_tab[filter_count+1]) //前一个数小于后一个数,需交换数据
{
ad_flag=1; //置位交换标志
filter_temp=ad_tab[filter_count]; //数据交换
ad_tab[filter_count]=ad_tab[filter_count+1];
ad_tab[filter_count+1]=filter_temp;
}
}
}
ad_count++; //恢复数组指针
ad_count=(unsigned char)(ad_count/4); //定位求平均区域下限
filter_count=(unsigned char)(ad_count*3); //定位求平均区域上限
while(filter_count>ad_count) //求和
{
filter_count--;
filter_sum+=ad_tab[filter_count];
}
ad_count=(unsigned char)(ad_count*2); //求和区域长度
filter_sum=filter_sum/ad_count; //求平均
ad_flag=1; //返回值正常标志
return (unsigned char)filter_sum; //返回值
}
//*******************************************************************************
//函数: 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 ad_count=0;
unsigned char ad[8];
/*switch(channel)
{
case 3: air2_ad_en=0;
break;
case 5: air1_ad_en=0;
break;
case 6: fuel_ad_en=0;
break;
default:break;
} */
ADSCR=0x20+channel; //写ADSCR启动连续AD转换
while(ad_count<8) //8次采样
{
if(ADSCR_COCO==1)
{
ad[ad_count]=ADRL; //取AD寄存器,8位AD量
ad_count++;
}
}
ADSCR=0x1f; //写ADSCR关闭AD转换
/*switch(channel)
{
case 3: air2_ad_en=1;
break;
case 5: air1_ad_en=1;
break;
case 6: fuel_ad_en=1;
break;
default:break;
} */
return ad_filter(ad,8); //返回结果
}
//*******************************************************************************
//函数: 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(ad_flag) //返回值正常
{
/*ad_flag=0; //清除数据异常标志
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;
}
fuel_temp[fuel_count]=_fuel; //暂存
fuel_count++; //燃油计数器+1
if(fuel_count==16) //滤波
{
fuel_count=0; //燃油计数器清0
_fuel=ad_filter(fuel_temp,16); //滤波
if(ad_flag) */
CAN_CMD6.Byte=_fuel; //数据正常编写CAN报文
ad_flag=0; //清除数据异常标志
//}
}
}
//*******************************************************************************
//函数: 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(ad_flag) //返回值正常
{
/*ad_flag=0; //清除数据异常标志
if(_air1<0x10) _air1 = 0x00; //采样值<0x0d结果为0x00
else if(_air1>0x8c) _air1 = 0x3f; //采样值>0x8c结果为0x3f
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报文值
}
air1_temp[air1_count]=_air1; //暂存
air1_count++; //气压1计数器+1
if(air1_count==4) //滤波
{
air1_count=0; //气压1计数器清0
_air1=ad_filter(air1_temp,4); //滤波
if(ad_flag)*/
CAN_CMD4.Byte=_air1; //数据正常编写CAN报文
ad_flag=0; //清除数据异常标志
//}
}
}
//*******************************************************************************
//函数: 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通道3
if(ad_flag)
{
/*if(_air2<0x10) _air2 = 0x00; //采样值<0x0d结果为0x00
else if(_air2>0x8c) _air2 = 0x3f; //采样值>0x8c结果为0x3f
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报文值
}
air2_temp[air2_count]=_air2; //暂存
air2_count++; //气压1计数器+1
if(air2_count==4) //滤波
{
air2_count=0; //气压1计数器清0
_air2=ad_filter(air2_temp,4); //滤波
if(ad_flag)*/
CAN_CMD5.Byte=_air2; //数据正常编写CAN报文
ad_flag=0; //清除数据异常标志
//}
}
}
//*******************************************************************************
//函数: 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;
air1_ad_en=0;
air2_ad_en=1;
fuel_flag=0;
air1_flag=1;
air2_flag=0;
}
else if(air1_flag) //气压1
{
ad_air1();
fuel_ad_en=1;
air1_ad_en=1;
air2_ad_en=0;
air1_flag=0;
air2_flag=1;
fuel_flag=0;
}
else if(air2_flag) //气压2
{
ad_air2();
fuel_ad_en=0;
air1_ad_en=1;
air2_ad_en=1;
air2_flag=0;
fuel_flag=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=1;
air2_ad_en=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -