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

📄 tq.c

📁 基于AVR的一种程序,智能控制器,可用于低压无功补偿部分,
💻 C
字号:
/*无功投切电容器,6星6角*/
#include "public.h"
#include "p_main.H"

/* LF2407.H 的外部变量 */
/*IO端口B数据和方向控制寄存器*/
extern  unsigned int  *PEDATDIR;
extern  unsigned int  *PFDATDIR;


/***************************************************************************/ 
/**************函数功能:判断ABC三相有无故障状态****************************/
/**guzhang[3] 0:无故障 1:过压 2 欠压 4 谐波超限 8 零序超限 16 超前电压*****/
/***************************************************************************/
  
void Error_State(void)
{
	uint i,j;
	float temp;
	for(i=0;i<3;i++)
	{
		if((up1_data.avr_u[i]/100-5)>SET_U1)guzhang[i]|=1;   
			else guzhang[i]&=0x1e;
		if((up1_data.avr_u[i]+500)<SET_U2)guzhang[i]|=2;
			else guzhang[i]&=0x1d;
		if(up2_data.avr_zxb[i]>SET_THD)guzhang[i]|=4;
			else guzhang[i]&=0x1b;		
		temp=up1_data.avr_u[0]/1000;
		temp*=SET_LX;
		j=temp;
		if(up1_data.avr_u[4]>j)guzhang[i]|=8;
			else guzhang[i]&=0x17;			
		if(q_flag[i]==1)guzhang[i]|=0x10;
			else guzhang[i]&=0x0f;
	}
}


/**************************************************************/ 
/**************函数功能:计算电容的容值************************/
/**cap[12][2]:分别为电容的有无标志和容值***********************/
/**************************************************************/

void C_Cap(void)
{
	uint i;
	for(i=0;i<12;i++)
	cap[i]=0;
	switch(SET_XN)
	{		
		case 1:
			for(i=0;i<3;i++)cap[2*i]=SET_XC;	
				tou_state[0]=0x01;
				tou_state[1]=0x04;			
				tou_state[2]=0x10;
			break;
		case 2:
			if(SET_XBM==0)
				{
					for(i=0;i<6;i++)
						cap[i]=SET_XC;	
				}
				else
					{
						for(i=0;i<3;i++)
							{								
								cap[2*i]=SET_XC;									
								cap[2*i+1]=2*SET_XC;	
							}			
					}			
			tou_state[0]=0x03;
			tou_state[1]=0x0c;			
			tou_state[2]=0x30;
			break;
		default:
			for(i=0;i<6;i++)			 			 		
			 		cap[i]=0;					 
			break;	
	}
	switch(SET_JN)
	{
		case 1:			
			cap[6]=SET_JC;
			tou_state[3]=0x40;
			break;
	  case 2:
	  	if(SET_JBM==0)
	  		{	  			
					cap[6]=SET_JC;					
					cap[7]=SET_JC;
	  		}
	  	else
	  		{	  			
					cap[6]=SET_JC;					
					cap[7]=2*SET_JC;
	  		}
	  	tou_state[3]=0x0c0;
	  	break;
	  case 3:
	  	switch(SET_JBM)
	  	{
	  		case 0:             /*1:1:1:1*/ 
	  			for(i=0;i<3;i++)
	  			{	  				
	  				cap[6+i]=SET_JC;
	  			}
	  			break;
	  		case 1:            /*1:2:2:2*/ 	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=2*SET_JC;
	  			break;
	  		case 2:          /*1:2:3:3*/	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=3*SET_JC;
	  			break;
	  		default:         /*1:2:4:4*/		  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;
	  			break;	  		
	  	}
	  	tou_state[3]=0x01c0;
	  	break;
	  case 4:
	  	switch(SET_JBM)
	  	{
	  		case 0:             /*1:1:1:1*/ 
	  			for(i=0;i<4;i++)
	  			{	  				
	  				cap[6+i]=SET_JC;
	  			}
	  			break;
	  		case 1:            /*1:2:2:2*/ 	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=2*SET_JC;	  			
	  			cap[9]=2*SET_JC;
	  			break;
	  		case 2:          /*1:2:3:3*/	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=3*SET_JC;					
	  			cap[9]=3*SET_JC;
	  			break;
	  		case 3:         /*1:2:4:4*/		  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[9]=4*SET_JC;
	  			break;	  		
	  		default:	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[9]=8*SET_JC;
	  	}
	  	tou_state[3]=0x03c0;
	  	break;
	  case 5:
	  	switch(SET_JBM)
	  	{
	  		case 0:             /*1:1:1:1*/ 
	  			for(i=0;i<5;i++)
	  			{	  				
	  				cap[6+i]=SET_JC;
	  			}
	  			break;
	  		case 1:            /*1:2:2:2*/ 	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=2*SET_JC;	  			
	  			cap[9]=2*SET_JC;	  			
	  			cap[10]=2*SET_JC;
	  			break;
	  		case 2:          /*1:2:3:3*/	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=3*SET_JC;					
	  			cap[9]=3*SET_JC;	  			
	  			cap[10]=3*SET_JC;
	  			break;
	  		case 3:         /*1:2:4:4*/		  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[9]=4*SET_JC;	  			
	  			cap[10]=4*SET_JC;
	  			break;	  		
	  		default:	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[9]=8*SET_JC;	  			
	  			cap[10]=8*SET_JC;
	  	}
	  	tou_state[3]=0x7c0;
	  	break;	  	
	case 6:
	  	switch(SET_JBM)
	  	{
	  		case 0:             /*1:1:1:1*/ 
	  			for(i=0;i<6;i++)
	  			{	  				
	  				cap[6+i]=SET_JC;
	  			}
	  			break;
	  		case 1:            /*1:2:2:2*/ 	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=2*SET_JC;	  			
	  			cap[9]=2*SET_JC;	  			
	  			cap[10]=2*SET_JC;	  			
	  			cap[11]=2*SET_JC;
	  			break;
	  		case 2:          /*1:2:3:3*/	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=3*SET_JC;					
	  			cap[9]=3*SET_JC;	  			
	  			cap[10]=3*SET_JC;	  			
	  			cap[11]=3*SET_JC;
	  			break;
	  		case 3:         /*1:2:4:4*/		  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[9]=4*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[10]=4*SET_JC;	  			
	  			cap[11]=4*SET_JC;
	  			break;	  		
	  		default:	  			
	  			cap[6]=SET_JC;	  			
	  		  cap[7]=2*SET_JC;	  			
	  			cap[8]=4*SET_JC;	  		  
	  			cap[9]=8*SET_JC;	  			
	  			cap[10]=8*SET_JC;	  			
	  			cap[11]=8*SET_JC;
	  	}
	  	tou_state[3]=0x0fc0;
	  	break;	  	  	
	}	
}

