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

📄 epower_compute.c

📁 在TI的TMSF2812平台上
💻 C
字号:
/* 
   FILE:    Epower_28x_Compute.c
  
   TITLE:   Compute Program(Compute).
   
   AUTHOR:  Xu Kangping  
  
   DESCRIPTION:
  
            This file define compute function about DSP2812 to compute the
            parameter about eletric power.
  
            The Epower_28x headerfiles are required to build this file.
         
            Watch Variables:
                   
*/

#include "Epower_28x.h"

//电压波动、闪变数据采集程序开始,嵌入到中断程序

extern Uint32 uua[6000]; // 10ms一个数据,1分钟数据
extern Uint32 uub[6000];
extern Uint32 uuc[6000];
Uint32 samplen_ff;//extern 
Uint32 max_ua,max_ub,max_uc,min_ua,min_ub,min_uc;//extern 

Uint32 ua1,ua2,ub1,ub2,uc1,uc2;

extern Uint16 coef_ua,coef_ub,coef_uc;
extern Uint16 samplen;
extern int adcdata_ua[256];
extern int adcdata_ub[256];
extern int adcdata_uc[256];
extern int adcdata_ia[256];
extern int adcdata_ib[256];
extern int adcdata_uc[256];

const Uint16 sq[256] ={\
        0,    1,    4,    9,   16,   25,   36,   49,   64,   81,
	  100,  121,  144,  169,  196,  225,  256,  289,  324,  361,
	  400,  441,  484,  529,  576,  625,  676,  729,  784,  841,
	  900,  961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521,
	 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401,
	 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481,
	 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761,
	 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241,
	 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921,
	 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801,
	10000,10201,10404,10609,10816,11025,11236,11449,11664,11881,
	12100,12321,12544,12769,12996,13255,13456,13689,13924,14161,
	14400,14641,14884,15129,15376,15625,15876,16129,16384,16641,
	16900,17161,17424,17689,17956,18225,18496,18769,19044,19321,
	19600,19881,20164,20449,20736,21025,21316,21609,21904,22201,
	22500,22801,23104,23409,23716,24025,24336,24649,24964,25281,
	25600,25921,26244,26569,26896,27225,27556,27889,28224,28561,
	28900,29241,29584,29929,30276,30625,30976,31329,31684,32041,
	32400,32761,33124,33489,33856,34225,34596,34969,35344,35721,
	36100,36481,36864,37249,37636,38025,38416,38809,39204,39601,
	40000,40401,40804,41209,41616,42025,42436,42849,43264,43681,
	44100,44521,44944,45369,45796,46225,46656,47089,47524,47961,
	48400,48841,49284,49729,50176,50625,51076,51529,51984,52441,
	52900,53361,53824,54289,54756,55225,55696,56169,56644,52441,
	57600,58081,58564,59049,59536,60025,60516,61009,61504,62001,
	62500,63001,63504,64009,64516,65025};

Uint16 Sqr(Uint16 n)
{
	Uint16 a1,a2,a3;
	Uint16 sn;
	if(n == 0)
	{
		a1 = 0;
	}
	else
	{
		if(n == 65535)
		{
			a1 = 2560;
		}
		else
		{
			sn = 0;
			if(sq[sn+128] < n) sn += 128;
			if(sq[sn+64] < n)  sn += 64;
			if(sq[sn+32] < n)  sn += 32;
			if(sq[sn+16] < n)  sn += 16;
			if(sq[sn+8] < n)   sn += 8;
			if(sq[sn+4] < n)   sn += 4;
			if(sq[sn+2] < n)   sn += 2;
			if(sq[sn+1] < n)   sn += 1;
			a1 = sn*10;
			a2 = (n - sq[sn])*10;
			if(sn < 255) a3 = sq[sn+1] - sq[sn];
			else a3 = 65535 - sq[sn];
			a1 +=  a2/a3;
		}
	}
	return a1;
}

void FluctuationFlickerSample(void)					//每半个周波计算一次
{
	Uint32 yy1 = 0,yy2 = 0,yy3 = 0;
	Uint16 i;
	if((samplen%128) != 0) return;
	if(samplen==128)
	{
		for(i=0;i<128;i+=16)
		{
			yy1 += adcdata_ua[i]*adcdata_ua[i];
			yy2 += adcdata_ub[i]*adcdata_ub[i];
			yy3 += adcdata_uc[i]*adcdata_uc[i];
		}
	}
	if(samplen==0)
	{
		for(i=128;i<256;i+=16)
		{
			yy1 += adcdata_ua[i]*adcdata_ua[i];
			yy2 += adcdata_ub[i]*adcdata_ub[i];
			yy3 += adcdata_uc[i]*adcdata_uc[i];
		}
	}
	yy1 = yy1 >> 15;
	yy1 = (Sqr((Uint16)yy1)*coef_ua) >> 10;			// 满幅值 1000
	yy2 = yy2 >> 15;
	yy1 = (Sqr((Uint16)yy2)*coef_ub) >> 10;
	yy3 = yy3 >> 15;
	yy1 = (Sqr((Uint16)yy3)*coef_uc) >> 10;
	
	if(samplen_ff < 6000)							//平方解调器
	{
		uua[samplen_ff] = yy1*yy1;
		uub[samplen_ff] = yy2*yy2;
		uuc[samplen_ff] = yy3*yy3;
	}
	
	//寻找最大值、最小值
	if(samplen == 128)
	{
		ua1 = yy1;
		ub1 = yy2;
		uc1 = yy3;
	}
	if(samplen == 0)
	{
		ua2 = yy1;
		ub2 = yy2;
		uc2 = yy3;
	}
	yy1 = (ua1 + ua2) >> 1;
	yy2 = (ub1 + ub2) >> 1;
	yy3 = (uc1 + uc2) >> 1;
	if(max_ua < yy1) max_ua = yy1;
	if(max_ub < yy2) max_ub = yy2;
	if(max_uc < yy3) max_uc = yy3;
	if(min_ua > yy1) min_ua = yy1;
	if(min_ub > yy2) min_ub = yy2;
	if(min_uc > yy1) min_uc = yy3;
}

⌨️ 快捷键说明

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