This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: F28335

Part Number: TMS320F28335

在编写SPWM。

思路是:利用TB模块设置载波,CMPA模块设置比较点,通过中断的方式不断刷新比较点,得到SPWM波。

但在程序中没有找到    PieVectTable.EPWM1_TZINT=&epwm1_timer_isr;    中的epwm1_timer_isr(不太确定这个是不是中断地址)提示没有被定义,不知道具体在哪个文件中。

-----------------------------------------------------------------------以下是main.c


#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "math.h"

void InitEPwm1Example(void);
interrupt void epwm1_timer_isr(void);

int k,N=256;
float m=0.8; //设置调制度
int COUNT=7500;


int main(void)
{ InitSysCtrl(); //初始化系统
InitEPwm1Gpio(); //初始化GPIO

DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0X0000;
InitPieVectTable(); //初始化中断向量表-主要是CMPA引发的中断

EALLOW;
PieVectTable.EPWM1_TZINT=&epwm1_timer_isr; //把中断的地址赋给中断向量表
EDIS;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

InitEPwm1Example();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //同步时钟 启动所有同步计时器
EDIS;

IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1; //外部中断,使能第三组中断的第一个小中断

EINT; //开CPU级中断相应
ERTM;

}

void InitEPwm1Example(void) //思路:载波,比较点,电平翻转,死区时间
{
EPwm1Regs.TBPRD = COUNT; //频率设置为10k
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; //联合体里面包含结构体
EPwm1Regs.TBCTR = 0x0000; //时基计数器初始化值为0,从零开始计时

EPwm1Regs.CMPA.half.CMPA = 1500; //联合体里面包含结构体
EPwm1Regs.CMPB = 1500;

EPwm1Regs.TBCTL.bit.CTRMODE = 2; //上下计数模式
EPwm1Regs.TBCTL.bit.PHSDIR=0;
EPwm1Regs.TBCTL.bit.HSPCLKDIV=0;
EPwm1Regs.TBCTL.bit.CLKDIV=0;

EPwm1Regs.CMPCTL.bit.SHDWAMODE=0;
EPwm1Regs.CMPCTL.bit.SHDWBMODE=0;
EPwm1Regs.CMPCTL.bit.LOADAMODE=2;
EPwm1Regs.CMPCTL.bit.LOADBMODE=2; //采用影子寄存器下的装载模式2;

EPwm1Regs.AQCTLA.bit.CAU=1;
EPwm1Regs.AQCTLA.bit.CAD=2;
EPwm1Regs.AQCTLB.bit.CAU=2;
EPwm1Regs.AQCTLB.bit.CAD=1; //epwm1输出为互补的pwm波形

EPwm1Regs.ETSEL.bit.INTSEL=1; //事件触发模块寄存器ET
EPwm1Regs.ETSEL.bit.INTEN=1;
EPwm1Regs.ETPS.bit.INTPRD=1; //事件触发为1

EPwm1Regs.DBCTL.all=0xb; //死区双边延时,1011
EPwm1Regs.DBRED=80; //上升沿延时
EPwm1Regs.DBFED=80; //下降沿延时

}

interrupt void epwm1_isr(void) //中断服务程序
{
if(k>=N)
{
k=0;
}
EPwm1Regs.CMPA.half.CMPA=EPwm1Regs.TBPRD*(1+m*sin(2*3.1415926*k/N))/2;
EPwm1Regs.CMPB=EPwm1Regs.TBPRD*(1+m*sin(2*3.1415926*k/N))/2;
k++;

EPwm1Regs.ETCLR.bit.INT=1; //中断标志位清零才能进入下一次的中断,在PWM的ET模块中
PieCtrlRegs.PIEACK.all=PIEACK_GROUP3; //使能中断 PIEACK_GROUP3
}