三相电缺相保护程序
程序里面检测到一些小问题,现在有些眉目了,现在有个地方没有搞清楚,UA,UB,UC这样叫做正确正序,而UC,UB,UA叫做正确逆序,但是UC,UB,UA的波形其实和UB,UA,UC是一样的,只是有些滞后,靠那些
在A相方波上升沿时,B相为0电平,C相为1电平
在B相方波上升沿时,C相为0电平,A相为1电平
在C相方波上升沿时,A相为0电平,B相为1电平
逆相:
在A相方波上升沿时,B相为1电平,C相为0电平
在B相方波上升沿时,C相为1电平,A相为0电平
在C相方波上升沿时,A相为1电平,B相为0电平
或电平5-4-6-2-3-1-5(正序),5-1-3-2-6-4-5(逆序)的方法是识别不出来的,我在相序继电器上面试验了一下,
UC,UB,UA和UB,UA,UC都被识别为错相,也就是红灯亮一下立刻灭,现在想问到底有没有正确逆序这种提法?
没有人知道或者感兴趣吗?
UC,UB,UA的波形现在相位错相检测这块还是有问题,判断不出来~程序如下,不知道哪里还有问题~判断电平的方法我也试过,也是不行。
bank3 volatile unsigned int R_PhaseStatus=0;
#define b_APhaseExist BIT0
#define b_BPhaseExist BIT1
#define b_CPhaseExist BIT2
#define b_APhaseHappen BIT3
#define b_BPhaseHappen BIT4
#define b_CPhaseHappen BIT5
#define b_PhaseErr BIT6
#define b_PhaseDirection BIT7
bank3 volatile unsigned char R_PhaseBuffer=0b00000111;
bank3 volatile unsigned char R_PhaseDelay[3]={0,0,0};
bank3 volatile unsigned char R_PhaseCnt[3]={0,0,0};
bank3 volatile unsigned char R_PhaseDirectSys=0;
bank3 volatile unsigned char R_PhaseDirectDelay=0;
bank3 volatile unsigned char R_PhaseDirectCnt=0;
void interrupt ISR(void)
{
unsigned char i,tmp;
if((TMR0IF)&&(TMR0IE)) //1ms中断
{
TMR0H=T0RELHI; //
TMR0L=T0RELLO;
F_PhaseEdgeChk();
TMR0IF=0;
}
if((TMR1IF)&&(TMR1IE)) //50ms时钟中断
{
TMR1H=T1RELHI_50MS; //50ms中断
TMR1L=T1RELLO_50MS;
for(i=0;i<3;i++)
{
if (!(R_PhaseStatus&(1<<(i+3)))) //此相没缺相才检测缺相
{
R_PhaseDelay[i]++;
if (R_PhaseDelay[i]>=5) //
{
R_PhaseDelay[i]=0;
R_PhaseStatus|=(1<<(i+3)); //此相缺相
R_PhaseStatus&=~(1<<i);
R_PhaseDirectSys=0; //缺相从头开始检测
R_PhaseDirectDelay=0;
}
}
}
if ((R_PhaseStatus&0x0007)==7) //只有3路都有脉冲才检测错相
{
if (!(R_PhaseStatus&b_PhaseErr)) //没有错相才检测错相
{
R_PhaseDirectDelay++;
if (R_PhaseDirectDelay>=6) //
{
R_PhaseStatus|=b_PhaseErr; //错相发生
R_PhaseDirectSys=0; //错相从头开始检测
R_PhaseDirectDelay=0;
}
}
}
TMR1IF=0;
}
}
const unsigned char T_Phase[3]={0x01,0x40,0x80}; //PC0,PC6,PC7 =〉A,B,C
void F_PhaseEdgeChk(void)
{
unsigned char i=0,tmp,j=0;
for(i=0;i<3;i++)
{
tmp=T_Phase[i];
if (R_PhaseBuffer&(1<<i))
{
if (!(PORTC&tmp)) //下降沿
{
for(j=0;j<10;j++)
if (PORTC&tmp) break; //误动作
if (j>=10) R_PhaseBuffer&=~(1<<i);
}
}
else
{
if (PORTC&tmp) //上升沿
{
for(j=0;j<10;j++)
if (!(PORTC&tmp)) break; //误动作
if (j>=10)
{
R_PhaseBuffer|=(1<<i);
R_PhaseDelay[i]=0;
if (!(R_PhaseStatus&(1<<i)))
{
R_PhaseCnt[i]++;
if (R_PhaseCnt[i]>=3)
{
R_PhaseCnt[i]=0;
R_PhaseStatus|=(1<<i); //有此相脉冲
R_PhaseStatus&=~(1<<(i+3)); //没有此相缺相
}
}
F_PhaseDirectChk(i);
}
}
}
}
}
void F_PhaseDirectChk(unsigned char channel)
{
unsigned char i;
if ((R_PhaseStatus&0x0007)==7) //只有3路都有脉冲才检测错相
{
asm("nop");asm("nop");asm("nop");
switch(R_PhaseDirectSys)
{
case 0:
if ((channel==0)&&(!(PORTC&0x40))&&(PORTC&0x80)) //在A相方波上升沿时,B相为0电平,C相为1电平 正序
R_PhaseDirectSys=1;
else if ((channel==0)&&(PORTC&0x40)&&(!(PORTC&0x80))) //在A相方波上升沿时,B相为1电平,C相为0电平 逆序
R_PhaseDirectSys=4;
break;
case 1:
if ((channel==1)&&(!(PORTC&0x80))&&(PORTC&0x01)) //在B相方波上升沿时,C相为0电平,A相为1电平 正序
R_PhaseDirectSys=2;
else
R_PhaseDirectSys=0;
break;
case 2:
if ((channel==2)&&(!(PORTC&0x01))&&(PORTC&0x40)) //在C相方波上升沿时,A相为0电平,B相为1电平 正序
R_PhaseDirectSys=3;
else
R_PhaseDirectSys=0;
break;
case 3:
case 6:
R_PhaseDirectCnt++;
if (R_PhaseDirectCnt>=3)
{
R_PhaseDirectCnt=0;
R_PhaseStatus&=~b_PhaseErr;
}
if (R_PhaseDirectSys==3)
R_PhaseStatus&=~b_PhaseDirection; //正序
else
R_PhaseStatus|=b_PhaseDirection; //逆序
R_PhaseDirectSys=0;
R_PhaseDirectDelay=0;
break;
case 4:
if ((channel==1)&&(PORTC&0x80)&&(!(PORTC&0x01))) //在B相方波上升沿时,C相为1电平,A相为0电平 逆序
R_PhaseDirectSys=5;
else
R_PhaseDirectSys=0;
break;
case 5:
if ((channel==2)&&(PORTC&0x01)&&(!(PORTC&0x40))) //在C相方波上升沿时,A相为1电平,B相为0电平 逆序
R_PhaseDirectSys=6;
else
R_PhaseDirectSys=0;
break;
default:
break;
}
}
} 其实和UB,UA,UC是相同有些滞后而以,下面是个正确正序的波形
楼主最近还看过