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

📄 harmonic.c

📁 FFT的实现在LPC2378上。首先采用了拉个朗日插值算法对采集的电网波形频率跟踪
💻 C
📖 第 1 页 / 共 3 页
字号:
			 {     
			     /*	if((g_sPowerQuality.iIaPhase  <320)  || ( g_sPowerQuality.iIaPhase >=2980 && g_sPowerQuality.iIaPhase <=3600))
               		 {
                   		  byCurrentError_type = 0xc6;//B C 相电流反向
                	}
			    	else if(g_sPowerQuality.iIbPhase  <2720  && g_sPowerQuality.iIbPhase >=1780)
			    	{
			      	  byCurrentError_type = 0xc5;//A  C 相电流反向
			    	}
                	else  if(g_sPowerQuality.iIcPhase  <1520  && g_sPowerQuality.iIcPhase >=580)
                  	  byCurrentError_type = 0xc3;//A  B 相电流反向
               	   else byCurrentError_type = 0xc7; //A  B C三相同时电流反向
               	 */
               	 /* lRealI0 = -(lRealI0 )/ 2;
                  lImageI0 = -(lImageI0) /2;                      
				  if(   lRealI0    < ( iRealArray[1] + 300) 
				   &&  lRealI0  > (iRealArray[1]  -300)
				   )
				  {
					 byCurrentError_type =  0xc6;//B C 相电流反向
				  }
				  else if(   lRealI0    < ( iRealArray[3] +300) 
				   &&  lRealI0  > (iRealArray[3] - 300)
				   )
				  {
					byCurrentError_type =  0xc5;//A  C 相电流反向
				  }
				   else if(   lRealI0    < ( iRealArray[5] +300) 
				   &&  lRealI0  > (iRealArray[5] -300)
				    )
				   {
					byCurrentError_type = 0xc3;//A  B 相电流反向
				   }
				   else byCurrentError_type =0; 
				   */
				   byCurrentError_type =0; 
			  }
			  else
			  {
			      lRealI0 = (lRealI0 )/ 2;
                  lImageI0 = (lImageI0) /2;                      
				  if(   lRealI0    < ( iRealArray[1] + 200) 
				   &&  lRealI0  > (iRealArray[1]  -200)
				   )
				  {
                      if((g_sPowerQuality.iIaPhase  <320)  || ( g_sPowerQuality.iIaPhase >=2980 && g_sPowerQuality.iIaPhase <=3600))
               		  {
                   		  byCurrentError_type = 0xc6;//B C 相电流反向
                	  }
					  else byCurrentError_type = 0xc1;//A相电流反向	
				  }
				  else if(   lRealI0    < ( iRealArray[3] +200) 
				   &&  lRealI0  > (iRealArray[3] - 200)
				   )
				  {
					 if(g_sPowerQuality.iIbPhase  <2720  && g_sPowerQuality.iIbPhase >=1780)
			    	 {
			      	    byCurrentError_type = 0xc5;//A  C 相电流反向
			    	 }
					 else byCurrentError_type = 0xc2;//B相电流反向
				  }
				   else if(   lRealI0    < ( iRealArray[5] +200) 
				   &&  lRealI0  > (iRealArray[5] -200)
				    )
				   {
					   if(g_sPowerQuality.iIcPhase  <1520  && g_sPowerQuality.iIcPhase >=580)
                  	      byCurrentError_type = 0xc3;//A  B 相电流反向
					   else byCurrentError_type = 0xc4;//C相电流反向
				   }
				   else byCurrentError_type =0;
			  }
		}
		else if(i==3);//都小于150则不判断极性
        else if(i==1 || i==2) //判断是否有一相或两相开路
		{
          /*  if(i==1)//判断是否有一相开路
			{    
                if(byError[0]==1)  //A相电流偏小?
				{
					lRealI0 =   iRealArray[3] + iRealArray[5];
				    lImageI0 =  iMageArray[3] + iMageArray[5];
                    lRealI0 = - lRealI0;
                    lImageI0 = - lImageI0;
                    if(     iRealArray[1]  < (iRealArray[0] * 11 / 10) 
						&&  iRealArray[1]  > (iRealArray[0] * 9 / 10 )
					  )
					{
                         byCurrentError_type = 0x81;//A相电流开路
					}
				}
				else if(byError[1]==1) //B相电流偏小?
				{
                    lRealI0 =   iRealArray[1] + iRealArray[5];
				    lImageI0 =  iMageArray[1] + iMageArray[5];
                    lRealI0 = - lRealI0;
                    lImageI0 = - lImageI0;
                    if(     iRealArray[3]  < (iRealArray[0] * 11 / 10) 
						&&  iRealArray[3]  > (iRealArray[0] * 9 / 10 )
					  )
					{
                         byCurrentError_type = 0x82;//B相电流开路
					}        
				}
				else //C相电流偏小?
				{
 l                  lRealI0 =   iRealArray[1] + iRealArray[3];
				    lImageI0 =  iMageArray[1] + iMageArray[3];
                    lRealI0 = - lRealI0;
                    lImageI0 = - lImageI0;
                    if(     iRealArray[5]  < (iRealArray[0] * 11 / 10) 
						&&  iRealArray[5]  > (iRealArray[0] * 9 / 10 )
					  )
					{
                        byCurrentError_type = 0x84;//C相电流开路
					}        
				}
			}
			else //判断是否有2相开路
			{
                if(byError[0]==1 && byError[1]==1)  //AB相电流偏小?
				{
                    lRealI0 =   iRealArray[1] + iRealArray[3];
				    lImageI0 =  iMageArray[1] + iMageArray[3];
				}
			}
			*/
		}//
	}
}

