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

📄 clcom.c

📁 2407DSP开发应用程序实例(有14个常用模块程序)
💻 C
字号:
/************************************************************************************** 
**函数名: CLCOM.C
** 功能描述:根据32点采样值计算计算电压、电流有效值;有功功率、无功功率、实在功率和功率因素
** 作 者:李纯
** 日 期:2004年2月27日
*************************************************************************************/
 /*****************************************************************
** 函数名: Youxiaozhi()
** 功能描述:根据32点采样值计算测量电压、电流有效值
** 作 者:李纯
** 日 期:2004年2月25日(已完成)
****************************************************************/
void Youxiaozhi()
{	unsigned int	j;
	unsigned long	data,b0,b1,b2,b3;


	b0=0;							// 求Ua  (Uab)的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	b0=b0+(ADUa[j]-0x01FF)*(ADUa[j]-0x01FF);
		b1=b1+(ADUa[j+8]-0x01FF)*(ADUa[j+8]-0x01FF);
		b2=b2+(ADUa[j+16]-0x01FF)*(ADUa[j+16]-0x01FF);
		b3=b3+(ADUa[j+24]-0x01FF)*(ADUa[j+24]-0x01FF);
	}
	data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
	data=qsqrt(data);
	UaAv=(unsigned int)((data*Uaxzh)>>4);		
	
	
	b0=0;							// 求Ub  (Ubc)的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	b0=b0+(ADUb[j]-0x01FF)*(ADUb[j]-0x01FF);
		b1=b1+(ADUb[j+8]-0x01FF)*(ADUb[j+8]-0x01FF);
		b2=b2+(ADUb[j+16]-0x01FF)*(ADUb[j+16]-0x01FF);
		b3=b3+(ADUb[j+24]-0x01FF)*(ADUb[j+24]-0x01FF);
	}
	data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;
	data=qsqrt(data);
	UbAv=(unsigned int)((data*Ubxzh)>>4);		
	
		
	b0=0;							// 求Uc  (Uca)的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	
		b0=b0+(ADUc[j]-0x01FF)*(ADUc[j]-0x01FF);
		b1=b1+(ADUc[j+8]-0x01FF)*(ADUc[j+8]-0x01FF);
		b2=b2+(ADUc[j+16]-0x01FF)*(ADUc[j+16]-0x01FF);
		b3=b3+(ADUc[j+24]-0x01FF)*(ADUc[j+24]-0x01FF);
	}
	data=((b0>>2)+(b1>>2)+(b2>>2)+(b3>>2))>>3;
	data=qsqrt(data);
	UcAv=(unsigned int)((data*Ucxzh)>>4);
	
	
	b0=0;								// 求Ia的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	
		b0=b0+(ADIa[j]-0x01FF)*(ADIa[j]-0x01FF);
		b1=b1+(ADIa[j+8]-0x01FF)*(ADIa[j+8]-0x01FF);
		b2=b2+(ADIa[j+16]-0x01FF)*(ADIa[j+16]-0x01FF);
		b3=b3+(ADIa[j+24]-0x01FF)*(ADIa[j+24]-0x01FF);
	}
	data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;		
	data=qsqrt(data);										
	IaAv=(unsigned int)((data*Iaxzh)>>9);
	
	
	b0=0;							// 求Ib的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	
		b0=b0+(ADIb[j]-0x01FF)*(ADIb[j]-0x01FF);
		b1=b1+(ADIb[j+8]-0x01FF)*(ADIb[j+8]-0x01FF);
		b2=b2+(ADIb[j+16]-0x01FF)*(ADIb[j+16]-0x01FF);
		b3=b3+(ADIb[j+24]-0x01FF)*(ADIb[j+24]-0x01FF);
	}
	data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;		
	data=qsqrt(data);
	IbAv=(unsigned int)((data*Ibxzh)>>9);	
		
	b0=0;						// 求Ic的有效值 
	b1=0;
	b2=0;
	b3=0;
	for(j=0;j<8;j++)
	{	
		b0=b0+(ADIc[j]-0x01FF)*(ADIc[j]-0x01FF);
		b1=b1+(ADIc[j+8]-0x01FF)*(ADIc[j+8]-0x01FF);
		b2=b2+(ADIc[j+16]-0x01FF)*(ADIc[j+16]-0x01FF);
		b3=b3+(ADIc[j+24]-0x01FF)*(ADIc[j+24]-0x01FF);
	}
	data=((b0>>3)+(b1>>3)+(b2>>3)+(b3>>3))>>2;		
	data=qsqrt(data);							
	IcAv=(unsigned int)((data*Icxzh)>>9);
	
	return;
							
}

