|
楼主 |
发表于 2007-7-12 15:59:48
|
显示全部楼层
刚才把avr465看了,精度不能满足要求。
用免费的Visual C++ 2005 Express验证了一下算法,还是相当理想的,最终输出如下:
25003602 (Watt0)
21651414 (Watt30)
49 (Watt90)
49 (VAR0)
-12498567(VAR30)
-25003504(VAR90)
866 (PF30)
下面是源程序:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <math.h>
#define PI 3.1415926535
#define SAMPLES 200 // interval 100us @ a 20ms cycle
#define OFFSET 512 // a/d sample dc middle level indicating AC zero
#define SCALE 500 // a/d full scale
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int v[SAMPLES],i0[SAMPLES],i30[SAMPLES],i90[SAMPLES];
unsigned int i;
long watt0,watt30,watt90,var0,var30,var90,temp0,temp1,temp2;
double d;
// make the origin sample data
for(i=0;i<SAMPLES;i++){
v=SCALE*sin(PI*2*i/SAMPLES)+OFFSET;
i0=SCALE*sin(PI*2*i/SAMPLES)+OFFSET;
i30=SCALE*sin(PI*2*i/SAMPLES-PI*2/12)+OFFSET;
i90=SCALE*sin( PI*2*i/SAMPLES-PI*2/4)+OFFSET;
cout<<"
i0:"<<i0<<" i30:"<<i30<<" i90:"<<i90;
}
// process the data
watt0=0;
watt30=0;
watt90=0;
var0=0;
var30=0;
var90=0;
for(i=0;i<SAMPLES;i++){
temp0=v[i+(SAMPLES/4)<SAMPLES?i+(SAMPLES/4):i-(SAMPLES*3/4)]; // voltage in quadrature
temp0-=OFFSET; cout<<'
'<<temp0;
temp1=v; // voltage in phase
temp1-=OFFSET;
temp2=i0;
temp2-=OFFSET;
watt0+=temp1*temp2;
var0+=temp0*temp2;
temp2=i30;
temp2-=OFFSET;
watt30+=temp1*temp2;
var30+=temp0*temp2;
temp2=i90;
temp2-=OFFSET;
watt90+=temp1*temp2;
var90+=temp0*temp2;
}
cout<<'
'<<watt0;
cout<<'
'<<watt30;
cout<<'
'<<watt90;
cout<<'
'<<var0;
cout<<'
'<<var30;
cout<<'
'<<var90;
// Power Factor
watt30/=4000;
var30/=4000;
d=watt30*watt30+var30*var30;
d=sqrt(d)/1000;
d=watt30/d;
temp0=d;
cout<<'
'<<temp0;
return 0;
} |
|