📄 spwm3.c
字号:
//实现了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; //开全局中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -