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

📄 ad.h.bak

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