/****************************************************************/
/*******函数功能:投切完标志*************************************/
/*******t_over[4]为投完标志,q_over[4]为切完标志*****************/
/*******tou_state[4]为投完电容状态*******************************/
/****************************************************************/
void C_Over(void)
{
	uint i,j,temp=0;
	uint cap_s;
	cap_s=up1_data.c_status&0x0fc0;
	if(cap_s==tou_state[3]){t_over[3]=1;q_over[3]=0;} /*三角形电容投完标志*/
		else t_over[3]=0;
	cap_s&=tou_state[3];
	if(cap_s==0){q_over[3]=1;t_over[3]=0;qie_flag[3]=0;}	          /*三角形电容切完标志*/
		else q_over[3]=0;
	
	cap_s=up1_data.c_status&0x3f;
	cap_s=up1_data.c_status&0x03;
	if(cap_s==tou_state[0]){t_over[0]=1;q_over[0]=0;} /*A相电容投完标志*/
		else t_over[0]=0;
	cap_s&=tou_state[0];
	if(cap_s==0){q_over[0]=1;t_over[0]=0;qie_flag[0]=0;}            /*A相电容切完标志*/
		else q_over[0]=0;
		
	cap_s=up1_data.c_status&0x0c;
	if(cap_s==tou_state[1]){t_over[1]=1;q_over[1]=0;} /*B相电容投完标志*/
		else t_over[1]=0;
	cap_s&=tou_state[1];
	if(cap_s==0){q_over[1]=1;t_over[1]=0;qie_flag[1]=0;}            /*B相电容切完标志*/
		else q_over[1]=0;
			
	cap_s=up1_data.c_status&0x30;
	if(cap_s==tou_state[2]){t_over[2]=1;q_over[2]=0;} /*C相电容投完标志*/
		else t_over[2]=0;
	cap_s&=tou_state[2];
	if(cap_s==0){q_over[2]=1;t_over[2]=0;qie_flag[2]=0;}            /*C相电容切完标志*/	
		else q_over[2]=0;
			
	for(i=0;i<4;i++)
	{
		if(t_over[i]==1)tou_flag[i]=0;
	}
	for(i=0;i<4;i++)
	{
		if(q_over[i]==1)qie_flag[i]=0;
	}
}

