电力行业三次谐波计算

公司有机会接触了一下谐波的判断计算方法,这里简单讲一下。其实我们直接在网上找一些FFT运算的C函数,便可以计算各次谐波,但是当我们只需要某些阶次的谐波时,那么运用FFT的话,就会浪费很多时间,这里我们讲的是 直接用C语言实现某一次的谐波含量计算(三次)。

我用的硬件是DSP2812,为保证采样后计算过程不被打断,计算与判断均放在中断中。

一般而言,如果需要计算采样电流的谐波含量的话,那么肯定会有采样平率和计算周期这些等等的说法。因为基波电流是50HZ,一般而言采样频率必须是被采样电流的频率的两倍以上,才能保证被采样信号的不失真。 

在这里,我们一个周波采样256个采样点,即采样频率为12800HZ。


算法原理:



而利用滑窗迭代进行改进得到:



为加快计算时间,我们用先要建立一个正炫函数表,然后用查表的方法去得到我么需要的sin函数的256个值。我们下面都用函数来模拟采样数值。

   float sinnwt3 =0,cosnwt3 =0;
float ASlidewindow[256];
unsigned char nwt3temp=0 ,DFTslidecount=0;
float An=0 ,Bn ,CurrentDiffA=0,LoadCurrentA=0 ,HaCurrent=0 ;

中断计算程序原理如下:

nwt3temp = (DFTslidecount* 3)&0xff;     //nwt3temp 为整型,初始化为0,乘以3是因为计算的是三次谐波,与上0xff,是因为我们只采样256个点,DFTslidecount为计算次数,指向当前采样值存放在ASlidewindow数组中的当前位置。

cosnwt3 = DFTCosTable[nwt3temp];   //DFTCosTable【】是我们提前准备好的COS函数值表,这里直接查表得到我们想要的值,为加快计算速度。

sinnwt3 = DFTSinTable[nwt3temp];   //同上

LoadCurrentA = 60*sqrt(2)*sin(2*PI*(DFTslidecount&0xff)/256)+10*sqrt(2)*sin(2*PI*(DFTslidecount&0xff)*3/256);  //采样,用函数模拟,可见50HZ基波电流有效值为60A,三次谐波电流有效值为10A

CurrentDiffA = LoadCurrentA - *(ASlidewindow + DFTslidecount)  ;    //CurrentDiffA 意为当前采样值

//LoadCurrentA 为当前DFTslidecount指向的位置的采样值

An += CurrentDiffA* cosnwt3/128;     //迭代法 已减去了当前位置的采样值,替换了新的采样值

Bn += CurrentDiffA* sinnwt3/128; //同上

*(ASlidewindow + DFTslidecount) = LoadCurrentA;     //迭代法  ,替换新的采样值

HaCurrent = (sqrt(PhaseAAn3temp*PhaseAAn3temp+PhaseABn3temp*PhaseABn3temp))/sqrt(2);  //计算三次谐波含量,此时已经是有效值,计算结果为10,正好和LoadCurrentA 的函数模拟采样能对应的上。

DFTslidecount++;

注意:在计算之前,要先准备ASlidewindow数组256个采样初始值,或者舍弃掉前面256个计算值,因为第一次进入中断时,ASlidewindow数组中并没有初始值。

到此,整个程序的计算原理只是将以上两张图片中所阐述的DFT滑窗迭代发计算谐波用代码翻译出来。完毕。

   

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值