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

📄 epower_fft1024r.c

📁 在TI的TMSF2812平台上
💻 C
字号:
/* ==============================================================================

System Name:    Real FFT - Software Test Bench (STB)

File Name:      Epower_fft1024r.C

Description:    Primary System file for demonstrating the Real FFT module

Originator:     Advanced Embeeded Control (AEC) - Texas Instruments

Target dependency:  x28x

Description:
=============================================================================== */


#include "Epower_28x.h"

/* Create an Instance of FFT module                 */
RFFT32  fft = RFFT32_1024P_DEFAULTS;

extern long ipcb[1026];
extern long mag[513];

/* 定义三相63次谐波的有功功率和无功功率 */
extern int p_a[64];
extern int q_a[64];
extern int p_b[64];
extern int q_b[64];
extern int p_c[64];
extern int q_c[64];

/* 定义总的有效功率和无功功率 */
extern long sum_p[3];
extern long sum_q[3];

/* FFT运算所需数组 */
extern int fftdata_ua[1024];
extern int fftdata_ub[1024];
extern int fftdata_uc[1024];
extern int fftdata_ia[1024];
extern int fftdata_ib[1024];
extern int fftdata_ic[1024];

/* FFT电压、电流值(复数形式) */
extern int fft_ua[128];
extern int fft_ub[128];
extern int fft_uc[128];
extern int fft_ia[128];
extern int fft_ib[128];
extern int fft_ic[128];

/* FFT实时数据输出(用于存储) */
extern long mag_ua[64];
extern long mag_ub[64];
extern long mag_uc[64];
extern long mag_ia[64];
extern long mag_ib[64];
extern long mag_ic[64];

/* 表示FFT运算的标志符 */
extern Uint16 fftflag;

/* 表示功率运算的标志符 */
extern Uint16 powerflag;

/* 表示总功率运算的标志符 */
extern Uint16 powersflag;

const int angleamend[128] = {\
/*  0.11	0.22	0.33	0.44	0.55	0.66	0.77	 0.88	  */
	8192,16,8192,31,8192,47,8192,63,8192,79,8191,94,8191,110,8191,126,\
/*  0.99	 1.10	  1.21	   1.32		1.43	 1.54	  1.65	   1.76	  */
	8191,142,8190,157,8190,173,8190,189,8189,204,8189,220,8189,236,8188,252,\
/*  1.87	 1.98	  2.09	   2.20		2.31	 2.42	  2.53	   2.64	  */	
	8188,267,8187,283,8187,299,8186,314,8185,330,8185,346,8184,362,8183,377,\
/*  2.75	 2.86	  2.97	   3.08		3.19	 3.30	  3.41	   3.52	  */
	8183,393,8182,409,8181,424,8180,440,8179,456,8178,472,8177,487,8177,503,\
/*  3.63	 3.74	  3.85	   3.96		4.07	 4.18	  4.29	   4.40	  */
	8176,519,8175,534,8174,550,8172,566,8171,581,8170,597,8169,613,8168,628,\
/*  4.51	 4.62	  4.73	   4.84		4.95	 5.06	  5.17	   5.28	  */
	8167,644,8165,660,8164,676,8163,691,8161,707,8160,723,8159,738,8157,754,\
/*  5.39	 5.50	  5.61	   5.72		5.83	 5.94	  6.05	   6.16	  */
	8156,770,8154,785,8153,801,8151,816,8150,832,8148,848,8146,863,8145,879,\
/*  6.27	 6.38	  6.49	   6.60		6.71	 6.82	  6.93	   7.04	  */
	8143,895,8141,910,8140,926,8138,942,8136,957,8134,973,8132,988,8130,1004};

/* Define window Co-efficient Array  and place the
.constant section in ROM memory				*/
const long win[512] = HAMMING1024;

/* Create an instance of FFTRACQ module             */
RFFT32_ACQ  acq = FFTRACQ_DEFAULTS;

void FFT1024RINIT(void)
{
/* Initialize the ia acquisition module               */
	acq.buffptr = ipcb;
	acq.tempptr = ipcb;
	acq.size = 1024;
	acq.count = 1024;
	acq.acqflag = 1;

/* Initialize FFT module                            */
	fft.ipcbptr = ipcb;
	fft.magptr = mag;  
	fft.winptr = (long *)win;
	fft.init(&fft);  

/*---------------------------------------------------------------------------
    Nothing running in the background at present           
----------------------------------------------------------------------------*/
}