/****************************************************************/
/*******函数功能:电容投入出口动作*************************** *******/
/****************************************************************/
void Kai_Chu(void)
{
	uint i,temp;
	if(dongzuo[3]==1)
		{
			switch(t_count[3])
			{
				case 6:
					*PEDATDIR=*PEDATDIR|0X40;
					up1_data.c_status|=0x40;
					break;
				case 7:
					*PEDATDIR=*PEDATDIR|0X80;
					up1_data.c_status|=0x80;
					break;
				case 8:
					*PFDATDIR=*PFDATDIR|0X01;
					up1_data.c_status|=0x100;
					break;
				case 9:
					*PFDATDIR=*PFDATDIR|0X02;
					up1_data.c_status|=0x200;
					break;
				case 10:
					*PFDATDIR=*PFDATDIR|0X04;
					up1_data.c_status|=0x400;
					break;
				case 11:
					*PFDATDIR=*PFDATDIR|0X08;
					up1_data.c_status|=0x800;
					break;
				default:break;					
			}
			t_count[3]++;
			if((t_count[3]-6)>=SET_JN)t_count[3]=6;
			temp=up4_data.tj_shuju[137]+up4_data.tj_shuju[138]*256;
			tou_flag[3]=0;
			if(temp>1000)temp=0;
			temp+=1;                 /*动作次数加一*/
			up4_data.tj_shuju[137]=IntToLsb(temp);
			up4_data.tj_shuju[138]=IntToMsb(temp);			
		}
	if(dongzuo[0]==1)
		{
			switch(t_count[0])
			{
				case 0:
					*PEDATDIR=*PEDATDIR|0X01;
					up1_data.c_status|=0x01;
					break;
				case 1:
					*PEDATDIR=*PEDATDIR|0X02;
					up1_data.c_status|=0x02;
					break;
				default:break;					
			}
		t_count[0]++;
		if(t_count[0]>=SET_XN)t_count[0]=0;
		dongzuo[0]=0;
		tou_flag[0]=0;
		temp=up4_data.tj_shuju[131]+up4_data.tj_shuju[132]*256;
			if(temp>1000)temp=0;
			temp+=1;                 /*动作次数加一*/
			up4_data.tj_shuju[131]=IntToLsb(temp);
			up4_data.tj_shuju[132]=IntToMsb(temp);			
		}
	if(dongzuo[1]==1)
		{
			switch(t_count[1])
			{
				case 2:
					*PEDATDIR=*PEDATDIR|0X04;
					up1_data.c_status|=0x04;
					break;
				case 3:
					*PEDATDIR=*PEDATDIR|0X08;
					up1_data.c_status|=0x08;
					break;
				default:break;					
			}
		t_count[1]++;
		if((t_count[1]-2)>=SET_XN)t_count[1]=2;
		dongzuo[1]=0;
		tou_flag[1]=0;
		temp=up4_data.tj_shuju[133]+up4_data.tj_shuju[134]*256;
			if(temp>1000)temp=0;
			temp+=1;                 /*动作次数加一*/
			up4_data.tj_shuju[133]=IntToLsb(temp);
			up4_data.tj_shuju[134]=IntToMsb(temp);			
		}
	if(dongzuo[2]==1)
		{
			switch(t_count[2])
			{
				case 4:
					*PFDATDIR=*PFDATDIR|0X01;
					up1_data.c_status|=0x10;
					break;
				case 5:
					*PFDATDIR=*PFDATDIR|0X02;
					up1_data.c_status|=0x20;
					break;
				default:break;					
			}	
		t_count[2]++;
		if((t_count[2]-4)>=SET_XN)
		t_count[2]=4;
		dongzuo[2]=0;
		tou_flag[2]=0;
		temp=up4_data.tj_shuju[135]+up4_data.tj_shuju[136]*256;
			if(temp>1000)temp=0;
			temp+=1;                 /*动作次数加一*/
			up4_data.tj_shuju[135]=IntToLsb(temp);
			up4_data.tj_shuju[136]=IntToMsb(temp);			
		}		
}

