sysfunction.c

来自「用FreeScale 的MC9S08FL16RM MCU设计的一种家用空调控制器」· C语言 代码 · 共 2,177 行 · 第 1/4 页

C
2,177
字号
void	Heat_Mode(void)
{
	if(!F_SysMode_On||F_Comp4WVFault||F_Defrost_Start||F_Defrost_End||F_SensorFault_P)	return;
	if(F_SysMode_Heat)
	{
		if(F_RunMode_Cool)
		{
			F_Comp1thRun = 0;
  		F_Diagnostic_End = 1;
  		F_Disp_E4 = 0;
    	F_BlnakingCHLed = 0;
		}
		if(!F_RunMode_Heat)
		{
			OUT5_ODF = 0;
			OUT6_COMP = 0;
			F_Comp_On = 0;
			SysTimerStr.Timer_60sCompOff = 60;
		}
		F_RunMode_Heat = 1;
		F_RunMode_Cool = 0;
		if(SysTimerStr.Timer_180sPowerOn==0||F_PowDn3Minu)
		{
			if(Set_Temper>=(Temp_Indoor+2)&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu))
			{
				if(F_Comp_On==0)
				{
  				SysTimerStr.Timer_120sCompRun = 120;	//comp 120s minimum run time
  			}
  			SysTimerStr.Timer_10minCompOff = 10;
  			F_Comp_On = 1;	//comp run flag
  		}
  		if(Temp_Indoor>=(Set_Temper+3)&&SysTimerStr.Timer_120sCompRun==0)
  		{
  			if(F_Comp_On)
  			{
  				SysTimerStr.Timer_180sCompOff = 180;	//comp 3min protect
  				//SysTimerStr.Timer_60sCompOff = 60;
  				SysTimerStr.Timer_10minCompOff = 10;
  			}
  			F_Comp_On = 0;	//comp stop flag  			
  		}
		}
	}
}
/////////////////////////////////
void Cold_Draft(void)
{
	if(!F_SysMode_On||F_Comp4WVFault)	return;
	if(F_SysMode_Heat)
	{
		FanSpeedBak &= 0b00001111;
		/*if(Temp_Incoil==ICTTemp)
		{
			if(Temp_Incoil<=(31*2+80))
			{
			  if(OUT0_LF)	OUT0_LF = 0;
    		if(OUT1_MF) OUT1_MF = 0;
    		if(OUT2_HF) OUT2_HF = 0;
    		F_FanSpeed_Low = 0;
    		F_FanSpeed_Mid = 0;
    		F_FanSpeed_High = 0;
    		F_ColdDraft = 1;
			}
		}*/
		if(Temp_Incoil>ICTTemp)
		{
		  ICTTemp = Temp_Incoil;
		  if((Temp_Incoil<=(31*2+80))&&Temp_Incoil!=0)
		  {
		  	if(OUT0_LF)	OUT0_LF = 0;
    		if(OUT1_MF) OUT1_MF = 0;
    		if(OUT2_HF) OUT2_HF = 0;
    		F_FanSpeed_Low = 0;
    		F_FanSpeed_Mid = 0;
    		F_FanSpeed_High = 0;
    		F_ColdDraft = 1;
		  }
		  if(Temp_Incoil>(31*2+80)&&Temp_Incoil<=(38*2+80))
		  {
		    if(!OUT0_LF)	OUT0_LF = 1;
    		if(OUT1_MF) OUT1_MF = 0;
    		if(OUT2_HF) OUT2_HF = 0;
    		F_FanSpeed_Low = 1;
    		F_FanSpeed_Mid = 0;
    		F_FanSpeed_High = 0;
    		F_ColdDraft = 1;
		  }
		  if(Temp_Incoil>(38*2+80))
		  {
		  	FanSpeedBak &= 0b00001111;
		  	if(FanSpeedBak==0x08)	FanSpeed &= 0b11110000,F_FanSpeed_Low = 1;
		  	if(FanSpeedBak==0x04&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_Mid = 1;
		  	if(FanSpeedBak==0x02&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_High = 1;
		  	if(FanSpeedBak==0x09) FanSpeed &= 0b11110000,F_FanSpeed_Low = 1,F_FanSpeed_Auto = 1;
		  	if(FanSpeedBak==0x05&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_Mid = 1,F_FanSpeed_Auto = 1;
		  	if(FanSpeedBak==0x03&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_High = 1,F_FanSpeed_Auto = 1;
    		F_ColdDraft = 0;
		  }
		}
		if(Temp_Incoil<ICTTemp)
		{
		  ICTTemp = Temp_Incoil;
		  if(Temp_Incoil>=(37*2+80))
		  {
		    FanSpeedBak &= 0b00001111;
		  	if(FanSpeedBak==0x08)	FanSpeed &= 0b11110000,F_FanSpeed_Low = 1;
		  	if(FanSpeedBak==0x04&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_Mid = 1;
		  	if(FanSpeedBak==0x02&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_High = 1;
		  	if(FanSpeedBak==0x09) FanSpeed &= 0b11110000,F_FanSpeed_Low = 1,F_FanSpeed_Auto = 1;
		  	if(FanSpeedBak==0x05&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_Mid = 1,F_FanSpeed_Auto = 1;
		  	if(FanSpeedBak==0x03&&OUT6_COMP) FanSpeed &= 0b11110000,F_FanSpeed_High = 1,F_FanSpeed_Auto = 1;
    		F_ColdDraft = 0;
		  }
		  if(Temp_Incoil<(37*2+80)&&Temp_Incoil>=(30*2+80))
		  {
		  	if(!OUT0_LF)	OUT0_LF = 1;
    		if(OUT1_MF) OUT1_MF = 0;
    		if(OUT2_HF) OUT2_HF = 0;
    		F_FanSpeed_Low = 1;
    		F_FanSpeed_Mid = 0;
    		F_FanSpeed_High = 0;
    		F_ColdDraft = 1;
		  }
		  if((Temp_Incoil<(30*2+80))&&Temp_Incoil!=0)
		  {
		  	if(OUT0_LF)	OUT0_LF = 0;
    		if(OUT1_MF) OUT1_MF = 0;
    		if(OUT2_HF) OUT2_HF = 0;
    		F_FanSpeed_Low = 0;
    		F_FanSpeed_Mid = 0;
    		F_FanSpeed_High = 0;
    		F_ColdDraft = 1;
		  }
		}
	}	
}
/////////////////////////////////
void	Ionizer_Run(void)
{
	if(!F_SysMode_On)	return;
	if(F_Ionizer_Active)
	{
		if((OUT0_LF||OUT1_MF||OUT2_HF)&&(F_FanSpeed_Low||F_FanSpeed_Mid||F_FanSpeed_High))
		{
			if(!OUT3_ION)	OUT3_ION = 1;
		}
		else
		{
			if(OUT3_ION)	OUT3_ION = 0;
		}
	} 
	else
	{
	  if(OUT3_ION)	OUT3_ION = 0;
	}
}
/////////////////////////////////
void	FourWayValue_Run(void)
{
  if(!F_SysMode_On)	return;
  if(F_Comp4WVFault)
  {
  	if(OUT4_4WV&&SysTimerStr.Timer_40sComp4WVDiag==0)
  	{
  		OUT4_4WV = 0;
  	}
  	return;
  }
  if(F_SysMode_Heat)
  {
    /*if(F_Comp_On&&(OUT4_4WV==0))
    {
      //if(F_4WayValue_On==0)
      //{
      	SysTimerStr.Timer_5sFourWayVOn = 5;
      //}
      F_4WayValue_On = 1;
      OUT4_4WV = 1;
    } */
    if((F_Comp_On||F_PowDn3Minu)&&!OUT6_COMP&&!OUT4_4WV&&!OUT5_ODF&&SysTimerStr.Timer_60sCompOff==0)
    {
      OUT4_4WV = 1;
      F_4WayValue_On = 1;
      SysTimerStr.Timer_5sFourWayVOn = 5;
    }
  }
  if((F_SysMode_Cool||F_SysMode_Fan||F_SysMode_Dry)&&!(F_RunMode_Heat&&F_SensorFault_P))			//debug
  {
    if(OUT4_4WV&&SysTimerStr.Timer_60sCompOff==0)
    {
      OUT4_4WV = 0;
      F_4WayValue_On = 0;
    }
  }
}
/////////////////////////////////
void	Comp_Run(void)
{
  if(!F_SysMode_On||F_Comp4WVFault||F_Defrost_Start||F_Defrost_End||F_SensorFault_P)	return;
  if(F_SysMode_Heat&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu))
  {
    if(F_Comp_On&&!OUT6_COMP&&OUT4_4WV&&OUT5_ODF&&SysTimerStr.Timer_2sOutFanRun==0
    	&&!F_BlnakingCHLed)
    	//&&F_RunMode_Heat==0)
    {
      OUT6_COMP = 1;
      F_PowDn3Minu = 0;
      if(F_Comp1thRun==0)
      {
      	Ti_DSR = Temp_Incoil+2*2;
      	F_Comp1thRun = 1;
      	CompFault_Times = 0;
      	F_Diagnostic_End = 0;
      	SysTimerStr.Timer_15minCompLapsed = 15;
      }
    }
    if(!OUT6_COMP||!F_Timer_180min) F_DT_Max = 0,SysTimerStr.Timer_15minCompRun = 15;
    if(SysTimerStr.Timer_15minCompRun==0&&OUT6_COMP&&!F_DT_Max&&F_Timer_180min)
    {
			if(Temp_Incoil<Temp_Indoor)
			{
				DT_Max = 0;
			}
			else
			{
				DT_Max = Temp_Incoil-Temp_Indoor;
			}
			F_DT_Max = 1; 
    }
  }
  if(F_SysMode_Cool&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu))
  {
    if(F_Comp_On&&!OUT6_COMP&&OUT5_ODF&&SysTimerStr.Timer_2sOutFanRun==0&&
      !F_BlnakingCHLed&&!F_FilterChoke)
    {
      OUT6_COMP = 1;
      F_PowDn3Minu = 0;
      SysTimerStr.Timer_10minCompRun = 10;
      if(F_Comp1thRun==0)
      {
      	Ti_DSR = Temp_Incoil-2*2;
      	F_Comp1thRun = 1;
      	CompFault_Times = 0;
      	F_Diagnostic_End = 0;
      	SysTimerStr.Timer_15minCompLapsed = 15;
      }
    }
  }
  if(!F_Comp_On&&OUT6_COMP&&!F_SysMode_Dry&&(SysTimerStr.Timer_120sCompRun==0))
  {
    OUT6_COMP = 0;
    SysTimerStr.Timer_180sCompOff = 180;	//comp 3min protect
    SysTimerStr.Timer_60sCompOff = 60;
    SysTimerStr.Timer_10minCompRun = 10;
  }
}
/////////////////////////////////
void	OutFan_Run(void)
{
  if(!F_SysMode_On||F_Comp4WVFault||F_Defrost_Start||F_Defrost_End||F_SensorFault_P)	return;
  if(F_SysMode_Heat&&F_Comp_On&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu))
  {
    if(!OUT5_ODF&&!F_BlnakingCHLed&&OUT4_4WV&&SysTimerStr.Timer_5sFourWayVOn==0)
    {
      OUT5_ODF = 1;
      F_OutFan_On = 1;
      SysTimerStr.Timer_2sOutFanRun = 2;
    }
  }
  if(F_SysMode_Cool&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu))
  {
  	if(F_Comp_On&&!OUT5_ODF&&!F_BlnakingCHLed&&!F_FilterChoke)
  	{
  		OUT5_ODF = 1;
    	F_OutFan_On = 1;
    	SysTimerStr.Timer_2sOutFanRun = 2;
  	}
  }
  if((!F_Comp_On||F_Comp4WVFault)&&OUT5_ODF&&!F_SysMode_Dry&&!F_PowDn3Minu)
  {
  	OUT5_ODF = 0;
  }
  	
}
/////////////////////////////////
void	Off_Mode(void)
{
  if(!F_SysMode_On)
  {
    if(OUT0_LF)	OUT0_LF = 0,F_FanSpeed_Low = 0;
    if(OUT1_MF) OUT1_MF = 0,F_FanSpeed_Mid = 0;
    if(OUT2_HF) OUT2_HF = 0,F_FanSpeed_High = 0;
    if(OUT3_ION) OUT3_ION = 0, F_Ionizer_Active = 0;
		if(OUT5_ODF) OUT5_ODF = 0;
		if(OUT6_COMP) OUT6_COMP = 0,SysTimerStr.Timer_60sCompOff = 60;
		F_OutFan_On = 0;
		F_Comp_On = 0;
		
		if(SysTimerStr.Timer_60sCompOff==0&&OUT4_4WV)
    {
      OUT4_4WV = 0;
      F_4WayValue_On = 0;
    }
    CompFault_Times = 0;
    F_Disp_E4 = 0;
    F_Comp4WVFault = 0;
    F_BlnakingCHLed = 0;
    F_Comp1thRun = 0;
    F_Diagnostic_End = 1;
		SysTimerStr.Timer_180sCompOff = 180;
    Sleep_Time = 0;
    SysTimerStr.Timer_5minSleepMode = 5;
	 
    if(F_SysHave_Off==0)
    {
			Steps_Time = 1;
    	Target_Steps=2000;
    	Current_Steps=3300;
    }
    	F_SysHave_Off = 1;
    	return;
  }
  if(F_SysHave_Off)
  {
  	if(EE_WTemp[3]==0&&EE_WTemp[4]>=1&&EE_WTemp[4]<=75)
  	{
  		Target_Steps_Bk = 3300-1260/10*(EE_WTemp[4]+1)/11;
			Louver_Position = 0xff;
  	}
  	Steps_Time = 1;
  	Target_Steps=3300;
  	Current_Steps = 2000;
  }
  F_SysHave_Off = 0;
  
}
/////////////////////////////////
void UseData_Parse(void)
{ 
	if(EE_WTemp[0]!=0x55)
	{
	  uchar	k;
	  for(k=0;k<10;k++)
	  {
	  	EE_WTemp[k] = Factory_Data[k];
	  }
	}
	if(EE_WTemp[0]==0x55)
	{
		//Fan speed
		FanSpeed &=0b11110000;
		if(EE_WTemp[2]==0x01)
		{
			F_FanSpeed_Auto = 1;
   		F_FanSpeed_Low = 1;
   		FanSpeedBak = 0b00001001;
		}
		if(EE_WTemp[2]==0x02)
		{
   		F_FanSpeed_High = 1;
   		FanSpeedBak = 0b00000010;
		}
		if(EE_WTemp[2]==0x04)
		{
   		F_FanSpeed_Mid = 1;
   		FanSpeedBak = 0b00000100;
		}
		if(EE_WTemp[2]==0x08)
		{
   		F_FanSpeed_Low = 1;
   		FanSpeedBak = 0b00001000;
		}
		if((FanSpeed&0b00001111)==0)	
		{
			F_FanSpeed_High = 1;
   		FanSpeedBak = 0b00000010;
		}
		//stepper motor swing
		if(EE_WTemp[3]>4&&EE_WTemp[3]!=15)
		{
			Louver_Position = 4;
		}
		else
		{
			Louver_Position = EE_WTemp[3];
		}
		if(EE_WTemp[3]==0)
  	{
  		if(EE_WTemp[4]>=1&&EE_WTemp[4]<=75)
  		{
  			Target_Steps_Bk = 3300-1260/10*(EE_WTemp[4]+1)/11;//3300-1260/11*(109-EE_WTemp[4])/10;
				Louver_Position = 0xff;
  			Target_Steps=3300;
  			Current_Steps = 2000;
  		}
  		else
  		{
  			Target_Steps_Bk = 3300;
  			Louver_Position = 0xff;
  		}
  	}
		//Ionizer
		if(EE_WTemp[5]==0x05)
		{
			F_Ionizer_Active = 1;
  	}
  	if(EE_WTemp[5]==0)
  	{
  		F_Ionizer_Active = 0;
  	}
  	if(EE_WTemp[5]!=0x05&&EE_WTemp[5]!=0)
  	{
  		F_Ionizer_Active = 0;
  	}
  	//sleep status
  	if(EE_WTemp[6]==0x02)
  	{
  		F_SysFeature_Sleep = 1;
  	}
  	if(EE_WTemp[6]==0)
  	{
   		F_SysFeature_Sleep = 0;
  	}
  	if(EE_WTemp[6]!=0x02&&EE_WTemp[6]!=0)
  	{
  		F_SysFeature_Sleep = 0;
  	}
  	//set temperature
  	if(EE_WTemp[8]<112||EE_WTemp[8]>140)
  	{
  		EE_WTemp[8] = 128;
  	}
  	Disp_Temp[0] = Disp_Code[(EE_WTemp[8]-80)/2/10];
  	Disp_Temp[1] = Disp_Code[(EE_WTemp[8]-80)/2%10]&0b01111111;
  	Set_Temper = EE_WTemp[8];
  	SetTempBak = EE_WTemp[8];
  	if(Disp_Temp[1]==0x4f) Disp_Temp[1] = 0x79;
  	DispTemp0Bak = Disp_Temp[0];
  	DispTemp1Bak = Disp_Temp[1];
  	//Room temperature display option
  	if(EE_WTemp[9]==0x02)
  	{
   		F_RoomTemper_Disp = 1;
  	}
  	if(EE_WTemp[9]==0x01)
  	{
   		F_RoomTemper_Disp = 0;
  	}
  	if(EE_WTemp[9]!=0x02&&EE_WTemp[9]!=0x01)
  	{
  		F_RoomTemper_Disp = 0;
  	}
  	//Mode
  	SysRunMode &= 0b11100000;
  	if(EE_WTemp[7]==0x01)
  	{
  		F_SysMode_Dry = 1;
  		SysModeBak = 0b00000001;
  	}
  	if(EE_WTemp[7]==0x02)
  	{
    	F_SysMode_Cool = 1;
    	SysModeBak = 0b00000010;
  	}
  	if(EE_WTemp[7]==0x04)
  	{
    	F_SysMode_Fan = 1;
    	SysModeBak = 0b00000100;
  	}
  	if(EE_WTemp[7]==0x08&&F_Hard_Heatpump)
  	{
    	F_SysMode_Heat = 1;
    	SysModeBak = 0b00001000;
  	}
  	if(EE_WTemp[7]==0x0A)
  	{
  		F_SysMode_Auto = 1;
  		SysModeBak = 0b00001010;
  	}
  	if((SysRunMode&0b00011111)==0)
  	{
  		F_SysMode_Cool = 1;
    	SysModeBak = 0b00000010;
  	}
  	//System status
  	if(EE_WTemp[1]!=0x08&&EE_WTemp[1]!=0)
  	{
  		EE_WTemp[1] = 0;
  	}
		if(EE_WTemp[1]==0x08&&!F_Hard_DefaultOff)
		{
			F_SysMode_On = 1;					 //system on
		} 
		if(EE_WTemp[1]==0)
		{
			F_SysMode_On = 0;					 //system off
		}
	}
}
/////////////////////////////////
void OutdoorCoil_Defrost_Judge(void)
{
	if(!F_SysMode_On||!F_SysMode_Heat||F_Comp4WVFault||F_Defrost_Start||F_Defrost_End) return;
	
	if(SysTimerStr.Timer_150sTiTemp==0) CompTimeTotal = 0;
	if((CompTimeTotal>20)&&F_DT_Max) //debug CompTimeTotal>45
	{
	  if(OUT2_HF)
	  {
	  	if(((Temp_Incoil-Temp_Indoor)*100)<(DT_Max*75)&&
	  		(Temp_Incoil<Temp_Indoor+20*2)&&
	  		(Temp_Incoil<(43*2+80)))
	  	{
			 	F_Defrost_Start = 1;
			 	return;
	  	}
	  }
	  if(OUT1_MF)
		{
	  	if(((Temp_Incoil-Temp_Indoor)*100)<(DT_Max*75)&&
	  		(Temp_Incoil<Temp_Indoor+21*2)&&
	  		(Temp_Incoil<(43*2+80)))
	  	{
			 	F_Defrost_Start = 1;
			 	return;
	  	}
	  }
	  if(OUT0_LF||(OUT0_LF==0&&OUT1_MF==0&&OUT2_HF==0))
		{
	  	if(((Temp_Incoil-Temp_Indoor)*100)<(DT_Max*75)&&
	  		(Temp_Incoil<Temp_Indoor+22*2)&&
	  		(Temp_Incoil<(43*2+80)))
	  	{
			 	F_Defrost_Start = 1;
			 	return;
	  	}
		}
	}
	if((CompTimeTotal>180)&&F_DT_Max)
	{
	  if(OUT2_HF)
	  {
	  	if((Temp_Incoil<Temp_Indoor+20*2)&&
	  		(Temp_Incoil<(43*2+80)))

⌨️ 快捷键说明

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