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

📄 fan.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : 简易风盘控制器
COMPILER : AVR ICC for m48
MODULE   : fan.c
VERSION  : 1.0.0
DATE     : 2005/12/12
AUTHOR   : 朱坤

MODIFICATIONS :

******************************************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include "lib.h"
#include "version.h"

#include "ports.h"
#include "main.h"
#include "adc.h"
#include "timer.h"
#include "lcd.h"
#include "fan.h"

#ifndef UGPIO
u8 FanStatus;        /* 风机模式 */
#endif
u8 ClrHotCnt;        /* 吹余热计时(2分钟)       */
u8 AutoCnt;          /* 自动模式检测延时 20s    */
u8 AutoAckTm;        /* 模式确认延时 3s On 20mS */

#ifdef ChigoXG2
u8 ZhiReFJTm;        /* 制热时,内机达到设定温度停机后,延时30秒停内风机*/
#endif

#ifdef EnPGFENGJI
u16 TrigTime;        /* 触发时间 */
u16 PG_Bak;          /* 反馈时间 */
u16 PG_Bak2;
u8  PGFanStatus;     /*  */
u8  EHeatDlyCnt;     /* PG 风机启动延时 */
u16 TrigStart;       /* 过零时间 */
u8  PG_FBCount;
u8  PGErrCnt;        /* PG 风机错误检测计时 */
/*****************************************************************************/
const u16 Tab_PGNFB[]={0x186C,
                       0x14DC, /* L:5.340mS */
                       0x1234, /* M:4.660mS */
                       0x0974, /* H:2.420mS */
                       0x186C,
                       0x186C, /* E:6.250mS P:1.420mS */
                       0x186C,
                       0x058C};
/*-----------------------------------------------------------------------------
; 序号  高风    R52     中风    R40     低风    R48
; 0 27  1330    1.2K    1250    1.2K    1100    1.2K
; 1 58  1280    3K      1200    3K      1050    3K
; 2 86  1230    5.1K    1150    5.1K    1000    5.1K
; 3 114 1180    8.2K    1100    8.2K    950     8.2K
; 4 139 1130    12K     1050    12K     900     12K
; 5 170 1080    20K     1000    20K     850     20K
; 6 199 1030    36K     950     36K     800     36K
; 7 227 980     82K     900     82K     750     82K
-----------------------------------------------------------------------------*/
#if 0
const u16 Tab_PGSpeedH[]={ 0x3ABD,  /* 0 1330r/m 15037(3ABD) 缺省 */
                           0x3D09,  /* 1 1280r/m 15625(3D07) */
                           0x3F84,  /* 2 1230r/m 16260(3F84) */
                           0x4235,  /* 3 1180r/m 16949(4235) */
                           0x4523,  /* 4 1130r/m 17699(4523) */
                           0x4856,  /* 5 1080r/m 18518(4856) */
                           0x4BD9,  /* 6 1030r/m 19417(4BD9) */
                           0x4FB8}; /* 7 0980r/m 20408(4FB8) */
const u16 Tab_PGSpeedM[]={ 0x3E80,  /* 0 1250r/m 16000(3E80) 缺省 */
                           0x411A,  /* 1 1200r/m 16666(411A) */
                           0x43EF,  /* 2 1150r/m 17391(43EF) */
                           0x4706,  /* 3 1100r/m 18182(4706) */
                           0x4A68,  /* 4 1050r/m 19048(4A68) */
                           0x4E20,  /* 5 1000r/m 20000(4E20) */
                           0x523D,  /* 6 0950r/m 21053(523D) */
                           0x56CE}; /* 7 0900r/m 22222(56CE) */
const u16 Tab_PGSpeedL[]={ 0x4706,  /* 0 1100r/m 18182(4706) 缺省 */
                           0x4A68,  /* 1 1050r/m 19048(4A68) */
                           0x4E20,  /* 2 1000r/m 20000(4E20) */
                           0x523D,  /* 3 0950r/m 21053(523D) */
                           0x56CE,  /* 4 0900r/m 22222(56CE) */
                           0x5BE9,  /* 5 0850r/m 23529(5BE9) */
                           0x61A8,  /* 6 0800r/m 25000(61A8) */
                           0x682B}; /* 7 0750r/m 26667(682B) */
#endif
/*---------------------------------------------------------------------------*/
const u16 Tab_PGSpeed[]={  0x523D,  /* A 0950r/m 21053(523D) */
                           0x523D,  /* L 0950r/m 21053(523D) */
                           0x4914,  /* M 1070r/m 18691(4904) */
                           0x42E6,  /* H 1170r/m 17094(42C6) */
                           0x523D,  //0x5BE6,  /* E 0850r/m 23529(5BE9) */
                           0x523D,  //0x5BE6,  /* E 0850r/m 23529(5BE9) */
                           0x3EB0,  /* P 1250r/m 16000(3E80) */
                           0x3EB0}; /* P 1250r/m 16000(3E80) */
