主要流程:(ADC设置:RCC_PCLK2_Div6;ADC_RegularChannelConfig(ADC1, ADC_Channel_5 , 1, ADC_SampleTime_41Cycles5); A和B信号的周期为500微秒)
1、定时器T2=1000ms时开启信号A,T2=1005ms开启ADC + DMA 连续采集信号A信号值 DMAbuf[256]个点,在DMA采集完成中断中 ,关闭ADC+DMA,并把DMAbuf[256]的数据复制给A[256]。
2、定时器T2=1020ms时关闭信号A,开启信号B,T2=1025ms开启ADC + DMA 连续采集信号B信号值 DMAbuf[256]个点,在DMA采集完成中断中 ,关闭ADC+DMA,并把DMAbuf[256]的数据复制给B[256]。
3、定时器T2=1040ms时关闭信号B,随后对A[256]和B[256]进行FFT变换,然后求取两个信号变换后幅值最大的相位。
附上4个图,
求取FFT变换后最大幅值分量的相位部分的程序:
float GetPowerMag(long * Inbuff)
{
float Outbuuf;
signed short lX,lY;
float X,Y,Mag;
unsigned long MAG[128] = {0};
unsigned long MaxMag = 0,MaxMagBuf = 0;
float phrase = 0;
unsigned short i,j;
for(i=0;i<128;i++)
{
lX = (Inbuff << 16) >> 16; //实部
lY = (Inbuff >> 16); //虚部
X = 256 * ((float)lX) / 32768;
Y = 256 * ((float)lY) / 32768;
Mag = sqrt(X * X + Y * Y) / 256; //求取幅值
if(i == 0)
{
MAG = (unsigned long)(Mag * 32768); //直流分量
}
else
{
MAG = (unsigned long)(Mag * 65536); //除直流分量外的幅值
}
}
for(j=1;j<128;j++)
{
if(MaxMag < MAG[j]) //判断最大幅值的数据
{
MaxMag = MAG[j];
MaxMagBuf = Inbuff[j]; //提取最大幅值对应的FFT变换后的数据
}
}
lX = (MaxMagBuf << 16) >> 16;
lY = (MaxMagBuf >> 16);
phrase =atan2(lY,lX); //相位弧度
Outbuuf = phrase*180.0f/3.1415926f; //相位角度换算
return Outbuuf;
}
通过打印出的数据发现处理完后得到AB信号相位的数据不固定,在某一范围内浮动没有规律,这种情况怎么处理? |