////TMDXALPHARELEASE//Intendedforproductevaluationpurposes////###########################################################################////FILE:DSP28_Example.c////TITLE:DSP28CPU_Timerexampleprogram.////###########################################################################////Ver|ddmmmyyyy|Who|Descriptionofchanges//=====|=============|======|===============================================//0.55|06May2002|S.S.|EzDSPAlphaRelease//0.57|27May2002|L.H.|Nochange//###########################################################################//Step0.Includerequiredheaderfiles//DSP28_Device.h:devicespecificdefinitions#includestatementsfor//alloftheperipheral.hdefinitionfiles.//DSP28_Example.hisspecificforthegivenexample.#includeDSP28_Device.h#includeIQmathLib.h#pragmaDATA_SECTION(sine_table,IQmathTables);_iq30sine_table[512];#definePI3.14interruptvoideva_T1UFINT_ISR(void);interruptvoidCAP_INT3_ISR(void);interruptvoidADC_FIR_INT_ISR(void);//ADC服务中断Uint16ConversionCount=0;Uint16SS=0;Uint16n=0;Uint16SIN=0;Uint16SIN1=0;Uint16SIN2=0;_iq30sine_table[512];//jiayujintshortintAData[512]={0};shortintAData1[512]={0};extern_iqIQssfir(_iq*,_iq*,Uint16);#defineN5//滤波器长度_iqxDelay[N]={0,0,0,0,0};_iqxDelay1[N]={0,0,0,0,0};//filtercoefficients_iqcoeffs[N]={100*_IQ(0.0625),100*_IQ(0.25),100*_IQ(0.375),100*_IQ(0.25),_IQ(0.0625)};#defineAdcFsVoltage_IQ(3.0)//ADC满量程电压#defineAdcBufLen512//ADC结果缓冲长度_iqAdcBuf[AdcBufLen];//ADC结果缓冲_iqAdcBuf1[AdcBufLen];_iqAdcBufFiltered[AdcBufLen];//滤波后电流的ADC结果缓冲_iqAdcBufFiltered1[AdcBufLen];//滤波后电压的ADC结果缓冲_iqvf[AdcBufLen];//滤波后电流的ADC结果缓冲_iqIf[AdcBufLen];//滤波后电压的ADC结果缓冲_iqIg[AdcBufLen];_iqvref[AdcBufLen];//需要转换iq格式已经转化到调整环内的IQ格式_iqev[AdcBufLen];_iqei[AdcBufLen];_iqVs[AdcBufLen];floatM;floatImax=_IQ(4100);floatVmax=_IQ(4090);//对程序中用到的常数值进行宏定义赋值//pi参数iq格式floatkp=_IQ(1);floatki=_IQ(0.2);floatkip=_IQ(10);voidmain(void){/*初始化系统*/InitSysCtrl();/*关中断*/DINT;IER=0x0000;IFR=0x0000;/*初始化PIE控制寄存器*/InitPieCtrl();/*初始化PIE矢量表*/InitPieVectTable();/*初始GPIO*/InitGpio();InitAdc();//初始化ADCEALLOW;PieVectTable.CAPINT3=&CAP_INT3_ISR;PieVectTable.ADCINT=&ADC_FIR_INT_ISR;PieVectTable.T1UFINT=&eva_T1UFINT_ISR;EDIS;PieCtrl.PIEIER1.bit.INTx6=1;//开AD中断PieCtrl.PIEIER2.bit.INTx6=1;//开下益中断PieCtrl.PIEIER3.bit.INTx7=1;//开CAP中断IER|=0x0007;EINT;//使能全局中断INTMERTM;//使能全局实时中断DBGM/*初始化EV*/InitEv();while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0){AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;}for(;;){KickDog();}}interruptvoideva_T1UFINT_ISR(void){//查表方式(固化正弦表)//EvaRegs.CMPR1=EvaRegs.T1PR-_IQsat(_IQ30mpy(sine_table[index]+_IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);//计算得出新的正弦表SIN=_IQsat(_IQ30mpy(sine_table[SS]+_IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);SIN2=_IQsat(_IQ30mpy(-sine_table[SS]+_IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);SS++;if(SS==512){SS=0;}//EvaRegs.CMPR1=INPUT[SS];EvaRegs.CMPR1=SIN;EvaRegs.CMPR2=SIN2;EvaRegs.EVAIFRA.bit.T1UFINT=1;//复位定时器1下溢中断标志PieCtrl.PIEACK.all=PIEACK_GROUP2;//响应该中断并允许从组2中接受更多的中断}interruptvoidCAP_INT3_ISR(void)//定义cap中断{SS=0;//指针复位EvaRegs.EVAIFRC.bit.CAP3INT=1;PieCtrl.PIEACK.all=PIEACK_GROUP3;}interruptvoidADC_FIR_INT_ISR(void)//ADC{staticUint16ibuf=0;PieCtrl.PIEACK.all=PIEACK_GROUP1;/***ManagetheADCregisters***/AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位SEQ1到CONV00状态AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;//清楚ADCSEQ1中断标志/***读取ADC结果:1)将无符号16-bit结果转换成32-bitIQ16格式2)将IQ16格式转换为IQ格式3)根据ADC满量程定标***/AData[ibuf]=AdcRegs.RESULT04;//采样电压值AData1[ibuf]=AdcRegs.RESULT14;//采样电流值AdcBuf[ibuf]=_IQmpy(AdcFsVoltage,_IQ16toIQ((_iq)AdcRegs.RESULT0));AdcBuf1[ibuf]=_IQmpy(AdcFsVoltage,_IQ16toIQ((_iq)AdcRegs.RESULT1));xDelay[0]=AdcBuf[ibuf];AdcBufFiltered[ibuf]=IQssfir(xDelay,coeffs,N);xDelay1[0]=AdcBuf1[ibuf];AdcBufFiltered1[ibuf]=IQssfir(xDelay1,coeffs,N);vf[ibuf]=AdcBufFiltered[ibuf];//采样电压值Ig[ibuf]=AdcBufFiltered1[ibuf];//采样电流值//电压电流双闭环函数SIN1=_IQsat(_IQ30mpy(sine_table[ibuf]+_IQ30(0.9999),2047),4095,0);vref[ibuf]=SIN1;ev[ibuf]=vref[ibuf]-vf[ibuf];if(ibuf==0){Ig[ibuf]=kp*ev[ibuf]+ki*ev[ibuf];if(Ig[ibuf]=Imax)//电压环限幅考虑输出Ig正负Ig[ibuf]=Imax;elseif(Ig[ibuf]=-Imax)Ig[ibuf]=-Imax;Ig[0]=Ig[ibuf];ei[ibuf]=Ig[ibuf]-If[ibuf];//电流环运算Vs[ibuf]=kip*ei[ibuf];if(Vs[ibuf]=Vmax)//电流环限幅Vs[ibuf]=Vmax;elseif(Vs[ibuf]=-Vmax)Vs[ibuf]=-Vmax;Vs[0]=Vs[ibuf];}else{Ig[ibuf]=kp*(ev[ibuf]-ev[ibuf-1])+ki*ev[ibuf];if(Ig[ibuf]=Imax)//电压环限幅考虑输出Ig正负Ig[ibuf]=Imax;elseif(Ig[ibuf]=-Imax)Ig[ibuf]=-Imax;Ig[ibuf-1]=Ig[ibuf];ei[ibuf]=Ig[ibuf]-If[ibuf];//电流环运算Vs[ibuf]=kip*(ei[ibuf]-ei[ibuf-1]);//电流环限幅if(Vs[ibuf]=Vmax)Vs[ibuf]=Vmax;elseif(Vs[ibuf]=-Vmax)Vs[ibuf]=-Vmax;Vs[ibuf-1]=Vs[ibuf];}if(Vs[ibuf]=0)M=Vs[ibuf]/4096;elseM=-Vs[ibuf]/4096;//考虑一下Vs[k]的正负值确保M是0-1的值ibuf+=4;if(ibuf==AdcBufLen){ibuf=0;}}//函数结束返回调制度M_iqIQssfir(_iq*x,_iq*a,Uint16n){Uint16i;//generalpurpose_iqy;//result_iq*xold;//delaylinepointer/***Setupthepointers***/a=a+(n-1);//apointstolastcoefficientx=x+(n-1);//xpointstolastbufferelementxold=x;//xoldpointstolastbufferelement/***Lasttaphasnodelaylineupdate***/y=_IQmpy(*a--,*x--);/***Dotheothertapsfromendtobeginning***/for(i=0;in-1;i++){y=y+_IQmpy(*a--,*x);//filtertap*xold--=*