/*****************************************************************
** 函数名: PowerY()
** 功能描述:计算有功功率、无功功率、实在功率和功率因素Y接法(三表法 )
** 作 者:李纯
** 日 期:2004年2月25日(未完成)
****************************************************************/
void PowerY()
{	int i;
	int k=32;
	long a0,a1,a2,a3,data;
/******计算有功功率***************************/
	a0=0;		/* 计算Ua*Ia */					
	a1=0;
	a2=0;
	a3=0;  
	for(i=0;i<8;i++)
	{
		a0=a0+(ADUa[i]-0x01FF)*(ADIa[i]-0x01FF);
		a1=a1+(ADUa[i+8]-0x01FF)*(ADIa[i+8]-0x01FF);
		a2=a2+(ADUa[i+16]-0x01FF)*(ADIa[i+16]-0x01FF);
		a3=a3+(ADUa[i+24]-0x01FF)*(ADIa[i+24]-0x01FF); 
	}
	data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
	data=(data*Iaxzh)>>9;	
	P=(data*Uaxzh)>>4;			
	
		
	a0=0;		/* 计算Ub*Ib */					
	a1=0;
	a2=0;
	a3=0;  
	for(i=0;i<8;i++)
	{	
	    a0=a0+(ADUb[i]-0x01FF)*(ADIb[i]-0x01FF);
		a1=a1+(ADUb[i+8]-0x01FF)*(ADIb[i+8]-0x01FF);
		a2=a2+(ADUb[i+16]-0x01FF)*(ADIb[i+16]-0x01FF);
		a3=a3+(ADUb[i+24]-0x01FF)*(ADIb[i+24]-0x01FF); 
	}
	data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
	data=(data*Ibxzh)>>9;	
	P=P+((data*Ubxzh)>>4);	
	
	
	a0=0;		/* 计算Uc*Ic */					
	a1=0;
	a2=0;
	a3=0;  
	for(i=0;i<8;i++)
	{	
		a0=a0+(ADUc[i]-0x01FF)*(ADIc[i]-0x01FF);
		a1=a1+(ADUc[i+8]-0x01FF)*(ADIc[i+8]-0x01FF);
		a2=a2+(ADUc[i+16]-0x01FF)*(ADIc[i+16]-0x01FF);
		a3=a3+(ADUc[i+24]-0x01FF)*(ADIc[i+24]-0x01FF); 
		
	}
	data=(a0>>5)+(a1>>5)+(a2>>5)+(a3>>5);
	data=(data*Icxzh)>>9;	
	P=P+((data*Ucxzh)>>4);	
	P=P/100;
/**********计算无功功率************************/		
	a0=0;										/*A相无功功率*/
	for(i=0;i<k;i++)
	{
		if((i+((k+1)>>2))<k)
			a0=a0+(ADUa[i]-0x01FF)*(ADIa[i+(k>>2)]);
		else
			a0=a0+(ADUa[i]-0x01FF)*(ADIa[i-((k*3)>>2)]);
	}
	data=(a0*Iaxzh)>>7;	
	Q=(data*Uaxzh)>>10;

	a0=0;										/*B相无功功率*/
	for(i=0;i<k;i++)
	{
		if((i+((k+1)>>2))<k)
			a0=a0+(ADUb[i]-0x01FF)*(ADIb[i+(k>>2)]);
		else
			a0=a0+(ADUb[i]-0x01FF)*(ADIb[i-((k*3)>>2)]);
	}
	data=(a0*Ibxzh)>>7;	
	Q=Q+(data*Ubxzh)>>10;
	
	a0=0;										/*C相无功功率*/
	for(i=0;i<k;i++)
	{
		if((i+((k+1)>>2))<k)
			a0=a0+(ADUc[i]-0x01FF)*(ADIc[i+(k>>2)]);
		else
			a0=a0+(ADUc[i]-0x01FF)*(ADIc[i-((k*3)>>2)]);
	}
	data=(a0*Icxzh)>>7;	
	Q=Q+(data*Ucxzh)>>10;

	S=(qsqrt((P/100)*(P/100)+(Q/100)*(Q/100)))*100;/*视在功率*/
	Factor=((P>>8)*100)/(S>>8);						/* 功率因素带2位小数,为什么要各右移8位???? */

	return;
} 


