有点像三相检测的部分电路,#define MissingCheckT_C 50 //检查一次缺相的IO消抖时间
#define MissingCheckBufT_C 20 //不是误差的时间
#define MissingKeepMaxT_C 500 //5秒为一个周期,开始查看缺相情况
PhaseLBuf1_B=PhaseL_B;//读取IO状态
if(PhaseLBuf2_B==PhaseLBuf1_B)//状态没有改变
{
if(Phase.MissingPhaseBTime<MissingCheckT_C)Phase.MissingPhaseBTime++;
else
{
Phase.PhaseBState<<=1; //将这个循环读到的状态右移
if(PhaseLBuf1_B) //保存本次的状态
{
Phase.PhaseBState|=0x01;
}
else Phase.PhaseBState&=0xfe;
Phase.MissingPhaseBTime=0;//重新新的计时
}
}
else//状态有改变
{
if(Phase.MissingPhaseBTime<MissingCheckBufT_C)Phase.PhaseBState&=0xfe; //在200ms内有状态做改变,认为是正常的电网丢波,不作为缺相,清掉低位
Phase.MissingPhaseBTime=0;
PhaseLBuf2_B=PhaseLBuf1_B;
}
if(Phase.MissingKeepTime<MissingKeepMaxT_C)Phase.MissingKeepTime++;//一个周期5秒左右
else
{
b=0;
Phase.MissingKeepTime=0;
for(i=0;i<8;i++)//查询8次读取的Io状态
{
if(Phase.PhaseBState&(1<<i))b++;
}
if(b>6)LostPhaseB_F=1; // 检测到6次以上出现高电平,则认为是缺相
else if(b<4)LostPhaseB_F=0;
}
|