📄 fan.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 + -