/*****************************************************************
** 函数名: PowerD()
** 功能描述:计算有功功率、无功功率、实在功率和功率因素D接法(两表法UabIa-UbcIc )
** 作 者:李纯
** 日 期:2004年2月25日(未完成)
****************************************************************/
void PowerD()
{	int i;
	long a0,a1,a2,a3,data,data2,data1;
	long b0,b1,b2,b3;


				//P=UabIa-UbcIc
	a0=0;		// 计算Uab*Ia 					
	a1=0;
	a2=0;
	a3=0;  
	for(i=0;i<8;i++)
	{
		a0=a0+(ADUa[i]-0x01FF)*(ADIa[i]-0x01FF);
		a1=a1+(ADUa[i+8]-0x01FF)*(ADIa[i+8]-0x01FF);
		a2=a2+(ADUa[i+16]-0x01FF)*(ADIa[i+16]-0x01FF);
		a3=a3+(ADUa[i+24]-0x01FF)*(ADIa[i+24]-0x01FF); 
	}
	data=((a0>>3)+(a1>>3)+(a2>>3)+(a3>>3))>>2;
	data=data;
	data=(data*Iaxzh)>>9;	
	P=(data*Uaxzh)>>4;			
	
		
	a0=0;		// 计算Ubc*Ic 					
	a1=0;
	a2=0;
	a3=0;  
	for(i=0;i<4;i++)
	{
		a0=a0+(ADUb[i]-0x01FF)*(ADIb[i]-0x01FF);
		a1=a1+(ADUb[i+4]-0x01FF)*(ADIb[i+4]-0x01FF);
		a2=a2+(ADUb[i+8]-0x01FF)*(ADIb[i+8]-0x01FF);
		a3=a3+(ADUb[i+12]-0x01FF)*(ADIb[i+12]-0x01FF); 
	}
	data=((a0>>3)+(a1>>3)+(a2>>3)+(a3>>3))>>2;
	data=data;
	data=(data*Icxzh)>>9;
	P=P-((data*Ubxzh)>>4);		//UabIa-UbcIc
	

      
/*20030327  用瞬时值计算无功功率*/     
	data = 0;
	data2=0;
	for(i=0;i<32;i++){
		if(i==0){
			a0 = ADUa[31] - ADUa[i+1];
			a1 = ADUb[31] - ADUb[i+1];
		}
		else if(i == 31){
			a0 = ADUa[i-1] - ADUa[0];
			a1 = ADUb[i-1] - ADUb[0];
		}
		else {
			a0 = ADUa[i-1] - ADUa[i+1];
			a1 = ADUb[i-1] - ADUb[i+1];
		}
		
		data = data +((a0*ADIa[i])>>2);  // data = data + (1.0/4.0/Pi)*(a0*ADIa[i]-a1*ADIc[i])
		
		data2=data2+((a1*ADIc[i])>>2);
	}
				//add by ylp 2003 03 27
	data=data>>13;
	data2=data2>>13;
	
	data=(data*Iaxzh)>>4;
	data2=(a2*Icxzh)>>4;
	
	data=(data*Uaxzh)>>9;
	data2=(data2*Ubxzh)>>9;
	
	data=data-data2;
	
    	data = (data * 10000)/31416;
 
    
 // add by ylp  2003 03 27 
 
  	data1 = data1 /1000; //P*125
    	data  = data*16/10  ; //Q*125
    	temp=qsqrt(data*data+data1*data1); //S*125

	if(data1 < 0) Factor=((-data1)*100)/(temp);    //20030328 
	else Factor=((data1)*100)/(temp);						// 功率因素带2为小数 
	P = data1*10;
	Q = data*10;
	S = temp*10;						// 功率因素带2为小数 
  
/*20030327 以上是用瞬时值计算无功功率*/
	
	return;
} 
 
/*****************************************************************
** 函数名: AVRAGE()
** 功能描述:测量参数平均值计算子程序
** 作 者:严利平
** 日 期:2003年1月22日
****************************************************************/
void AVRAGE()
{	unsigned int i;
	unsigned long a0,a1,a2,a3,a4,a5;
	AvNo+=1;
	if(AvNo>=AVN)
	{	
		AvNo=0;
		a0=0;a1=0;a2=0;a3=0;a4=0;a5=0;
		for(i=0;i<AVN;i++)
		{	a0=a0+Uaa[i];
			a1=a1+Ubb[i];
			a2=a2+Ucc[i];
			a3=a3+Iaa[i];
			a4=a4+Ibb[i];
			a5=a5+Icc[i];
		}
		
		Ua=a0/AVN;
		Ub=a1/AVN;
		Uc=a2/AVN;
		Ia=a3/AVN;
		Ib=a4/AVN;
		Ic=a5/AVN;
		
	}
	
	return;
}			
/*****************************************************************
** 函数名: Clcom()
** 功能描述:测量参数计算子程序
** 作 者:严利平
** 日 期:2003年1月12日
****************************************************************/
void Clcom()
{
	Youxiaozhi();
	PowerD();
	AVRAGE();
	
	return;
}

⌨️ 快捷键说明

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