#endif  /* EnPGFENGJI */

void WorkStu_Sub(void)
{
   BOOLEAN f;

   //if (ValBit(OutDevStu,fOutDeforst)){ /* 化霜 */
   //  DefstCnt = 0x0B4;    /* 化霜期间及化霜后3分钟内不检测传感器故障 */
   //}

//#ifdef LEDDISP
//   if (ValBit(OutDevStu,fRunEnable)){
//     DispDlyCnt = 0;                 /* 模式确认延时 */
//   }
//#endif

   if (Errorflg != 0){
     ClrHotCnt = 0;                  /* 故障关机不吹余热 */
     ClrBit(RunMode,fSysOn);         /* 故障关机 */
     SetBit(RunMode,fErrSt);
   } else {
     ClrBit(RunMode,fErrSt);         /* 清除故障关机 */
   }

   if (RunMode == (u8)((1<<fSysOn)|(1<<fSysOnOff)|MODEAUTO)){
     /* 自动模式 */
     ClrHotCnt = 0;                  /* 吹余热计时(2分钟) */
#ifdef ChigoXG2
     ZhiReFJTm = 0;
#endif
     FanSet(FANEC | (1<<fFanCtrlBit));
     if (!ValBit(Sysflag,fMAuto)) {
       SetBit(Sysflag,fMAuto);
       AutoCnt = AUTOCNTSET;         /* 20s */
     } else if (AutoCnt == 0){
       AutoAckTm = AUTOACKSET;       /* 模式确认延时 3s On 20mS */
       if (AmbientTp >= AUTOCOOL){
         RunMode = (u8)( (RunMode & ~MODEMASK)|MODECOOL);
       } else if (AmbientTp <= AUTOHEAT){
         RunMode = (u8)((RunMode & ~MODEMASK)|MODEHEAT);
       } else {
         RunMode = (u8)((RunMode & ~MODEMASK)|MODEDRY);
       }
     }
   } else if (RunMode == (u8)((1<<fSysOn)|(1<<fSysOnOff)|MODEFAN)){
     /* 通风模式 */
     ClrHotCnt = 0;                        /* 吹余热计时 */
#ifdef ChigoXG2
     ZhiReFJTm = 0;
#endif
#if (NJTYPE == 0)
     Fan_Setup(AmbientTp,SetupTp);         /* 设定风 */
#else
     Fan_Setup((u8)(AmbientTp-2),SetupTp); /* 设定风 */
#endif
   } else {
     f = (BOOLEAN)((AutoAckTm != 0) || ValBit(OutDevStu,fRunEnable));
     if (RunMode == (u8)((1<<fSysOn)|(1<<fSysOnOff)|MODEHEAT)){
       /* 制热模式 */
#ifdef ChigoXG3
       ClrHotCnt = 0x1E;   /* 吹余热计时(2分钟) */
#else
       ClrHotCnt = 0x78;   /* 吹余热计时(2分钟) */
#endif
#ifdef ChigoXG2
       if (ValBit(Sysflag,fPower)){  /* 压缩机开机标志 */
         ZhiReFJTm = 30;             /* 制热温度到达设定温度,30秒后停内风机 */
       }
       if (ZhiReFJTm == 0){
         ClrBit(FanStatus,fFanCtrlBit);
       } else {
#endif
         if (f){           /* 外机允许时 */
#if (NJTYPE == 0)
           Fan_Setup(SetupTp,TempOffset);         /* 设定风 */
#else
           Fan_Setup((u8)(SetupTp-2),TempOffset); /* 设定风 */
#endif
         }
#ifdef ChigoXG2
       }
#endif
     } else if (RunMode == (u8)((1<<fSysOn)|(1<<fSysOnOff)|MODECOOL)){
       /* 制冷模式 */
#ifdef ChigoXG2
       ZhiReFJTm = 0;
#endif
#ifdef ChigoXG3
       ClrHotCnt = 0x1E;   /* 吹余热计时(2分钟) */
#else
       ClrHotCnt = 0;      /* 吹余热计时(2分钟) */
#endif
       if (f){             /* 外机允许时 */
#if (NJTYPE == 0)
         Fan_Setup(AmbientTp,SetupTp);         /* 设定风 */
#else
         Fan_Setup((u8)(AmbientTp-2),SetupTp); /* 设定风 */
#endif
       }
     } else if (RunMode == (u8)((1<<fSysOn)|(1<<fSysOnOff)|MODEDRY)){
       /* 除湿模式 */
#ifdef ChigoXG2
       ZhiReFJTm = 0;
#endif
#ifdef ChigoXG3
       ClrHotCnt = 0x1E;   /* 吹余热计时(2分钟) */
#else
       ClrHotCnt = 0;      /* 吹余热计时(2分钟) */
#endif
       if (f){             /* 外机允许时 */
         FanSet(FANLO|(1<<fFanCtrlBit));  /* 低风 */
       }
     } else {
       /* 关机时清除自动检测到的模式 */
       ClrAutoMode();
       /* 吹余热计时(2分钟)到或内盘管温度<41℃, 关内风机,否则,低风*/
       if ((ClrHotCnt == 0)             /* 吹余热计时(2分钟) */
          ||(!ValBit(FanStatus,fFanCtrlBit))){
         ClrBit(FanStatus,fFanCtrlBit); /* 1:内风机运行标志 */
       } else {
         FanSet(FANLO|(1 << fFanCtrlBit));
       }
     }
   }
}

