📄 epower_compute.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 + -