void FFT1024R(int datain[])
{
	Uint16 i;
	
	for(i=0;i<1024;i++)
	{
		acq.input = ((unsigned long)datain[i]) << 16;
		acq.update(&acq);
	}
	//RFFT32_brev(data,ipcb,FFTLENGTH);
	// RFFT32_brev(ipcb,ipcb,N);  // Input samples in Real Part
	
	fft.win(&fft);
	
	// RFFT32_brev(ipcb,ipcb,N);
	// RFFT32_brev(ipcb,ipcb,N);  // Input after windowing
    
	fft.calc(&fft);
	fft.split(&fft);
	fft.mag(&fft);
	acq.acqflag=1;      // Enable the next acquisition
}

void EpowerFFT(void)
{
	Uint16 i,j,m;
	if((fftflag == 1)&&(powerflag == 0))
	{
		FFT1024R(fftdata_ua);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_ua[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_ua[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_ua[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		FFT1024R(fftdata_ub);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_ub[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_ub[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_ub[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		FFT1024R(fftdata_uc);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_uc[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_uc[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_uc[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		FFT1024R(fftdata_ia);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_ia[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_ia[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_ia[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		FFT1024R(fftdata_ib);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_ib[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_ib[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_ib[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		FFT1024R(fftdata_ic);
		m = 0;
		for(i=4;i<260;i+=4)
		{
			mag_ic[m] = mag[i];
			m ++;
		}
		j = 0;
		for(i=8;i<520;i+=8)
		{
			fft_ic[j] = (int)(ipcb[i] >> 16);
			j ++;
			fft_ic[j] = (int)(ipcb[i + 1] >> 16);
			j ++;
		}
		fftflag = 0;
		powerflag = 1;
	}
}

void CurrentModify(void)
{
	Uint16 i;
	int a,b,e,f;
	long c,d;
	/* Angle Modify */
	for(i=0;i<128;i+=2)									// IA
	{
		a = fft_ia[i];
		b = fft_ia[i +1];
		c = a*angleamend[i];
		d = b*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ia[i] = e + f;
		c = b*angleamend[i];
		d = a*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ia[i] = e - f;
	}
	for(i=0;i<128;i+=2)									// IB
	{
		a = fft_ib[i];
		b = fft_ib[i +1];
		c = a*angleamend[i];
		d = b*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ib[i] = e + f;
		c = b*angleamend[i];
		d = a*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ib[i] = e - f;
	}
	for(i=0;i<128;i+=2)									// IC
	{
		a = fft_ic[i];
		b = fft_ic[i +1];
		c = a*angleamend[i];
		d = b*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ic[i] = e + f;
		c = b*angleamend[i];
		d = a*angleamend[i + 1];
		e = (int)(c >> 16);
		f = (int)(d >> 16);
		fft_ic[i] = e - f;
	}
	/* Scope Modify */	
}

/* 谐波功率计算程序 */
void PowerCompute(void)
{
	long a,b,c,d;
	Uint16 i,j;
	if((powerflag == 1)&&(powersflag == 0))
	{
		CurrentModify();
		j = 0;
		for(i=0;i<128;i+=2)
		{
			a = fft_ua[i] * fft_ia[i];
			b = fft_ua[i + 1] * fft_ia[i + 1];
			c = fft_ua[i + 1] * fft_ia[i];
			d = fft_ua[i] * fft_ia[i + 1];
			p_a[j] = ((a + b) >> 16);
			q_a[j] = ((c - d) >> 16);
			j ++;
		}
		j = 0;
		for(i=0;i<128;i+=2)
		{
			a = fft_ub[i] * fft_ib[i];
			b = fft_ub[i + 1] * fft_ib[i + 1];
			c = fft_ub[i + 1] * fft_ib[i];
			d = fft_ub[i] * fft_ib[i + 1];
			p_b[j] = ((a + b) >> 16);
			q_b[j] = ((c - d) >> 16);
			j += 2;
		}
		j = 0;
		for(i=0;i<128;i+=2)
		{
			a = fft_uc[i] * fft_ic[i];
			b = fft_uc[i + 1] * fft_ic[i + 1];
			c = fft_uc[i + 1] * fft_ic[i];
			d = fft_uc[i] * fft_ic[i + 1];
			p_c[j] = ((a + b) >> 16);
			q_c[j] = ((c - d) >> 16);
			j += 2;
		}
		powerflag = 0;
		powersflag = 1;
	}
}

/* 总的有功功率、无功功率计算 */
void PowerSum(void)
{
	Uint16 i;
	if(powersflag == 1)
	{
		for(i=0;i<64;i++)  sum_p[0] += p_a[i];
		for(i=0;i<64;i++)  sum_p[1] += p_b[i];
		for(i=0;i<64;i++)  sum_p[2] += p_c[i];
		for(i=0;i<64;i++)  sum_q[0] += q_a[i];
		for(i=0;i<64;i++)  sum_q[1] += q_a[i];
		for(i=0;i<64;i++)  sum_q[2] += q_a[i];
		powersflag = 0;
	}
}

⌨️ 快捷键说明

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