/* 开平方程序 */
int Sqrt2(long data)
{
	double a;
	int b,c;
	a = sqrt((double)data);
	b = ((int)a)*10;
	c = (int)(a*10);
	c -= b;
	if(c >= 5) return(((int)a) + 1);
	else return((int)a);
}
//**********计算不平衡度***************
void Compute_Unbalance(INT16 iRealArray[],INT16 iMageArray[])
{
    long a,b;
	long c,d;   // Ua Ia Ub Ib Uc Ic
    float dtemp;
	float dCoef = (float) (25000.0*2*1.4142 *256 /10066329.6);
	a = iRealArray[0] + iRealArray[2] + iRealArray[4];
	b = iMageArray[0] + iMageArray[2] + iMageArray[4];
	dtemp = dCoef*(float)Sqrt2(a*a + b*b)/3.0  ;
	g_sPowerQuality.wU0 = dtemp;					// 零序电压

	c = (iMageArray[2] - iMageArray[4])*56756;
	d = (iRealArray[4] - iRealArray[2])*56756;
	a = iRealArray[0] - (iRealArray[2] + iRealArray[4])/2 - (c >> 16);
	b = iMageArray[0] - (iMageArray[2] + iMageArray[4])/2 - (d >> 16);
	dtemp = dCoef *(float)Sqrt2(a*a + b*b)/3;
	g_sPowerQuality.wU1 = dtemp	;				// 正序电压

	a = iRealArray[0] - (iRealArray[2] + iRealArray[4])/2 + (c >> 16);
	b = iMageArray[0] - (iMageArray[2] + iMageArray[4])/2 + (d >> 16);
	dtemp = dCoef *(float)Sqrt2(a*a + b*b)/3;
	g_sPowerQuality.wU2 = dtemp;						// 负序电压

    dCoef = 6000.0*2*1.4142 *256 /10066329.6;

	a = iRealArray[1] + iRealArray[3] + iRealArray[5];
	b = iMageArray[1] + iMageArray[3] + iMageArray[5];
	dtemp = dCoef *(float)Sqrt2(a*a + b*b)/3;
	g_sPowerQuality.wI0 = dtemp;						// 零序电流

	c = (iMageArray[3] - iMageArray[5])*56756;
	d = (iRealArray[5] - iRealArray[3])*56756;
	a = iRealArray[1] - (iRealArray[3] + iRealArray[5])/2 - (c >> 16);
	b = iMageArray[1] - (iMageArray[3] + iMageArray[5])/2 - (d >> 16);
	dtemp = dCoef *(float)Sqrt2(a*a + b*b)/3;
	g_sPowerQuality.wI1 =dtemp;						// 正序电流

	a = iRealArray[1] - (iRealArray[3] + iRealArray[5])/2 + (c >> 16);
	b = iMageArray[1] - (iMageArray[3] + iMageArray[5])/2 + (d >> 16);
	dtemp = dCoef *(float)Sqrt2(a*a + b*b)/3;
	g_sPowerQuality.wI2 = dtemp;
}
//***********电能质量统计************/
void PowerQualityStat(SRestrict *psRestrict)
{
	SDateTime sTime;
	WORD *PtrCur;
	WORD *PtrMax;
	WORD *PtrBase;
	DWORD *PtrMaxTime;
	long temp;
	BYTE i;
	BYTE j;
	STime4 sTime4;
	//WORD wMaxHIa[XIEBO_NUM];   //A相天统计谐波电流最大值[0]2次 [1]3次 ...
	//WORD wMaxHIb[XIEBO_NUM];   //B相
	//WORD wMaxHIc[XIEBO_NUM];   //C相
    //**********总畸变电流日最大值及发生时间*********************
    PtrCur = (WORD*)&g_sPowerQuality.wTHDIa;
	PtrMax = (WORD*)&g_sPowerQuality.wMaxAllIa;
	PtrBase = (WORD*)&g_sPowerQuality.wIa1; //基波的有效值
	PtrMaxTime = (DWORD*)&g_sPowerQuality.dwMaxAllIaT;
    for(i=0; i<3; i++,PtrMax++,PtrMaxTime)
	{
        temp  = (long)PtrCur[i] * (long)PtrBase[j] / 10000;//因畸变率的系数为10000这里要除去
        if(temp  > PtrMax[i] || PtrMax[i]==0)
		{
			PtrMax[i] = temp;
			PtrMaxTime[i] = sTime.byMonth;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byDay;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byHour;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byMinute;
		}
        PtrBase +=2;
        PtrCur +=2;
	}
   //**********日统计三相 2-19 次谐波电流日最大值及发生时间*****
	PtrCur = (WORD*)&g_sPowerQuality.wHRIa[0];
	PtrMax = (WORD*)&g_sPowerQuality.wMaxHIa[0];
	PtrMaxTime = (DWORD*)&g_sPowerQuality.dwMaxIaT[0];
	PtrBase = (WORD*)&g_sPowerQuality.wIa1; //基波的有效值
	for(j=0; j<3; j++)
	{
		for(i=0; i<XIEBO_NUM; i++,PtrCur++,PtrMaxTime++,PtrMax++)
		{   
			temp  = (long)PtrCur[i] * (long)PtrBase[j] / 10000;
			if(temp  > PtrMax[i] || PtrMax[i]==0)
			{
				PtrMax[i] = temp;
				PtrMaxTime[i] = sTime.byMonth;
				PtrMaxTime[i] <<= 8;
				PtrMaxTime[i] |= sTime.byDay;
				PtrMaxTime[i] <<= 8;
				PtrMaxTime[i] |= sTime.byHour;
				PtrMaxTime[i] <<= 8;
				PtrMaxTime[i] |= sTime.byMinute;
			}
		}
        if(j==0)
			PtrCur = (WORD*)&g_sPowerQuality.wHRIb[0];
		else
			PtrCur = (WORD*)&g_sPowerQuality.wHRIc[0];
        PtrBase +=2;
	}
	OSTimeDly(2);
	 //**********总谐波电压含有率日最大值及发生时间*********************
    PtrCur = (WORD*)&g_sPowerQuality.wTHDua;
	PtrMax = (WORD*)&g_sPowerQuality.wMaxTHDua;
	PtrMaxTime = (DWORD*)&g_sPowerQuality.dwMaxTHDuaT;
    for(i=0; i<3; i++,PtrMax++,PtrMaxTime++)
	{
        if(PtrCur[i]  > PtrMax[i] || PtrMax[i]==0)
		{
			PtrMax[i] = PtrCur[i];
			PtrMaxTime[i] = sTime.byMonth;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byDay;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byHour;
			PtrMaxTime[i] <<= 8;
			PtrMaxTime[i] |= sTime.byMinute;
		}
        PtrCur +=2;
	}
   //**********日统计三相电压含有率日最大值发生及发生时间*****
	PtrCur = (WORD*)&g_sPowerQuality.wHRUa[0];
	PtrMax = (WORD*)&g_sPowerQuality.wMaxHRUa[0];
	PtrMaxTime = (DWORD*)&g_sPowerQuality.wMaxHRUaT[0];
	for(j=0; j<3; j++)
	{
		for(i=0; i<XIEBO_NUM; i++,PtrCur++,PtrMaxTime++,PtrMax++)

⌨️ 快捷键说明

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