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.
在编写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
}
void InitEPwm1Example(void);
interrupt void epwm1_timer_isr(void);
你好,可能是因为中断服务程序的格式问题,您试试在interrupt 前加上两个下划线。