📄 main.c
字号:
#include "DSP28_Device.h"
#include "fft.h"
#include "math.h"
#define N 128
#pragma DATA_SECTION(ipcb, "FFTipcb");
#pragma DATA_SECTION(mag, "FFTmag");
CFFT32 fft=CFFT32_128P_DEFAULTS;
long ipcb[2*N];
long mag[N];
Uint16 m=0,n=0,trigflag=0;
int i=0,k=0,zhy=0,countad=0,nzh=0,bb=0;
int temp2,temp3,temp4;
double P=0,Q=0,pf=0,pf1=0,f=50,q=0,Qtemp1=0,S=0,Qtemp2=0;
double t=0,trigarf=0,oldtrig=0,newtrig=0;
double Va[256],Ia[256],va=0,ia=0,Vac[256],Iac[256];
double arf=0,temp=0,detQ=0,arfva=0,arfia=0;
const double tcrq[46]={-5147.6387,-4918.9476,-4690.8134,-4463.7902,-4238.4268,\
-4015.2637,-3794.8308,-3577.6449,-3364.2067,-3154.9988,-2950.483,-2751.0985,\
-2557.2593,-2369.3525,-2187.7363,-2012.7381,-1844.6533,-1683.7434,-1530.235,\
-1384.3187,-1246.1481,-1115.8391,-993.4692,-879.0772,-772.6632,-674.1883,\
-583.5749,-500.7073,-425.4317,-357.5577,-296.8586,-243.0728,-195.9051,-155.0279,\
-120.0832,-90.6837,-66.4156,-46.8396,-31.4938,-19.8958,-11.5447,-5.9239,-2.5034,\
-0.7427,-0.0929,0};
const double Qd=0,qd=0;//qd的值需根据负载变化计算确定,表示是否需要补偿的尺度;Qd表示连续两次计算的无功差值,决定是否需要重新计算触发角;
double zero_kCAP3,zero_kCAP4,zero_kCAP6;
double yy=0;
double arfcount=0,quotient=0;
void counttrig()//角度计算
{
pf1=0.8;//用户指定的功率因数
detQ=0;//实验时设定值
detQ=Q;//需要补偿的无功量
for(i=0;i<=46;i++)
{
if (detQ>tcrq[i])
{
temp=tcrq[i];
t=i;
}
else
{
temp=tcrq[i-1];
t=i-1;
break;
}
}
trigarf=(90+2*t);
trigflag=1;
}
void FFT(double b[])
{
fft.ipcbptr=ipcb;
fft.magptr=mag;
fft.init(&fft);
for(i=0;i<128;i++)
{
ipcb[i]=(long)(b[i])<<12;
}
CFFT32_brev1(ipcb,ipcb,N);
fft.izero(&fft);
fft.calc(&fft);
fft.mag(&fft);
}
double countyouxiaozhi(double a[])
{
temp=0;
for(i=0;i<256;i++)
{
temp=a[i]*a[i]+temp;
}
temp=temp/256;
temp=sqrt(temp);
return temp;
}
interrupt void ad(void);
interrupt void CAPINT3(void);
interrupt void CAPINT4(void);
interrupt void CAPINT6(void);
interrupt void T2CINT(void);
interrupt void T3CINT(void);
interrupt void T4CINT(void);
void main(void)
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EvaRegs.EVAIFRC.bit.CAP3INT=1;
EvaRegs.EVAIMRC.bit.CAP3INT=1;
EvbRegs.EVBIFRC.bit.CAP4INT=1;
EvbRegs.EVBIMRC.bit.CAP4INT=1;
EvbRegs.EVBIFRC.bit.CAP6INT=1;
EvbRegs.EVBIMRC.bit.CAP6INT=1;
EvaRegs.EVAIFRB.bit.T2CINT= 1;
EvaRegs.EVAIMRB.bit.T2CINT= 1;
EvbRegs.EVBIFRA.bit.T3CINT= 1;
EvbRegs.EVBIMRA.bit.T3CINT= 1;
EvbRegs.EVBIFRB.bit.T4CINT= 1;
EvbRegs.EVBIMRB.bit.T4CINT= 1;
PieCtrl.PIEIER3.bit.INTx2=1;
PieCtrl.PIEIER3.bit.INTx7=1;
PieCtrl.PIEIER4.bit.INTx5=1;
PieCtrl.PIEIER5.bit.INTx2=1;
PieCtrl.PIEIER5.bit.INTx5=1;
PieCtrl.PIEIER5.bit.INTx6=1;
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ADCINT=&ad;
PieVectTable.CAPINT6=&CAPINT6;
PieVectTable.CAPINT3=&CAPINT3;
PieVectTable.CAPINT4=&CAPINT4;
PieVectTable.T2CINT = &T2CINT;
PieVectTable.T2CINT = &T3CINT;
PieVectTable.T2CINT = &T4CINT;
EDIS; // This is needed to disable write to EALLOW protected registers
InitGpio();
InitEv();
InitAdc();
EvaRegs.COMCONA.bit.FCOMPOE=1;//使能PWM1-6
//PieCtrl.PIEIER3.bit.INTx7=0;
IER|=(M_INT1|M_INT3|M_INT4|M_INT5); //cpu级中断允许
//KickDog();
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
for(;;)
{
for(n=0;n<=200;n++)
{
for(m=0;m<=30000;m++)
{}
}
if (countad>=256)
{
countad=0;
for(i=0;i<=255;i++)
{
Vac[i]=Va[i];
Iac[i]=Ia[i];
}
va=countyouxiaozhi(Vac);
ia=countyouxiaozhi(Iac);
P=0;
for(i=0;i<256;i++)
{
P=Vac[i]*Iac[i]+P;
}
P=P/256;
S=va*ia;
pf=P/S;
Q=sqrt(S*S-P*P);
FFT(Vac);
arfva=atan2(ipcb[2],ipcb[3])*180/3.1415926;
if(arfva<0)
arfva=360+arfva;
FFT(Iac);
arfia=atan2(ipcb[2],ipcb[3])*180/3.1415926;
if(arfia<0)
arfia=360+arfia;
arf=arfia-arfva;
if(arf<-180)
arf=arf+360;
if(arf>180)
arf=arf-360;
if(arf>0)
{ Q=Q;
pf=pf;}
else
{Q=0-Q;
pf=0-pf;}
}
//if(abs(Q-Qtemp1)>3000)
//{trigflag=0;
//Qtemp1=Q;}
if(Q<0&trigflag==1)
{
trigarf-=1;
}
if(Q>0&trigflag==1)
{
if(0.94<pf<=0.97)
{trigarf+=0.5;
}
if(0<pf<=0.94)
{trigarf+=2;
}
}
if(trigflag==0)
{
counttrig();
}
if(trigarf<=90)
trigarf=90;
yy=4687/180.0*trigarf;
arfcount=(long)yy;
}
}
interrupt void CAPINT3(void)
{
nzh+=1;
EvaRegs.T2CON.bit.TENABLE=1;//使用定时器操作
EvaRegs.T2CNT=0;
EvaRegs.T2CMPR = arfcount;
EvaRegs.CAPFIFOA.bit.CAP3FIFO=1;
EvaRegs.EVAIFRC.bit.CAP3INT=1;
PieCtrl.PIEACK.all=0x0004;
EINT; //开全局中断
return;
}
interrupt void T2CINT(void)
{
temp2=EvaRegs.T2CNT;
bb+=2;
EINT;
if(GpioDataRegs.GPADAT.bit.GPIOA6==0)
{
GpioDataRegs.GPADAT.bit.GPIOA0= 0;//PWM1输出低
while(EvaRegs.T2CNT<temp+5);
GpioDataRegs.GPADAT.bit.GPIOA0= 1;//PWM1输出高
}
else
{
GpioDataRegs.GPADAT.bit.GPIOA1= 0;//PWM2输出低
while(EvaRegs.T2CNT<temp+5);
GpioDataRegs.GPADAT.bit.GPIOA1= 1;//PWM2输出高
}
EvaRegs.T2CON.bit.TENABLE=0;
//EvaRegs.T1CMPR=0xFFFF;
EvaRegs.EVAIMRB.bit.T2CINT=1;
EvaRegs.EVAIFRB.bit.T2CINT=1;
PieCtrl.PIEACK.all=0x0004;
EINT;
return;
}
interrupt void CAPINT4(void)
{
nzh+=1;
EvbRegs.T3CON.bit.TENABLE=1;//使用定时器操作
EvbRegs.T3CNT=0;
EvbRegs.T3CMPR = arfcount;
EvbRegs.CAPFIFOB.bit.CAP4FIFO=1;
EvbRegs.EVBIFRC.bit.CAP4INT=1;
PieCtrl.PIEACK.all=0x0010;
EINT; //开全局中断
return;
}
interrupt void T3CINT(void)
{
temp3=EvbRegs.T3CNT;
EINT;
if(GpioDataRegs.GPADAT.bit.GPIOA7==0)
{
GpioDataRegs.GPADAT.bit.GPIOA2= 0;//PWM1输出低
while(EvbRegs.T3CNT<temp3+5);
GpioDataRegs.GPADAT.bit.GPIOA2= 1;//PWM1输出高
}
else
{
GpioDataRegs.GPADAT.bit.GPIOA3= 0;//PWM2输出低
while(EvbRegs.T3CNT<temp3+5);
GpioDataRegs.GPADAT.bit.GPIOA3= 1;//PWM2输出高
}
EvbRegs.T3CON.bit.TENABLE=0;
//EvaRegs.T1CMPR=0xFFFF;
EvbRegs.EVBIMRA.bit.T3CINT=1;
EvbRegs.EVBIFRA.bit.T3CINT=1;
PieCtrl.PIEACK.all=0x0008;
EINT;
return;
}
interrupt void CAPINT6(void)
{
EvbRegs.T4CON.bit.TENABLE=1;//使用定时器操作
EvbRegs.T4CNT=0;
EvbRegs.T4CMPR = arfcount;
EvbRegs.CAPFIFOB.bit.CAP6FIFO=1;
EvbRegs.EVBIFRC.bit.CAP6INT=1;
PieCtrl.PIEACK.all=0x0010;
EINT; //开全局中断
return;
}
interrupt void T4CINT(void)
{
temp4=EvbRegs.T4CNT;
EINT;
if(GpioDataRegs.GPBDAT.bit.GPIOB6==0)
{
GpioDataRegs.GPADAT.bit.GPIOA4= 0;//PWM1输出低
while(EvbRegs.T4CNT<temp4+5);
GpioDataRegs.GPADAT.bit.GPIOA4= 1;//PWM1输出高
}
else
{
GpioDataRegs.GPADAT.bit.GPIOA5= 0;//PWM2输出低
while(EvbRegs.T4CNT<temp4+5);
GpioDataRegs.GPADAT.bit.GPIOA5= 1;//PWM2输出高
}
EvbRegs.T4CON.bit.TENABLE=0;
//EvaRegs.T1CMPR=0xFFFF;
EvbRegs.EVBIMRB.bit.T4CINT=1;
EvbRegs.EVBIFRB.bit.T4CINT=1;
PieCtrl.PIEACK.all=0x0010;
EINT;
return;
}
interrupt void ad(void)
{
//ad采样子程序
EINT;
IFR=0x0000;
// PieCtrl.PIEIFR1.all = 0;
PieCtrl.PIEACK.all=5;
countad++;
Va[k]=(AdcRegs.RESULT0>>4)*3.0*401.0457/4095.00-569.4849;
Ia[k]=(AdcRegs.RESULT1>>4)*3.0*21.026/4095.00-29.4364;
//Ia[k]=(AdcRegs.RESULT1>>4);
k++;
if(k<256)
{
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
else
{
k=0;
PieCtrl.PIEIER3.bit.INTx7=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -