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

📄 main.c

📁 以LPC2194为平台开发的整车ECU控制器程序
💻 C
📖 第 1 页 / 共 5 页
字号:
  
/*****************************************************************************************************
函数原型:void ADC()
参数说明:无
返回值:  无 
功能说明:对IO中的模拟量进行AD转换
******************************************************************************************************/
void ADC(void)
{
   //================P0.29水温信号的AD转换=======================  
    ADCR = (ADCR&0xFFFFFF00)|0x04|(1 << 24);			// 切换通道并进行第一次转换
    while((ADDR&0x80000000)==0);						// 等待转换结束
    ADCR = ADCR | (1 << 24);							// 再次启运转换
    while((ADDR&0x80000000)==0);	
    ADC_data0 = ADDR;
    ADC_data0=(ADC_data0>>6)&0x3FF;
    ADC_data0=ADC_data0*3300;
    ADC_data0=ADC_data0/1024;
   //================P0.30真空压力信号的AD转换=======================            
    ADCR = (ADCR&0xFFFFFF00)|0x08|(1 << 24);			// 切换通道并进行第一次转换
    while((ADDR&0x80000000)==0);						// 等待转换结束
    ADCR = ADCR | (1 << 24);							// 再次启运转换
    while((ADDR&0x80000000)==0);	
    ADC_data1 = ADDR;
    ADC_data1=(ADC_data1>>6)&0x3FF;
    ADC_data1=ADC_data1*3300;
    ADC_data1=ADC_data1/1024;
   
    AD0[0]=AD0[1];AD0[1]=AD0[2];AD0[2]=AD0[3];
    AD0[3]=AD0[4];AD0[4]=AD0[5];AD0[5]=ADC_data0;
    ADC_data0=filter6(AD0); 
    AD1[0]=AD1[1];AD1[1]=AD1[2];AD1[2]=AD1[3];
    AD1[3]=AD1[4];AD1[4]=AD1[5];AD1[5]=ADC_data1;
    ADC_data1=filter6(AD1);  
}

/*******************************************************************************************
**函数原型:void alarm()
**参数说明:无
**返回值:  无
**功能说明:用与判断告警数据
            各种情况是按照协议和ECU通讯与控制策略上的告警数据编写
********************************************************************************************/
void alarm(void)
{
   //限流要求
   infoalarm_1.Bits.lim_current=0 ; 
   //关闭要求
   infoalarm_1.Bits.close=0;
   //冷却水压状态
   if(shuiya_alarm_flag==0)	infoalarm_1.Bits.water_press=0;//正常
   else 	infoalarm_1.Bits.water_press=2;//过低
   /*if(IOstate0&i_ShuiYaKaiGuan) infoalarm_1.Bits.water_press=0;  //冷却水压正常
   else infoalarm_1.Bits.water_press=2; */
   //保留   
   infoalarm_1.Bits.reserve=0;
   //碰撞信号
   if(IOstate0&i_PengZhuang) infoalarm_2.Bits.pengzhuang=0; 
   else infoalarm_2.Bits.pengzhuang=1;
   //湿度过高报警
   infoalarm_2.Bits.shidu=0;
   //车身漏电报警
   infoalarm_2.Bits.loudian=0;
   //水温报警
   if(water_temp>=100) infoalarm_2.Bits.shuiwen=1;//水温过高
   else infoalarm_2.Bits.shuiwen=0;
   //真空压力报警
   if(vacuum_pressure>=77||vacuum_pressure<=20)  infoalarm_3.Bits.vacuum_sta=1;
   else infoalarm_3.Bits.vacuum_sta=0;
   //保留
   infoalarm_3.Bits.reserve1=0;
}

