基于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_SECTIONsine_table,“IQmathTables“; _iq30 sine_table[512]; define PI 3.14 interrupt void eva_T1UFINT_ISRvoid; interrupt void CAP_INT3_ISRvoid; interrupt void ADC_FIR_INT_ISRvoid; // 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*_IQ0.0625,100* _IQ0.25, 100*_IQ0.375, 100*_IQ0.25, _IQ0.0625}; define AdcFsV oltage _IQ3.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_IQ4100; float Vmax_IQ4090; // 对程序中用到的常数值进行宏定义赋值//pi 参数 iq 格式float kp_IQ1; float ki_IQ0.2; float kip_IQ10; void mainvoid { /*初始化系统 */ 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; whileAdcRegs.ADC_ST_FLAG .bit.SEQ1_BSY0 { AdcRegs.ADCTRL2.bit.SOC_SEQ11; } for;; { KickDog; } } interrupt void eva_T1UFINT_ISRvoid { //查表方式(固化正弦表)//EvaRegs.CMPR1 EvaRegs.T1PR-_IQsat_IQ30mpysine_table[index]_IQ300.9999,EvaRegs.T1PR/2,EvaRegs.T1PR,0; //计算得出新的正弦表SIN _IQsat_IQ30mpysine_table[SS]_IQ300.9999,EvaRegs.T1PR/2,EvaRegs.T1PR,0; SIN2 _IQsat_IQ30mpy-sine_table[SS]_IQ300.9999,EvaRegs.T1PR/2,EvaRegs.T1PR,0; SS; ifSS 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_ISRvoid //定义 cap 中断{ SS0; //指针复位EvaRegs.EVAIFRC.bit.CAP3INT1; PieCtrl.PIEACK.all PIEACK_GROUP3; } interrupt void ADC_FIR_INT_ISRvoid // ADC { static Uint16 ibuf0; PieCtrl.PIEACK.all PIEACK_GROUP1; /*** Manage the ADC registers ***/ AdcRegs.ADCTRL2.bit.RST_SEQ1 1; // 复位 SEQ1 到 CONV00 状态AdcRegs.ADC_ST_FLAG .bit.INT_SEQ1_CLR1; // 清楚 ADC SEQ1 中断标志/*** 读取 ADC 结果1 将无符号 16-bit 结果转换成 32-bit IQ16 格式2 将 IQ16 格式转换为 IQ 格式3 根据 ADC 满量程定标***/ AData[ibuf]AdcRegs.RESULT04; //采样电压值AData1[ibuf]AdcRegs.RESULT14; //采样电流值AdcBuf[ibuf] _IQmpyAdcFsV oltage, _IQ16toIQ _iqAdcRegs.RESULT0; AdcBuf1[ibuf] _IQmpyAdcFsV oltage, _IQ16toIQ _iqAdcRegs.RESULT1; xDelay[0] AdcBuf[ibuf]; AdcBufFiltered[ibuf] IQssfirxDelay, coeffs, N; xDelay1[0] AdcBuf1[ibuf]; AdcBufFiltered1[ibuf] IQssfirxDelay1, coeffs, N; vf[ibuf] A dcBufFiltered[ibuf]; //采样电压值Ig[ibuf] A dcBufFiltered1[ibuf]; //采样电流值// 电 压 电 流 双 闭 环 函 数SIN1 _IQsat_IQ30mpysine_table[ibuf]_IQ300.9999,2047,4095,0; vref[ibuf]SIN1; ev[ibuf] vref[ibuf]- vf[ibuf] ; if ibuf0 { 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 MVs[ibuf]/4096; else M-Vs[ibuf]/4096; //考虑一下 Vs[k] 的正负值 确保 M 是 0-1 的值ibuf 4; ifibuf 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 ***/ fori0; i n-1; i { y y _IQmpy*a--, *x; // filter tap *xold-- *x--; // delay line update } /*** Finish up ***/ returny; } //end IQssfir /********************************************************************* * 函数 DelayUs * *********************************************************************/ void DelayUs volatile Uint16 Usec { while Usec-- // 1us loop at 150MHz CPUCLK { asm“ RPT 139 || NOP“; } } // end DelayUs // // No more. //