A/D模块
附录三 系统实物图
附录四 关键部分程序
1、数据处理:
void Deal(uint n) {
float ang1=0,ang2=0; FFT(n,y);
y1[0].rea=y[0].rea; y2[0].rea=y[0].img; for(int i=1;i y1[i].rea=(y[i].rea+y[n-i].rea)/2;//利用共轭对称性 y1[i].img=(y[i].img-y[n-i].img)/2;//X1(k)=[X(k)+X*(N-k)]/2 y2[i].img=(-y[i].rea+y[n-i].rea)/2;//X1(k)=-j*[X(k)-X*(N-k)]/2 y2[i].rea=(y[i].img+y[n-i].img)/2; } ang1=angle(n/32,y1);ang2=angle(n/32,y2); Urms=Modify(n,y1);Irms=Modify(n,y2); Ba=y1[n/32].rea*0.7071068; delta=ang1-ang2;//对比实际和测量值,添加err可相应的补偿误差 } 2、FFT算法: Data *LDsort(int NN,Data *x)//雷德算法 { Data t; int i=0,j=0,k=0; for(i=0;i if(i t=*(x+j); *(x+j)=*(x+i); *(x+i)=t; } k=NN/2; while((k<=j)&(k>0)) { j=j-k; k=k/2; } j=j+k; } return x; } Data *FFT(int NN,Data *y)//N被系统定义过 { Data t,v,wn; int i,j,M,L,B,a,c,f; y=LDsort(NN,y); f=NN;//notice for(M=1;(f=f>>1)!=1;M++);//M=log2(NN)-级数 for(L=1;L<=M;L++) { a=(1< //wn.rea=cos(pi/B);wn.img=-sin(pi/B); //p=J*2^(M-L) (WN)^p=(W2^L)^J=(exp(-j(pi/2^(L-1))))^J (J=0:2^(L-1)-1) wn=WN[L-1]; for(j=0;j for(i=j;i {//同一旋转因子对应着间距为2^L点的2^(M-L)个蝶形,共有2^(L-1)个旋转因子 c=i+B; t.rea=(y+c)->rea*v.rea-(y+c)->img*v.img; t.img=(y+c)->rea*v.img+(y+c)->img*v.rea; (y+c)->rea=(y+i)->rea-t.rea;//X8(k+B)=X7(k)-(Wn^p)*X7(k+B) (y+c)->img=(y+i)->img-t.img; (y+i)->rea=(y+i)->rea+t.rea;//X8(k)=X7(k)+(Wn^p)*X7(k+B) (y+i)->img=(y+i)->img+t.img; } t.rea=v.rea*wn.rea-v.img*wn.img;//更新 t.img=v.rea*wn.img+v.img*wn.rea; v=t; } } return y; } 3、数据采集: int AD574(void) { int H8=0,L4=0,temp=0; A0_L;//12位方式 RC_L;//启动转换 while(STS==1); RC_H;//read data A0_L; H8=P3IN; A0_H; L4=P3IN; #ifndef BIPOLAR //单极性 temp=(H8<<4)+(L4>>4); #else //双极性 if(H8&0x80) temp=((H8&0x7f)<<4)+(L4>>4); else temp=-(((~H8)&0x7f)<<4)+(((~L4)&0xf0)>>4);//过后考虑加上负号,特别注意位的运算 #endif #ifndef RANGE_20V temp/=0.4096;//最大4997,负数时不会出错 #else temp/=0.2048; #endif return temp; }