/************************************************************
函数原型:void Logic()
参数说明:无
返回值:  无
功能说明:逻辑判断,控制各个继电器
*************************************************************/
void Logic(void)
{  
  IOstate0 =IO0PIN;
  IOstate1 =IO1PIN;
  
  if(IOstate1&i_YaoShiKaiGuan) { 
                                   IO0SET = o_LengNing|				//冷凝
								            o_LengQueFengJi_Di|		//冷却低档
								            o_LengQueFengJi_Gao|	//冷却高档
								            o_shuibeng|				//水泵
								            o_Zhenkongbeng2|		//真空泵备用输出
								            o_Zhenkongbeng|			//真空泵输出
								            SCK0|					//SPI
								            MOSI0|					//SPI
								            o_706dog|				//SPI硬件狗复位脚
								            P_022|					//管脚未接上拉设为输出
								            P_019|					//管脚未接上拉设为输出
								            P_020 ; 				//管脚未接上拉设为输出
								   IO1SET = o_KongTiaoQiDong|		//空调继电器启动
								            CS;						//SPI
								   IO1CLR = o_ready;				//真空泵电路继电器跳转
                                } 
  else 
  {	
     //水泵控制
     IO0CLR=o_shuibeng; comstate_2.Bits.shuibeng=1;  
                      
     //主控主接触器允许  
     if(pengzhuang_flag!=0)     //来自内部传感器:碰撞、水压     ==1||shuiya_alarm_flag==1               
     { 
              comstate_1.Bits.zhujiechuqi=0;						  //关闭主接触器
              flag_cutd=1;
     }
     else
     {
          if(flag_cutd!=1) //(infoalarm_2.Word==0)&&	
          {														 
           	comstate_1.Bits.zhujiechuqi=1;  						 //主接触器开启
          }
     }
     
     //空调控制              
     if(flag_airqingqiu==0x00)												//空调关闭
     {
     	IO1SET=o_KongTiaoQiDong;    comstate_2.Bits.airjidianqi=0; 			//关空调继电器
     }
     if(flag_airqingqiu==0x01)	 											//空调启动致冷
     {
     	//flag_air=1;															//致冷空调启动标识
     	IO1CLR=o_KongTiaoQiDong;    comstate_2.Bits.airjidianqi=1;			//开空调继电器
     	//IO0CLR=o_LengNing;		    comstate_2.Bits.lengning=1;				//开冷凝
     }
     if(flag_airqingqiu==0x02)												//空调致热
     {
     	IO1CLR=o_KongTiaoQiDong;    comstate_2.Bits.airjidianqi=1;			//开空调继电器 
     }
     
     //************************************冷却系统控制策略************************************************
     //************************************2007.4.16修改冷凝风扇*******************************************
     if((zhongya==1) || (MOTO_sta==1))										//有中压信号或发动机启动信号
  	 {
  		flag_lengque=0;
  		IO0CLR=o_LengNing;		    comstate_2.Bits.lengning=1;				//开冷凝
  		IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;				//冷却风机低档关闭
  		IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;			//开冷却高
  	 }
  	 else 
  	 {
  	 	IO0CLR=o_LengNing;		    comstate_2.Bits.lengning=1;				//开冷凝
  	 	
  	 	if(flag_lengque==0)			//上电后首先执行一次,全范围控制
  	 	{
  	 		flag_lengque=1;
  	 		//冷却风扇控制
	  	 	if(flag_shw==1)															//水温传感器损坏
	  	 	{
	  	 		if(outtemp<=59)												//户外温度低于19度都不开启
			  	{
			  			if(MOTO_temp>=138)
			  			{
			  				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  				IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  			}
			  			else 
			  			{
				  			IO0SET=o_LengQueFengJi_Di|o_LengQueFengJi_Gao; 				//冷却风扇关
				  			comstate_1.Bits.fengjidi=0; comstate_1.Bits.fengjigao=0;
			  			}
			  	}
			  	if(outtemp>=60&&outtemp<=69)									//户外温度高于20度小于29度冷却风扇开启低档
			  	{
			  			if(MOTO_temp>=138)
			  			{
			  				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  				IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  			}
			  			else 
			  			{
				  			IO0CLR=o_LengQueFengJi_Di;comstate_1.Bits.fengjidi=1;		//冷却风机低档吸合
						   	IO0SET=o_LengQueFengJi_Gao;comstate_1.Bits.fengjigao=0;		//冷却风机高档关闭
					   	}
			  	}
			  	if(outtemp>=70)													//户外温度高于30度都开启
			  	{
			  			IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  	}
	  	 	}
	  	 	else																	//水温传感器未损坏
	  	 	{
	  	 		if(flag_airqingqiu==0x01)											//空调启动
	  	 		{
	  	 			if(MOTO_temp>=138)
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
	  	 			}
	  	 			else
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
			  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
	  	 			}
	  	 		}
	  	 		else																//空调未启动
	  	 		{
	  	 			if(water_temp>=78)
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
	  	 			}
	  	 			else if(water_temp>=70 && water_temp<=77)
	  	 			{
	  	 				if(MOTO_temp>=138)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
		  	 			}
		  	 			else
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
	  	 			}
	  	 			else 
	  	 			{
	  	 				if(MOTO_temp>=138)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
		  	 			}
		  	 			else if(MOTO_temp>=132)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
		  	 			else
		  	 			{
		  	 				IO0SET=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
	  	 			}
	  	 		}
	  	 	}
  	 	} 
  	 	else  //if(flag_lengque==1)
  	 	{
  	 		//冷却风扇控制
	  	 	if(flag_shw==1)															//水温传感器损坏
	  	 	{
	  	 		if(outtemp<=59)												//户外温度低于19度都不开启
			  	{
			  			if(MOTO_temp>=138)
			  			{
			  				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  				IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  			}
			  			else if(MOTO_temp<=135)
			  			{
				  			IO0SET=o_LengQueFengJi_Di|o_LengQueFengJi_Gao; 				//冷却风扇关
				  			comstate_1.Bits.fengjidi=0; comstate_1.Bits.fengjigao=0;
			  			}
			  	}
			  	if(outtemp>=62&&outtemp<=68)									//户外温度高于22度小于28度冷却风扇开启低档
			  	{
			  			if(MOTO_temp>=138)
			  			{
			  				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  				IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  			}
			  			else if(MOTO_temp<=135)
			  			{
				  			IO0CLR=o_LengQueFengJi_Di;comstate_1.Bits.fengjidi=1;		//冷却风机低档吸合
						   	IO0SET=o_LengQueFengJi_Gao;comstate_1.Bits.fengjigao=0;		//冷却风机高档关闭
					   	}
			  	}
			  	if(outtemp>=70)													//户外温度高于30度都开启
			  	{
			  			IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
			  	}
	  	 	}
	  	 	else																	//水温传感器未损坏
	  	 	{
	  	 		if(flag_airqingqiu==0x01)											//空调启动
	  	 		{
	  	 			if(MOTO_temp>=138)
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
	  	 			}
	  	 			else if(MOTO_temp<=135)
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
			  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
	  	 			}
	  	 		}
	  	 		else																//空调未启动
	  	 		{
	  	 			if(water_temp>=78)
	  	 			{
	  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
			  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
	  	 			}
	  	 			else if(water_temp>=70 && water_temp<=75)
	  	 			{
	  	 				if(MOTO_temp>=138)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
		  	 			}
		  	 			else if(MOTO_temp<=135)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
	  	 			}
	  	 			else if(water_temp<=67)
	  	 			{
	  	 				if(MOTO_temp>=138)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0CLR=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=1;	//开冷却高
		  	 			}
		  	 			else if(MOTO_temp>=130 && MOTO_temp<=135)
		  	 			{
		  	 				IO0CLR=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=1;		//冷却风机低档开启
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
		  	 			else if(MOTO_temp<=127)
		  	 			{
		  	 				IO0SET=o_LengQueFengJi_Di;  comstate_1.Bits.fengjidi=0;		//冷却风机低档关闭
				  			IO0SET=o_LengQueFengJi_Gao;	comstate_1.Bits.fengjigao=0;	//关冷却高
		  	 			}
	  	 			}
	  	 		}
	  	 	}
  	 	}
  	 }
  	 
     //真空泵控制
     //主控制电路正常
	 if(MOS_flag==0)													//真空泵控制电路MOS管未损坏
	 {
	    if(flag_zhkb==1)
	    { 																//真空压力传感器损坏
	      if(IOstate0&i_JiaoSha)  										//无脚刹
	      {
	    	if(flag_zhkbkq==0)											//损坏后只执行一次开启20秒
	    	{
	    		if(counter3<=50)										//先开启5秒钟
	    		{
	    			IO0CLR=o_Zhenkongbeng;
	    			comstate_1.Bits.zhenkongbeng=1;
	    		}
	    		if(counter3>50)
	    		{
	    			counter3=0;
	    			flag_zhkbkq=1;										//表明已经开过20秒真空泵
	    		}
	    	}
	    	if(flag_zhkbkq==1)							
	    	{
	    		if(flag_zhkbjsh==0)										//已经开启过20秒真空泵,且脚刹标识位已经清零
	    		{
	    			IO0SET=o_Zhenkongbeng;
	            	comstate_1.Bits.zhenkongbeng=0;
	    		}
	    		if(flag_zhkbjsh==1)										//脚刹已经松起且计时5秒&&counter5<50
	    		{
	    			IO0CLR=o_Zhenkongbeng;
	    			comstate_1.Bits.zhenkongbeng=1;
	    		}
	    		if(counter5>=10)
	    		{
	    			counter5=0;
	    			flag_zhkbjsh=0;
	    		}
	        }
	      }
	      else				 											//有脚刹,则考虑一直开启真空泵(暂定)
	      {
	      	    flag_zhkbjsh=1;												//真空泵损坏后踩脚刹标识,为1则表明脚刹松起后要继续开启5秒真空泵
	      		IO0CLR=o_Zhenkongbeng;
	      		comstate_1.Bits.zhenkongbeng=1;
	      }
	    }
	    else if(flag_zhkb==0)
	    {   															//真空压力传感器未损坏
	    	if(ADC_data1>1271*k1/k2&&ADC_data1<3000*k1/k2) 							// 真空度低于40,真空泵开启
	    	{
	    		IO0CLR=o_Zhenkongbeng;
	    		comstate_1.Bits.zhenkongbeng=1;
	    	}
	    	if(ADC_data1<785*k1/k2&&ADC_data1>100*k1/k2)       						//真空度高于60

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -