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

📄 fan.c

📁 一个很好的完整的空调控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{
#ifdef ChigoXG3
     ClrHotCnt = 0x1E;             /* 吹余热计时(2分钟) */
#else
     ClrHotCnt = 0;                /* 吹余热计时(2分钟) */
#endif
     if ((AutoAckTm != 0)||
        ValBit(OutDevStu[0],fRunEnable)){  /* 外机允许时 */

       /* 当盘管中点温度≤0℃且持续1分钟时进入防结霜保护,
       停压缩机,室内风机吹高风,当盘管中点温度≥7℃退出保护 */
       if (TubeMidTp > FrostTMIN) FrostCnt = 0;
       if (FrostCnt >= FrostCntMAX) SetBit(Sysflag2,fProtFrost);
       if (TubeMidTp >= FrostTMAX)  ClrBit(Sysflag2,fProtFrost);

       if (ValBit(Sysflag2,fProtFrost)){
         FanSet(FANHI|(1<<fFanCtrlBit));   /* 高风 */
       } else {
         FanSet(FANLO|(1<<fFanCtrlBit));   /* 低风 */
       }
     } else {
       ClrBit(FanStatus,fFanCtrlBit);  /* 1:内风机运行标志 */
     }
}

void HeatModeSub(void)
{
     ClrBit(Sysflag2,fProtFrost);  /* 防冻标志 */
     FrostCnt = 0;                 /* 清除防冻计时 */
//#ifdef ChigoXG3
//     ClrHotCnt = 0x1E;             /* 吹余热计时(2分钟) */
//#else
     ClrHotCnt = 0x78;             /* 吹余热计时(2分钟) */
//#endif
#ifdef ChigoXG2
     if (ValBit(Sysflag,fPower)){  /* 压缩机开机标志 */
       ZhiReFJTm = 30;             /* 制热温度到达设定温度,30秒后停内风机 */
     }
     if ((ZhiReFJTm == 0) &&       /* 制热温度到达设定温度,30秒后停内风机 */
         (!ValBit(Sysflag2,fOverHeat))){  /* 1: 过热保护 */
       ClrBit(FanStatus,fFanCtrlBit);
     } else {
#endif
       if ((AutoAckTm != 0) ||
           ValBit(OutDevStu[0],fRunEnable)){  /* 外机允许时 */

         /* 内盘管中点温度≥35℃,设定风速 */
         if (TubeMidTp >= COOLFANSET){            /* 35 */
           ClrBit(Sysflag2,fProtColdLow);
           ClrBit(Sysflag2,fProtColdFan);
           if (TubeMidTp >= OVERMAXHEAT){         /* >= 57 */
             SetBit(Sysflag2,fOverHeat);
           } else if (TubeMidTp <= OVERMINHEAT){  /* <= 54 */
             ClrBit(Sysflag2,fOverHeat);
           }
           if ValBit(Sysflag2,fOverHeat){
#if (NJTYPE == 3)||(NJTYPE == 4)
             if ((u8)(FanStatus & FANMASK) != FANPO)
#endif
               FanSet(FANHI|(1<<fFanCtrlBit));    /* 高风 */
           } else {
#if ((NJTYPE == 0)||(NJTYPE == 1)||(NJTYPE == 3))
             Fan_Setup(SetupTp,TempOffset);       /* 设定风 */
#elif (NJTYPE == 2)||(NJTYPE == 4)||(NJTYPE == 5)
             Fan_Setup((u8)(SetupTp-2),TempOffset);
#endif
           }
         } else {
           ClrBit(Sysflag2,fOverHeat);            /* 1: 超温保护 */
           if (ValBit(Sysflag2,fProtColdFan)){
             if (TubeMidTp > COOLFANLOW){         /* 29 */
               ClrBit(Sysflag2,fProtColdFan);
               SetBit(Sysflag2,fProtColdLow);
               FanSet(FANEC|(1<<fFanCtrlBit));
             } else {
               ClrBit(Sysflag2,fProtColdLow);
               //SetBit(Sysflag2,fProtColdFan);
               ClrBit(FanStatus,fFanCtrlBit);
             }
           } else {
             if (TubeMidTp <= COOLFANSTP){        /* 20/25 */
               ClrBit(Sysflag2,fProtColdLow);
               SetBit(Sysflag2,fProtColdFan);
               ClrBit(FanStatus,fFanCtrlBit);
             } else if ((TubeMidTp <= COOLFANLOW) /* 28 */
                     || (ValBit(Sysflag2,fProtColdLow))){
               //ClrBit(Sysflag2,fProtColdFan);
               SetBit(Sysflag2,fProtColdLow);
               FanSet(FANEC|(1<<fFanCtrlBit));
             } else {
               //ClrBit(Sysflag2,fProtColdFan);
               ClrBit(Sysflag2,fProtColdLow);
#if ((NJTYPE == 0)||(NJTYPE == 1)||(NJTYPE == 3))
               Fan_Setup(SetupTp,TempOffset);         /* 设定风 */
#elif (NJTYPE == 2)||(NJTYPE == 4)||(NJTYPE == 5)
               Fan_Setup((u8)(SetupTp-2),TempOffset); /* 设定风 */
#endif
             }
           }
         }
       } else {
         ClrBit(FanStatus,fFanCtrlBit);  /* 1:内风机运行 */
       }
#ifdef ChigoXG2
     }
#endif
}

void FanCont_Sub(void)
{

#ifdef EnSWING
#if (NJTYPE==0)||(NJTYPE==1)||(NJTYPE==2)||(NJTYPE==3)||(NJTYPE==4)
   if ((!ValBit(Sysflag,fResetBj)) &&
       (ValBit(Sysflag1,fStepMotor))){  /* 1: 步进电机驱动风门 */
     FanRunDly = 0x0FA; /* 5s */
   }
#endif
#endif

#ifndef EnPGFENGJI
   if (ValBit(OutDevStu[0],fOutDeforst)|| /* 化霜时,关内风机  */
        (!ValBit(FanStatus,fFanCtrlBit))  /* 1:内风机运行标志 */
#ifdef EnSWING
#if (NJTYPE==0)||(NJTYPE==1)||(NJTYPE==2)||(NJTYPE==3)||(NJTYPE==4)
      ||((FanRunDly != 0) && (ValBit(Sysflag1,fStepMotor))) /* 扫风延时 */
#endif
#endif
      || ((u8)(FanStatus & FANMASK) == FANAUTO)){
     ClrBit(pFanLo,pbFanLo);
     ClrBit(pFanMi,pbFanMi);
     ClrBit(pFanHi,pbFanHi);              /* 关内风机 */
   } else if (((u8)(FanStatus & FANMASK) == FANLO)
            ||((u8)(FanStatus & FANMASK) == FANEC)){
     ClrBit(pFanMi,pbFanMi);
     ClrBit(pFanHi,pbFanHi);              /* 低风 */
     SetBit(pFanLo,pbFanLo);
   } else if ((u8)(FanStatus & FANMASK) == FANMI){
     ClrBit(pFanLo,pbFanLo);
     ClrBit(pFanHi,pbFanHi);              /* 中风 */
     SetBit(pFanMi,pbFanMi);
   } else {
     ClrBit(pFanLo,pbFanLo);
     ClrBit(pFanMi,pbFanMi);
     SetBit(pFanHi,pbFanHi);              /* 高风 */
   }
}
#else  /* EnPGFENGJI */
   if (ValBit(OutDevStu[0],fOutDeforst)|| /* 化霜时,关内风机  */
        (!ValBit(FanStatus,fFanCtrlBit))  /* 1:内风机运行标志 */
#ifdef EnSWING
#if (NJTYPE==0)||(NJTYPE==1)||(NJTYPE==2)||(NJTYPE==3)||(NJTYPE==4)
      ||((FanRunDly != 0) && (ValBit(Sysflag1,fStepMotor))) /* 扫风延时 */
#endif
#endif
      ||((u8)(FanStatus & FANMASK) == FANAUTO)){
     SetBit(pPGFan,pbPGFan);              /* 关内风机 */
     PGErrCnt = 0;                        /* 清除故障检测计时 */
     TrigTime = (u16)0x1800;
     ClrBit(PGFanStatus,fPGCtlBit);       /* */
   } else {
     SetBit(PGFanStatus,fPGCtlBit);       /* */
     /* 风机运行风速 */
     if (ValBit(PGFanStatus,fPGEnAdjust)){
       ClrBit(PGFanStatus,fPGEnAdjust);
       //if (PG_OC-- == 0){
         //PG_OC = 2;
         //if (ValBit(PGFanStatus,fPGFeedEn)){
           /* 有反馈时,自动调整触发时间 */
           if (PG_Bak > (u16)(Tab_PGSpeed[(u8)((FanStatus & FANMASK) >> 4)] + 0x20)){
             if (TrigTime > 0x320) TrigTime -= 0x20;
           } else if (PG_Bak < (u16)(Tab_PGSpeed[(u8)((FanStatus & FANMASK) >> 4)] - 0x20)){
             if (TrigTime < 0x1DE0) TrigTime += 0x20;
           }
         //} else {
         //  /* 无反馈时,按照设定触发时间操作 */
         //  if (TrigTime > Tab_PGNFB[(u8)((FanStatus & FANMASK) >> 4)]){
         //    TrigTime--;
         //  } else if (TrigTime < Tab_PGNFB[(u8)((FanStatus & FANMASK) >> 4)]){
         //    TrigTime++;
         //  }
         //}
       //}
     }
   }
}

void PG_Init(void)
{
   TrigTime = (u16)0x1800;
   PG_FBCount = PGERRCNTMAX;   /* 初始值 */
   PG_Bak   = (u16)0x0FFFF;
   EHeatDlyCnt = 3;            /* 3秒 */
   //PGErrCnt = 0;
   //SetBit(pPGFan,pbPGFan);   /* 关内风机 */
   /* TCCR1A: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 */
   TCCR1A = 0x00;              /* Normal */
   /* TCCR1B: ICNC1 ICES1 - - WGM13 WGM12 CS12 CS11 CS10 */
   TCCR1B = 0x02;              /* 1:8 */
   //TIFR = 0x0FF;
   TIMSK |= (u8)(1 << OCIE1A);
}

/* PG 风机定时: 计时频率:1MHz */
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE1A)
#else
#pragma interrupt_handler PGTIMA_Int:iv_TIMER1_COMPA
void PGTIMA_Int(void)
#endif
{
    if (PG_FBCount < 255) PG_FBCount++;

    if (ValBit(PGFanStatus,fPGCtlBit)){
      /* 风机运行风速 */
      if (ValBit(pPGZero,pbPGZero) || ValBit(pPGZero,pbPGZero)){
        if (ValBit(PGFanStatus,fPGTrig)){
          //if (TrigDlyTime != 0){
          //  TrigDlyTime--;
          //  ClrBit(pPGFan,pbPGFan);
          //} else {
            SetBit(pPGFan,pbPGFan);
          //}
        } else {
          if ((u16)(TCNT1 - TrigStart) >= TrigTime){
            SetBit(PGFanStatus,fPGTrig);
            //TrigDlyTime = 0x02;
            ClrBit(pPGFan,pbPGFan);
          }
        }
      } else {
        ClrBit(PGFanStatus,fPGTrig);    /* PG风机 */
#ifdef TESTPRG
        SetBit(PGFanStatus,fPGZero);    /* 1: 有过零标志 */
#endif
        TrigStart = (u16)(TCNT1);
        SetBit(pPGFan,pbPGFan);         /* 准备触发 */
      }

      if (ValBit(pPGFeed,pbPGFeed) || ValBit(pPGFeed,pbPGFeed)){
        SetBit(PGFanStatus,fPGFeed);
      } else if (ValBit(PGFanStatus,fPGFeed)){
        ClrBit(PGFanStatus,fPGFeed);
        SetBit(PGFanStatus,fPGFeedEn);  /* 允许 PG 反馈 */
        SetBit(PGFanStatus,fPGEnAdjust);

        PG_Bak = PG_Bak2;
        PG_Bak2 = (u16)(TCNT1);
        if (PG_FBCount >= PGERRCNTMAX){
          PG_Bak = (u16)0x0FFFF;
          EHeatDlyCnt = 3;              /* 风机速度没起来之前,关电热 */
        } else {
          PG_Bak = (u16)(PG_Bak2 - PG_Bak);
          PGErrCnt = 0;                 /* 清除故障检测计时 */
        }
        PG_FBCount = 0;
      }
    }

    /* PG 导通脉冲宽度 1mS */
    //if (TrigDlyTime != 0) TrigDlyTime--;

    OCR1A += (u16)256;    /* 0.256mS */
}

#endif  /* EnPGFENGJI */

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

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