三相电缺相保护程序 点击:261 | 回复:2



PLC酷客

    
  • [版主]
  • 精华:9帖
  • 求助:31帖
  • 帖子:1460帖 | 7990回
  • 年度积分:457
  • 历史总积分:59176
  • 注册:2004年7月13日
发表于:2013-12-07 14:09:51
楼主

三相电缺相保护程序


程序里面检测到一些小问题,现在有些眉目了,现在有个地方没有搞清楚,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是相同有些滞后而以,下面是个正确正序的波形



楼主最近还看过



chenl123a

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 620回
  • 年度积分:0
  • 历史总积分:319
  • 注册:2010年1月09日
发表于:2013-12-08 01:46:07
1楼

楼主用的什么语言编程?难道是C语言?

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 455回
  • 年度积分:0
  • 历史总积分:1000
  • 注册:2008年1月09日
发表于:2013-12-08 21:53:35
2楼

买个相序保护继电器是不是可以啊?


热门招聘
相关主题

官方公众号

智造工程师