📄 dataprocessing.c
字号:
#include "2407.h"
#include "AD.h"
#include "fft.h"
#include "qmath.h"
#include "spwm.h"
#pragma DATA_SECTION(ipcb,"FFTipcb")
int ipcb[TWON*2];
int Magpcb[TWON];
int MagAndPhase[TotalChanel][MaxHamanic*2]; // 幅值和相位
int Valnue[TotalChanel]; //有效值
FFT128C fft=FFT128C_DEFAULTS;
int DataInit()
{
int i,*pData=MagAndPhase[0];
for(i=0;i<TotalChanel*MaxHamanic*2;i++)
*(pData++)=0;
pData=AD_DATA_Y;
for(i=0;i<N;i++)
*(pData++)=qsinlt(i*1024);
}
int DataProc() //数据处理FFT变换
{
int i,sum,temp;
long Phasetemp;
int *PMagpcb,*PMagAndPhase;
sum=0;
fft.ipcbptr=ipcb;
fft.magptr=Magpcb;
fft.init();
for(i=0;i<TWON;i++)
ipcb[i]=AD_DATA_Y[i];
resave(ipcb,ipcb,TWON);
fft.izero(&fft);
fft.calc(&fft);
fft.mag(&fft);
PMagpcb=Magpcb;
PMagAndPhase=MagAndPhase[0];
for(i=0;i<21;i++)
{
temp=*PMagpcb; //Q14
sum+=temp;
temp=qsqrt((long)temp<<18)>>1; //Q7--->Q15 first <<2<<7
temp*=2;
*PMagAndPhase=temp;
PMagpcb++;
PMagAndPhase++;
if ( temp<2 )
{
*PMagAndPhase=0;
PMagAndPhase++;
continue;
}
temp=ipcb[i*2]; //实部
if (temp==0)
{
if (ipcb[i*2+1]>0)
*PMagAndPhase=16384 ; //90+90,最大360----1,Q15
else
if (ipcb[i*2+1]>=0)
*PMagAndPhase=0 ; //-90+90 0
}
else
{
Phasetemp=qinv1(temp); //16.16
Phasetemp=(Phasetemp>>16)*ipcb[i*2+1]; //16.16
Phasetemp=qatan(Phasetemp); //Q15
Phasetemp>>1; //0.5倍,PI到2PI
if (ipcb[i*2]<0)
Phasetemp-=8192 ; //-180+90
else
Phasetemp+=8192 ;
*PMagAndPhase=Phasetemp;
PMagAndPhase++;
}
}
sum=qsqrt((long)sum<<18)>>1; //有效值
sum=(long)sum*46430>>15; //46430,根号2
Valnue[0]=sum;
//赋值处理,应该有限幅处理
//相位
if(spwm_moudle.ControlMode==CloseControl) //闭环控制
{
spwm_moudle.Angle[0]=MagAndPhase[0][7]+16384; //3次
spwm_moudle.Angle[1]=MagAndPhase[0][11]+16384; //5次
spwm_moudle.Angle[2]=MagAndPhase[0][15]+16384; //7次
spwm_moudle.Ample[0]=PID_Control_Amgple(MagAndPhase[0][6]); //3
spwm_moudle.Ample[1]=PID_Control_Amgple(MagAndPhase[0][10]); //5
spwm_moudle.Ample[2]=PID_Control_Amgple(MagAndPhase[0][14]); //7
calc_save_pwm();
}
return 0;
}
void calc_save_pwm()
{
int i;
int *PWMbuf,*PWMData;
spwm_calc(&spwm_moudle);
PWMbuf=PWM_Buf;
PWMData=PWM_Pulse;
for(i=0;i<384;i++)
*(PWMData++)=*(PWMbuf++);
return;
}
int PID_Control_Amgple(int InputCur) //输入为电流Q15,输出为调制度Q15
{
int Vout;
asm(" SETC OVM "); //设置溢出保护
Vout=(long)InputCur*spwm_moudle.Kp>>15; //Q15*Q15---->Q15
Vout=(long)Vout*MaxCur*MaxP>>15; //Q15--->Q0
if(Vout>MaxHamanicVout)
Vout=MaxHamanic;
if(Vout<MinHamanicVout) //输出限幅
Vout=MinHamanicVout;
Vout=Vout*spwm_moudle.VoutToMaudleK; //调制度Q0*Q15--->Q15 //溢出保护
asm(" CLRC OVM ");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -