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

📄 ctq.c

📁 基于AVR的一种程序,智能控制器,可用于低压无功补偿部分,
💻 C
📖 第 1 页 / 共 2 页
字号:
/*无功投切电容器,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)>(SET_U1+5))guzhang[i]|=1;   
			else guzhang[i]&=0x1e;
		if((up1_data.avr_u[i]/100)<(SET_U2-5))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_i[3]*3000/(up1_data.avr_i[0]+up1_data.avr_i[1]+up1_data.avr_i[2]);		
		j=temp;
		if(j>SET_LX)guzhang[i]|=8;
			else guzhang[i]&=0x17;				
				
	}
	
	if(up1_data.avr_u[0]/100>(SET_U1+5))err_state|=0x01;     /*A相过压*/
		else err_state&=0x0fffe;
	if(up1_data.avr_u[1]/100>(SET_U1+5))err_state|=0x02;     /*B相过压*/
		else err_state&=0x0fffd;
  if(up1_data.avr_u[2]/100>(SET_U1+5))err_state|=0x04;     /*C相过压*/
		else err_state&=0x0fffb;			
			
	if(up1_data.avr_u[0]/100<(SET_U2-5))err_state|=0x08;     /*A相欠压*/
		else err_state&=0x0fff7;
	if(up1_data.avr_u[1]/100<(SET_U2-5))err_state|=0x010;     /*B相欠压*/
		else err_state&=0x0ffef;
  if(up1_data.avr_u[2]/100<(SET_U2-5))err_state|=0x020;     /*C相欠压*/
		else err_state&=0x0ffdf;
	
	j=up1_data.avr_i[3]*1000/up1_data.avr_i[0];
						
	if(j>SET_LX)err_state|=0x040;                             /*零序超限*/
		else err_state&=0x0ffbf;
	
	if(up1_data.avr_u[0]/100<50)err_state|=0x080;     /*A相缺相*/
		else err_state&=0x0ff7f;
	if(up1_data.avr_u[1]/100<50)err_state|=0x0100;     /*B相缺相*/
		else err_state&=0x0feff;
  if(up1_data.avr_u[2]/100<50)err_state|=0x0200;     /*C相缺相*/
		else err_state&=0x0fdff;		
	
	if(up2_data.avr_zxb[0]>(SET_THD+5))err_state|=0x0400;
			else err_state&=0x0fbff;
	if(up2_data.avr_zxb[1]>(SET_THD+5))err_state|=0x0800;
			else err_state&=0x0f7ff;			
	if(up2_data.avr_zxb[2]>(SET_THD+5))err_state|=0x1000;
			else err_state&=0x0efff;		
	
}


/**************************************************************/ 
/**************函数功能:计算电容的容值************************/
/**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;
	}
}

/***********************************************************************/
/*********************函数功能:ABC三相都滞后,是否投电容***************/
/***********************************************************************/
void Behand_Abc(void)
{
	uint num,c_temp;
	group=0;
	num=t_count[3];	
	c_temp=cap[num]/3+SET_K1;	
	if(up1_data.avr_q[0]>c_temp&&up1_data.avr_q[1]>c_temp&&up1_data.avr_q[2]>c_temp)
		{
			if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;}
		}
		else {tou_flag[3]=0;tq_time[3]=0;}			
}

/***********************************************************************/
/***************函数功能:A相超前、BC三相都滞后,是否投电容*************/
/***********************************************************************/
void Before_A(void)
{
	uint num,c_temp;
	uint a_status;
	num=t_count[3];
	c_temp=cap[num]/3+SET_K1;
	a_status=up1_data.c_status;
	if((a_status&0x01)==1)       /*第一路电容已经投入*/
		{			
			if(up1_data.avr_q[0]>(cap[0]+c_temp)&&up1_data.avr_q[1]>c_temp&&up1_data.avr_q[2]>c_temp)
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=1;}
				}
				else {tou_flag[3]=0;tq_time[3]=0;}					
		}
	else if((a_status&0x02)==1)      /*第二路电容已经投入*/
		{
			if(up1_data.avr_q[0]>(cap[1]+c_temp)&&up1_data.avr_q[1]>c_temp&&up1_data.avr_q[2]>c_temp)
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=2;}						
				}
				else {tou_flag[3]=0;tq_time[3]=0;}
		}		
}

/***********************************************************************/
/***************函数功能:B相超前、AC三相都滞后,是否投电容*************/
/***********************************************************************/
void Before_B(void)
{
	uint num,c_temp;
	uint a_status;
	num=t_count[3];
	c_temp=cap[num]/3+SET_K1;
	a_status=up1_data.c_status;
	if((a_status&0x04)==1)       /*第三路电容已经投入*/
		{			
			if(up1_data.avr_q[0]>c_temp&&up1_data.avr_q[1]>(cap[0]+c_temp)&&up1_data.avr_q[2]>c_temp)
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=3;}
				}
				else {tou_flag[3]=0;tq_time[3]=0;}					
		}
	else if((a_status&0x08)==1)      /*第四路电容已经投入*/
		{
			if(up1_data.avr_q[0]>c_temp&&up1_data.avr_q[1]>(cap[1]+c_temp)&&up1_data.avr_q[2]>c_temp)
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=4;}						
				}
				else {tou_flag[3]=0;tq_time[3]=0;}
		}			
}

/***********************************************************************/
/***************函数功能:C相超前、AB三相都滞后,是否投电容*************/
/***********************************************************************/
void Before_C(void)
{
	uint num,c_temp;
	uint a_status;
	num=t_count[3];
	c_temp=cap[num]/3+SET_K1;
	a_status=up1_data.c_status;
	if((a_status&0x10)==1)       /*第三路电容已经投入*/
		{			
			if(up1_data.avr_q[0]>c_temp&&up1_data.avr_q[1]>c_temp&&up1_data.avr_q[2]>(cap[0]+c_temp))
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=5;}
				}
				else {tou_flag[3]=0;tq_time[3]=0;}					
		}
	else if((a_status&0x20)==1)      /*第四路电容已经投入*/
		{
			if(up1_data.avr_q[0]>c_temp&&up1_data.avr_q[1]>c_temp&&up1_data.avr_q[2]>(cap[1]+c_temp))
				{
					if(tou_flag[3]==0){tou_flag[3]=1;tq_time[3]=0;group=6;}						
				}
				else {tou_flag[3]=0;tq_time[3]=0;}
		}			
}

⌨️ 快捷键说明

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