/****************************************************************/
/*******函数功能:电容切除出口动作*************************** *******/
/****************************************************************/
void Kai_Ru(void)
{
	uint i;
	if(dzuo_q[3]==1)
		{
			switch(q_count[3])
			{
				case 6:
					*PEDATDIR=*PEDATDIR&0X0ffbf;
					up1_data.c_status&=0x0ffbf;
					break;
				case 7:
					*PEDATDIR=*PEDATDIR&0X0ff7f;
					up1_data.c_status&=0x0ff7f;
					break;
				case 8:
					*PFDATDIR=*PFDATDIR&0X0fffe;
					up1_data.c_status&=0x0feff;
					break;
				case 9:
					*PFDATDIR=*PFDATDIR&0X0fffd;
					up1_data.c_status&=0x0fdff;
					break;
				case 10:
					*PFDATDIR=*PFDATDIR&0X0fffb;
					up1_data.c_status&=0x0fbff;
					break;
				case 11:
					*PFDATDIR=*PFDATDIR&0X0fff7;
					up1_data.c_status&=0x0f7ff;
					break;
				default:break;					
			}
			q_count[3]++;
			if((q_count[3]-6)>=SET_JN)q_count[3]=6;
			qie_flag[3]=0;
			/*动作次数加一*/
		}
	if(dzuo_q[0]==1)
		{
			switch(q_count[0])
			{
				case 0:
					*PEDATDIR=*PEDATDIR&0X0fffe;
					up1_data.c_status&=0x0fffe;
					break;
				case 1:
					*PEDATDIR=*PEDATDIR&0X0fffd;
					up1_data.c_status&=0x0fffd;
					break;
				default:break;					
			}
		q_count[0]++;
		if(q_count[0]>=SET_XN)q_count[0]=0;
		dzuo_q[0]=0;
		qie_flag[0]=0;
		}
	if(dzuo_q[1]==1)
		{
			switch(q_count[1])
			{
				case 2:
					*PEDATDIR=*PEDATDIR&0X0fffb;
					up1_data.c_status&=0x0fffb;
					break;
				case 3:
					*PEDATDIR=*PEDATDIR&0X0fff7;
					up1_data.c_status&=0x0fff7;
					break;
				default:break;					
			}
		q_count[1]++;
		if((q_count[1]-2)>=SET_XN)q_count[1]=2;
		dzuo_q[1]=0;
		qie_flag[1]=0;
		}
	if(dzuo_q[2]==1)
		{
			switch(q_count[2])
			{
				case 4:
					*PFDATDIR=*PFDATDIR&0X0fffe;
					up1_data.c_status&=0x0ffef;
					break;
				case 5:
					*PFDATDIR=*PFDATDIR&0X0fffd;
					up1_data.c_status&=0x0ffdf;
					break;
				default:break;					
			}	
		q_count[2]++;
		if((q_count[2]-4)>=SET_XN)q_count[2]=4;
		dzuo_q[2]=0;
		qie_flag[2]=0;
		}		
}


/****************************************************************/
/*******函数功能:无功投切,1:1:1:1为循环投切,另外: *******/
/****************************************************************/

void Tq(void)
{
	uint i,us;
	Error_State();	
	C_Over();	
	if(guzhang[0]==0||guzhang[1]==0||guzhang[2]==0)  /*投三相电容和分相电容*/
		{
			if(t_over[3]==0)
				{
					us=t_count[3];
					if(up1_data.avr_q[0]>cap[us]&&up1_data.avr_q[1]>cap[us]&&up1_data.avr_q[2]>cap[us])
						{
							if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;}
						}						
						else tou_flag[3]=0;						
					if(dongzuo[3]==1){Kai_Chu();dongzuo[3]=0;tou_flag[3]=0;/*出口*/}
				}
				else
					{
						for(i=0;i<3;i++)
						{
							if(t_over[i]==0)
								{
									us=t_count[i];
									if(up1_data.avr_q[i]>cap[us])
										{
											if(tou_flag[i]==0){tou_flag[i]=1;tq_time[i]=0;}
										}									    
										else tou_flag[i]=0;									
								}							
						}
						if(dongzuo[0]==1||dongzuo[1]==1||dongzuo[2]==1){Kai_Chu();tou_flag[i]=0;/*出口*/}		
					}
		}
		else						/*切三相电容和分相电容,缺相速切,剩下按延时切电容*/ 
			{
				if(guzhang[0]==2||guzhang[1]==2||guzhang[2]==2)
					{
						/*判缺相否,是则速切*/
					}
				if(guzhang[0]!=0&&guzhang[1]!=0&&guzhang[2]!=0)
					{
						if(q_over[3]==0)
							{
								if(qie_flag[3]==0){qie_flag[3]=1;tq_time[3]=0;}								
								if(dzuo_q[3]==1){Kai_Ru();dzuo_q[3]=0;qie_flag[3]=0;}																
							}													
					  else
						{
							for(i=0;i<3;i++)
							{
								if(guzhang[i]!=0&&q_over[i]==0)
									{
										if(qie_flag[i]==0){qie_flag[i]=1;tq_time[i]=0;}										
									}										
							}
							if(dzuo_q[0]==1||dzuo_q[1]==1||dzuo_q[2]==1){Kai_Ru();qie_flag[i]=0;}																		
						}
					}
			}	
}



⌨️ 快捷键说明

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