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

📄 ad.h

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