⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_old.h

📁 客车车身控制模块 分为仪表部分 前控左 前控右 尾控和中控程序模块
💻 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 + -