void Fan_Setup(u8 tr, u8 ts)
{
  if ((u8)(FanStatus & FANMASK_S) != FANAUTO_S){
    FanSet((FanStatus << 4)|(1 << fFanCtrlBit));
  } else {             /* 自动风 */
    if (/*ValBit(Sysflag,fContinue)||*/(tr > (u8)(ts + 2))){
      FanSet(FANHI|(1 << fFanCtrlBit));
    } else if (tr < ts) {
      FanSet(FANLO|(1 << fFanCtrlBit));
    } else if (tr == ts){
      if ((FanStatus & FANMASK) != FANLO){
        FanSet( FANMI| (1 << fFanCtrlBit));
      }
    } else if (tr == (u8)(ts + 1)){
      FanSet(FANMI|(1 << fFanCtrlBit));
    } else /*if (tr == (u8)(ts + 2))*/{
      if ((FanStatus & FANMASK) != FANHI){
        FanSet(FANMI|(1 << fFanCtrlBit));
      }
    //} else {
    //  FanSet(FANHI|(1<<fFanCtrlBit));
    }
  }
}

void FanSet(u8 FanSp)
{
  FanStatus = (u8)((FanStatus & ~FANMASK)| FanSp);
}

void FanCont_Sub(void)
{
#ifndef EnPGFENGJI
   if ((!ValBit(FanStatus,fFanCtrlBit)) || /* 1:内风机运行标志   */
       (ValBit(OutDevStu,fOutDeforst))  || /* 1: 化霜 */
#ifdef ChigoXG2
       ((!ValBit(Sysflag,fPower)) && (ZhiReFJTm == 0))||
#else
       (!ValBit(Sysflag,fPower))||
#endif
       ((u8)(FanStatus & FANMASK) == FANAUTO)){
     ClrLoFan();
     ClrMiFan();
     ClrHiFan();              /* 关内风机 */
   } else if (((u8)(FanStatus & FANMASK) == FANLO) ||
              ((u8)(FanStatus & FANMASK) == FANEC)){
     ClrMiFan();
     ClrHiFan();              /* 低风 */
     SetLoFan();
   } else if ((u8)(FanStatus & FANMASK) == FANMI){
     ClrLoFan();
     ClrHiFan();              /* 中风 */
     SetMiFan();
   } else {
     ClrLoFan();
     ClrMiFan();
     SetHiFan();              /* 高风 */
   }
}
#else  /* EnPGFENGJI */
   if ((!ValBit(FanStatus,fFanCtrlBit)) || /* 1:内风机运行标志   */
       (ValBit(OutDevStu,fOutDeforst))  || /* 1: 化霜 */
#ifdef ChigoXG2
       ((!ValBit(Sysflag,fPower)) && (ZhiReFJTm == 0))||
#else
       (!ValBit(Sysflag,fPower))||
#endif
       ((u8)(FanStatus & FANMASK) == FANAUTO)){
     PGFanOff();                         /* 关内风机 */
     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)] + 0x40)){
             if (TrigTime > 0x320) TrigTime -= 0x20;
           } else if (PG_Bak < (u16)(Tab_PGSpeed[(u8)((FanStatus & FANMASK) >> 4)] - 0x40)){
             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;
   //PG_BakArr[0] = (u16)0x0FFFF;
   //PG_BakArr[1] = (u16)0x0FFFF;
   //PG_BakArr[2] = (u16)0x0FFFF;
   EHeatDlyCnt = 3;            /* 3秒 */
   //PGErrCnt = 0;
   //PGFanOff();               /* 关内风机 */
}
#endif  /* EnPGFENGJI */

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

⌨️ 快捷键说明

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