【为C2000做贡献】2812的SPWM源程序
[复制链接]
有用的就拷过去,如果感觉好的话,我还会把SVPWM的程序奉上!!
- //SPWM
#include "DSP281x_Device.h" #include "stdio.h" #include "math.h" #include "float.h" #define NX 404 #define PI 3.1415925 float M=0.8; int k0=0,h1=0; double a[NX]; void zkb(); interrupt void eva_T1UFINT_ISR(void); unsigned int n=0; float q,l,j; void main(void) { InitSysCtrl(); //系统初始化 DINT; //禁止全局中断 IER=0x0000; IFR=0x0000;
EALLOW; GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins EDIS;
InitPieCtrl(); InitPieVectTable();
EALLOW; //使能定时器1下益中断 PieVectTable.T1UFINT=&eva_T1UFINT_ISR; EDIS;
IER|=M_INT2; //开中断2 PieCtrlRegs.PIEIER2.bit.INTx6=1; //开下益中断
////////////////////
while (n<=NX) { q=(n+0.75); //为消除偶次偕波,减少谐波角度出发,选择从A相3/4周期进行采样 q=q*2*PI; q/=405; j=sin(q); l=1875*(1+M*j);//M为调制比 //计算占空比表达式 //if(l>=187&l<=1687)(此处网友设置为错误的) if(l>=375&l<=3375) a[n]=l; else { if(l>3375) a[n]=3375; else a[n]=375; }
n=n+1; } //////////////////////////////
///init_eva /////////////////////////////// EvaRegs.ACTRA.all=0x0666; EvaRegs.DBTCONA.all = 0x0000; // Disable deadband EvaRegs.COMCONA.all = 0xa600; //使能比较操作
EvaRegs.EVAIMRA.all=0x0200; //EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能) EvaRegs.EVAIMRB.all=0x0000; EvaRegs.EVAIMRC.all=0x0000; EvaRegs.EVAIFRA.all=0xffff;//EVAIFRA(EVA的中断标志寄存器.T1UIINT(通用定时器1的下溢中断标志) EvaRegs.EVAIFRB.all=0xffff;//写1清除定时器1的下溢中断标志 EvaRegs.EVAIFRC.all=0xffff; EvaRegs.CMPR1=0; //初始化寄存器的值 EvaRegs.CMPR2=0; EvaRegs.CMPR3=0;
EvaRegs.GPTCONA.all=0x0041; //周期必须大于最大的正弦表格值 EvaRegs.T1PR = 3750; // Timer1 period PWM载波周期为 65536个定标的定时器时钟周期 //EvaRegs.T1PR = 0xffff; //EvaRegs.T1CNT = 937; // Timer1 counter EvaRegs.T1CNT = 937; //EvaRegs.T1CON.all = 0x0b4e; // 选择模式产生PWM波10
EvaRegs.T1CON.all = 0x0b4e; EINT;
return; /////////////////////////// EvaRegs.T1CON.all=EvaRegs.T1CON.all|0x0040; //启动定时器1
for(;;); }
interrupt void eva_T1UFINT_ISR(void) // EV-A { int h2; int flag; flag=(EvaRegs.EVAIFRA.all)&0x0200; //T1UFINT中下益中断标志位置1 if(flag!=0x0200) { EINT; return; } else { if(k0<=NX) { h1=k0+135; //B相表达式 if(h1>=404)h1=h1-404; h2=k0+270; //C相表达式 if(h2>=404)h2=h2-404; EvaRegs.CMPR1=a[k0]; EvaRegs.CMPR2=a[h1]; //更新比较寄存器2的值 EvaRegs.CMPR3=a[h2]; //更新比较寄存器3的值 k0=k0+1; } else { k0=0; } }
EvaRegs.EVAIMRA.bit.T1UFINT=1; //清除中断屏蔽标志 EvaRegs.EVAIFRA.bit.T1UFINT=1; //清楚中断使能标志 PieCtrlRegs.PIEACK.all=0x0002; //响应同组中断 EINT; //开全局中断 }
复制代码
|