基于DSP2812控制的单相光伏逆变器程序代码
// // TMDX ALPHA RELEASE // Intended for product evaluation purposes // //########################################################################### // // FILE: DSP28_Example.c // // TITLE: DSP28 CPU_Timer example program. // //########################################################################### // // Ver | dd mmm yyyy | Who | Description of changes // =====|=============|======|=============================================== // 0.55| 06 May 2002 | S.S. | EzDSP Alpha Release // 0.57| 27 May 2002 | L.H. | No change //########################################################################### // Step 0. Include required header files // DSP28_Device.h: device specific definitions #include statements for // all of the peripheral .h definition files. // DSP28_Example.h is specific for the given example. #include “DSP28_Device.h“ #include “IQmathLib.h“ #pragma DATA_SECTION(sine_table,“IQmathTables“); _iq30 sine_table[512]; #define PI 3.14 interrupt void eva_T1UFINT_ISR(void); interrupt void CAP_INT3_ISR(void); interrupt void ADC_FIR_INT_ISR(void); // ADC 服务中断Uint16 ConversionCount = 0; Uint16 SS = 0; Uint16 n = 0; Uint16 SIN = 0; Uint16 SIN1 = 0; Uint16 SIN2 = 0; _iq30 sine_table[512]; //jiayujint short int AData[512]={0}; short int AData1[512]={0}; extern _iq IQssfir(_iq*, _iq*, Uint16); #define N 5 // 滤波器长度_iq xDelay[N] = {0, 0, 0, 0, 0}; _iq xDelay1[N] = {0, 0, 0, 0, 0}; // filter coefficients _iq coeffs[N] = {100*_IQ(0.0625),100* _IQ(0.25), 100*_IQ(0.375), 100*_IQ(0.25), _IQ(0.0625)}; #define AdcFsV oltage _IQ(3.0) // ADC 满量程电压#define AdcBufLen 512 // ADC 结果缓冲长度_iq AdcBuf[AdcBufLen]; // ADC 结果缓冲_iq AdcBuf1[AdcBufLen]; _iq AdcBufFiltered[AdcBufLen]; // 滤波后电流的 ADC 结果缓冲_iq AdcBufFiltered1[AdcBufLen]; // 滤 波 后电压的 ADC 结果缓冲_iq vf[AdcBufLen]; // 滤波后电流的 ADC 结果缓冲_iq If[AdcBufLen]; // 滤波后电压的 ADC 结果缓冲_iq Ig[AdcBufLen]; _iq vref[AdcBufLen]; //需要转换 iq 格式 已经转化到调整环内的IQ 格式_iq ev[AdcBufLen]; _iq ei[AdcBufLen]; _iq Vs[AdcBufLen]; float M; float Imax=_IQ(4100); float Vmax=_IQ(4090); // 对程序中用到的常数值进行宏定义赋值//pi 参数 iq 格式float kp=_IQ(1); float ki=_IQ(0.2); float kip=_IQ(10); void main(void) { /*初始化系统 */ InitSysCtrl(); /*关中断 */ DINT; IER = 0x0000; IFR = 0x0000; /*初始化 PIE 控制寄存器 */ InitPieCtrl(); /*初始化 PIE 矢量表 */ InitPieVectTable(); /*初始 GPIO*/ InitGpio(); InitAdc(); // 初始化 ADC EALLOW; PieVectTable.CAPINT3 = PieVectTable.ADCINT = PieVectTable.T1UFINT= EDIS; PieCtrl.PIEIER1.bit.INTx6 = 1; // 开 AD 中断PieCtrl.PIEIER2.bit.INTx6 = 1; // 开下益中断PieCtrl.PIEIER3.bit.INTx7 = 1; // 开 CAP 中断IER |= 0x0007 ; EINT; //使能全局中断 INTM ERTM; //使能全局实时中断 DBGM /*初始化 EV*/ InitEv(); while(AdcRegs.ADC_ST_FLAG .bit.SEQ1_BSY==0) { AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; } for(;;) { KickDog(); } } interrupt void eva_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 中接受更多的中断} interrupt void CAP_INT3_ISR(void) //定义 cap 中断{ SS=0; //指针复位EvaRegs.EVAIFRC.bit.CAP3INT=1; PieCtrl.PIEACK.all = PIEACK_GROUP3; } interrupt void ADC_FIR_INT_ISR(void) // ADC { static Uint16 ibuf=0; PieCtrl.PIEACK.all = PIEACK_GROUP1; /*** Manage the ADC registers ***/ AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位 SEQ1 到 CONV00 状态AdcRegs.ADC_ST_FLAG .bit.INT_SEQ1_CLR=1; // 清楚 ADC SEQ1 中断标志/*** 读取 ADC 结果:1) 将无符号 16-bit 结果转换成 32-bit IQ16 格式2) 将 IQ16 格式转换为 IQ 格式3) 根据 ADC 满量程定标***/ AData[ibuf]=AdcRegs.RESULT0>>4; //采样电压值AData1[ibuf]=AdcRegs.RESULT1>>4; //采样电流值AdcBuf[ibuf] = _IQmpy(AdcFsV oltage, _IQ16toIQ( (_iq)AdcRegs.RESULT0)); AdcBuf1[ibuf] = _IQmpy(AdcFsV oltage, _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] = A dcBufFiltered[ibuf]; //采样电压值Ig[ibuf] = A dcBufFiltered1[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; else if (Ig[ibuf]=Vmax) //电流环限幅Vs[ibuf]=Vmax; else if (Vs[ibuf]=Imax) //电压环限幅 考虑输出 Ig 正负Ig[ibuf]=Imax; else if (Ig[ibuf]=Vmax) Vs[ibuf]=Vmax; else if (Vs[ibuf]=0) M=Vs[ibuf]/4096; else M=-Vs[ibuf]/4096; //考虑一下 Vs[k] 的正负值 确保 M 是 0-1 的值ibuf +=4; if(ibuf == AdcBufLen) { ibuf = 0; } } //函数结束 返回调制度 M _iq IQssfir(_iq *x, _iq *a, Uint16 n) { Uint16 i; // general purpose _iq y; // result _iq *xold; // delay line pointer /*** Setup the pointers ***/ a = a + (n-1); // a points to last coefficient x = x + (n-1); // x points to last buffer element xold = x; // xold points to last buffer element /*** Last tap has no delay line update ***/ y = _IQmpy(*a--, *x--); /*** Do the other taps from end to beginning ***/ for(i=0; i