📄 baseai.c
字号:
#include "nucleus.h"
#include "math.h"
#include "BaseVariable.h"
#define HARMOUSMAX 10 //最大谐波次数
typedef struct //每次谐波保存实部,虚部
{
float real;
float imag;
}HARMOUS;
HARMOUS VIA[HARMOUSMAX],VIB[HARMOUSMAX],VIC[HARMOUSMAX], //三相测量电流各次谐波
VUa[HARMOUSMAX],VUb[HARMOUSMAX],VUc[HARMOUSMAX]; //三相测量电压各次谐波
float VP[HARMOUSMAX],VQ[HARMOUSMAX]; //各次谐波功率
float HarmousCoeff[HARMOUSMAX][Sample_Point * 2] = //各次谐波滤波系数
{
{
//基波傅氏滤波系数
//实部
1.000000000,0.965925826,0.866025404,0.707106781,0.500000000,0.258819045,
-0.000000000,-0.258819045,-0.500000000,-0.707106781,-0.866025404,-0.965925826,
-1.000000000,-0.965925826,-0.866025404,-0.707106781,-0.500000000,-0.258819045,
0.000000000,0.258819045,0.500000000,0.707106781,0.866025404,0.965925826,
//虚部
0.000000000,-0.258819045,-0.500000000,-0.707106781,-0.866025404,-0.965925826,
-1.000000000,-0.965925826,-0.866025404,-0.707106781,-0.500000000,-0.258819045,
0.000000000,0.258819045,0.500000000,0.707106781,0.866025404,0.965925826,
1.000000000,0.965925826,0.866025404,0.707106781,0.500000000,0.258819045
},
{
//2次谐波傅氏滤波系数
//实部
1.000000000,0.866025404,0.500000000,-0.000000000,-0.500000000,-0.866025404,
-1.000000000,-0.866025404,-0.500000000,0.000000000,0.500000000,0.866025404,
1.000000000,0.866025404,0.500000000,-0.000000000,-0.500000000,-0.866025404,
-1.000000000,-0.866025404,-0.500000000,0.000000000,0.500000000,0.866025404,
//虚部
0.000000000,-0.500000000,-0.866025404,-1.000000000,-0.866025404,-0.500000000,
0.000000000,0.500000000,0.866025404,1.000000000,0.866025404,0.500000000,
-0.000000000,-0.500000000,-0.866025404,-1.000000000,-0.866025404,-0.500000000,
0.000000000,0.500000000,0.866025404,1.000000000,0.866025404,0.500000000
},
{
//3次谐波傅氏滤波系数
//实部
1.000000000,0.707106781,-0.000000000,-0.707106781,-1.000000000,-0.707106781,
0.000000000,0.707106781,1.000000000,0.707106781,-0.000000000,-0.707106781,
-1.000000000,-0.707106781,0.000000000,0.707106781,1.000000000,0.707106781,
-0.000000000,-0.707106781,-1.000000000,-0.707106781,0.000000000,0.707106781,
//虚部
0.000000000,-0.707106781,-1.000000000,-0.707106781,0.000000000,0.707106781,
1.000000000,0.707106781,-0.000000000,-0.707106781,-1.000000000,-0.707106781,
0.000000000,0.707106781,1.000000000,0.707106781,-0.000000000,-0.707106781,
-1.000000000,-0.707106781,0.000000000,0.707106781,1.000000000,0.707106781
},
{
// 4次谐波傅氏滤波系数
//实部
1.000000000,0.500000000,-0.500000000,-1.000000000,-0.500000000,0.500000000,
1.000000000,0.500000000,-0.500000000,-1.000000000,-0.500000000,0.500000000,
1.000000000,0.500000000,-0.500000000,-1.000000000,-0.500000000,0.500000000,
1.000000000,0.500000000,-0.500000000,-1.000000000,-0.500000000,0.500000000,
//虚部
0.000000000,-0.866025404,-0.866025404,0.000000000,0.866025404,0.866025404,
-0.000000000,-0.866025404,-0.866025404,0.000000000,0.866025404,0.866025404,
-0.000000000,-0.866025404,-0.866025404,0.000000000,0.866025404,0.866025404,
-0.000000000,-0.866025404,-0.866025404,0.000000000,0.866025404,0.866025404
},
{
// 5次谐波傅氏滤波系数
//实部
1.000000000,0.258819045,-0.866025404,-0.707106781,0.500000000,0.965925826,
-0.000000000,-0.965925826,-0.500000000,0.707106781,0.866025404,-0.258819045,
-1.000000000,-0.258819045,0.866025404,0.707106781,-0.500000000,-0.965925826,
0.000000000,0.965925826,0.500000000,-0.707106781,-0.866025404,0.258819045,
//虚部
0.000000000,-0.965925826,-0.500000000,0.707106781,0.866025404,-0.258819045,
-1.000000000,-0.258819045,0.866025404,0.707106781,-0.500000000,-0.965925826,
0.000000000,0.965925826,0.500000000,-0.707106781,-0.866025404,0.258819045,
1.000000000,0.258819045,-0.866025404,-0.707106781,0.500000000,0.965925826
},
{
// 6次谐波傅氏滤波系数
//实部
1.000000000,-0.000000000,-1.000000000,0.000000000,1.000000000,-0.000000000,
-1.000000000,0.000000000,1.000000000,-0.000000000,-1.000000000,0.000000000,
1.000000000,-0.000000000,-1.000000000,0.000000000,1.000000000,-0.000000000,
-1.000000000,0.000000000,1.000000000,-0.000000000,-1.000000000,0.000000000,
//虚部
0.000000000,-1.000000000,0.000000000,1.000000000,-0.000000000,-1.000000000,
0.000000000,1.000000000,-0.000000000,-1.000000000,0.000000000,1.000000000,
-0.000000000,-1.000000000,0.000000000,1.000000000,-0.000000000,-1.000000000,
0.000000000,1.000000000,-0.000000000,-1.000000000,0.000000000,1.000000000
},
{
// 7次谐波傅氏滤波系数
//实部
1.000000000,-0.258819045,-0.866025404,0.707106781,0.500000000,-0.965925826,
0.000000000,0.965925826,-0.500000000,-0.707106781,0.866025404,0.258819045,
-1.000000000,0.258819045,0.866025404,-0.707106781,-0.500000000,0.965925826,
-0.000000000,-0.965925826,0.500000000,0.707106781,-0.866025404,-0.258819045,
//虚部
0.000000000,-0.965925826,0.500000000,0.707106781,-0.866025404,-0.258819045,
1.000000000,-0.258819045,-0.866025404,0.707106781,0.500000000,-0.965925826,
0.000000000,0.965925826,-0.500000000,-0.707106781,0.866025404,0.258819045,
-1.000000000,0.258819045,0.866025404,-0.707106781,-0.500000000,0.965925826
},
{
// 8次谐波傅氏滤波系数
//实部
1.000000000,-0.500000000,-0.500000000,1.000000000,-0.500000000,-0.500000000,
1.000000000,-0.500000000,-0.500000000,1.000000000,-0.500000000,-0.500000000,
1.000000000,-0.500000000,-0.500000000,1.000000000,-0.500000000,-0.500000000,
1.000000000,-0.500000000,-0.500000000,1.000000000,-0.500000000,-0.500000000,
//虚部
0.000000000,-0.866025404,0.866025404,-0.000000000,-0.866025404,0.866025404,
-0.000000000,-0.866025404,0.866025404,-0.000000000,-0.866025404,0.866025404,
-0.000000000,-0.866025404,0.866025404,-0.000000000,-0.866025404,0.866025404,
-0.000000000,-0.866025404,0.866025404,-0.000000000,-0.866025404,0.866025404
},
{
// 9次谐波傅氏滤波系数
//实部
1.000000000,-0.707106781,0.000000000,0.707106781,-1.000000000,0.707106781,
-0.000000000,-0.707106781,1.000000000,-0.707106781,0.000000000,0.707106781,
-1.000000000,0.707106781,-0.000000000,-0.707106781,1.000000000,-0.707106781,
0.000000000,0.707106781,-1.000000000,0.707106781,-0.000000000,-0.707106781,
//虚部
0.000000000,-0.707106781,1.000000000,-0.707106781,0.000000000,0.707106781,
-1.000000000,0.707106781,-0.000000000,-0.707106781,1.000000000,-0.707106781,
0.000000000,0.707106781,-1.000000000,0.707106781,-0.000000000,-0.707106781,
1.000000000,-0.707106781,0.000000000,0.707106781,-1.000000000,0.707106781
},
{
// 10次谐波傅氏滤波系数
//实部
1.000000000,-0.866025404,0.500000000,-0.000000000,-0.500000000,0.866025404,
-1.000000000,0.866025404,-0.500000000,0.000000000,0.500000000,-0.866025404,
1.000000000,-0.866025404,0.500000000,-0.000000000,-0.500000000,0.866025404,
-1.000000000,0.866025404,-0.500000000,0.000000000,0.500000000,-0.866025404,
//虚部
0.000000000,-0.500000000,0.866025404,-1.000000000,0.866025404,-0.500000000,
0.000000000,0.500000000,-0.866025404,1.000000000,-0.866025404,0.500000000,
-0.000000000,-0.500000000,0.866025404,-1.000000000,0.866025404,-0.500000000,
0.000000000,0.500000000,-0.866025404,1.000000000,-0.866025404,0.500000000
}
};
#pragma DATA_SECTION(FOURIER1,".FilterCoeff"); //内部RAM中的基波滤波系数,运行速度快
#pragma DATA_SECTION(FOURIER2,".FilterCoeff"); //内部RAM中的二次谐波滤波系数,运行速度快
#pragma DATA_SECTION(FOURIER3,".FilterCoeff"); //内部RAM中的三次谐波滤波系数,运行速度快
#pragma DATA_SECTION(FOURIER5,".FilterCoeff"); //内部RAM中的五次谐波滤波系数,运行速度快
float FOURIER1[Sample_Point * 2];
float FOURIER2[Sample_Point * 2];
float FOURIER3[Sample_Point * 2];
float FOURIER5[Sample_Point * 2];
float *pFOURIER1 = FOURIER1;
float *pFOURIER2 = FOURIER2;
float *pFOURIER3 = FOURIER3;
float *pFOURIER5 = FOURIER5;
VOID Calculate(VOID);
VOID RemoteMeasure(VOID);
VOID fei_sqrt(VOID);
VOID Phase_V_Cal(VOID);
VOID CHLDEF_Initialize(VOID);
VOID Delta_I_Initialize(VOID);
VOID Delta_I_Routine(VOID);
VOID CopyFilterCoeff(VOID);
VOID CopyFOURIER(float *pSRC, float *pDST);
float fAmendCoeff(UNSIGNED channel);
float fAmendAngle(UNSIGNED channel);
float Uab; //Uab基波平方和
float Ubc; //Ubc基波平方和
float Uca; //Uca基波平方和
float samp_f; //频率
float *Sample_Ptr = SampleData[0].value; //采样指针
UNSIGNED SampleIndex; //采样值数组下标
PRO_CHANNEL AIChn[CHL_Number]; //模入通道
MEASTRU measure[MEASURE_NUMBER] = //遥测量的额定值
{
{"IA",5,0,"A"},{"IB",5,0,"A"},{"IC",5,0,"A"},{"Uab",100,0,"V"},{"Ubc",100,0,"V"},{"Uca",100,0,"V"},
{"P",866,0,"W"},{"Q",866,0,"Var"},{"f",2,0,"Hz"},{"3I0r",1,0,"A"},{"3I0m",1,0,"A"},
{"3U0r",57.7*3,0,"V"},{"3U0m",57.7*3,0,"V"},
};
extern VOID Cal_Harmous(float *sample, float *coeff, HARMOUS *result, float fcoeff, float fcos, float fsin);
extern float MeasurePhraseValue(UNSIGNED channel,UNSIGNED index,float coef);
extern float MeasureLineValue(UNSIGNED channel1,UNSIGNED channel2,UNSIGNED index,float coef1,float coef2);
extern VOID MeasurePQ2(UNSIGNED isampleindex,float*,float*,float,float,float,float,float);
/***********************************************************************************/
/* 自动调整采样频率 */
/***********************************************************************************/
VOID CopyFOURIER(float *pSRC, float *pDST)
{
register UNSIGNED i;
register float *pSRC1 = pSRC, *pDST1 = pDST;
for(i = 0; i < sizeof(FOURIER1); i++) *pDST1++ = *pSRC1++;
}
VOID CopyFilterCoeff(VOID)
{
CopyFOURIER(HarmousCoeff[0],pFOURIER1); //基波滤波系数拷贝至内部RAM
CopyFOURIER(HarmousCoeff[1],pFOURIER2); //二次谐波滤波系数拷贝至内部RAM
CopyFOURIER(HarmousCoeff[2],pFOURIER3); //三次谐波滤波系数拷贝至内部RAM
CopyFOURIER(HarmousCoeff[4],pFOURIER5); //五次谐波滤波系数拷贝至内部RAM
}
/***********************************************************************************/
/* 自动调整采样频率 */
/***********************************************************************************/
#define FreqModifyNumber 22
typedef struct
{
float frequency;
float sample_interval;
float coeff;
}FREQSTRU;
FREQSTRU FreqCtrl[FreqModifyNumber] =
{
{45,10e6/(Sample_Point*45),45/3.1415926536},{45.5,10e6/(Sample_Point*45.5),45.5/3.1415926536}, //0
{46,10e6/(Sample_Point*46),46/3.1415926536},{46.5,10e6/(Sample_Point*46.5),46.5/3.1415926536}, //1
{47,10e6/(Sample_Point*47),47/3.1415926536},{47.5,10e6/(Sample_Point*47.5),47.5/3.1415926536}, //2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -