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.

[参考译文] CCS/TMS320F2.8069万M:中断和中断服务例程

Guru**** 2573695 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642205/ccs-tms320f28069m-interrupts-and-interrupt-service-routines

部件号:TMS320F2.8069万M

工具/软件:Code Composer Studio

我为正弦脉冲宽度调制编写了代码。问题是程序流正在进入EPwm1的ISR,但它没有进入EPwm2的ISR,ePWM 3.please帮助我  

//###################################################################
//说明:
//! \addtogroup f2806x_example_list
//! <h1>ePWM死区生成(ePWM_deadband)</h1>
//!
//! 此示例将ePWM1,ePWM2和ePWM3配置为:
//! -向上/向下计数
//! -死区
//! 其中包括3个示例:
//! - ePWM1:低有效PWM
//! - ePWM2:有源低互补PWM
//! - ePWM3:有源高互补PWM
//!`
//! 每个ePWM都配置为在第三个零事件上中断
//! 发生这种情况时,将修改死区
//! 0 <= DB <= DB_MAX。 即死区将向上移动
//! 介于0和最大值之间。
//!
//! \b外部连接\n
//! - EPWM1A在GPIO0上
//! - EPWM1B位于GPIO1上
//! - EPWM2A位于GPIO2上
//! - EPWM2B在GPIO3上
//! - EPWM3A在GPIO4上
//! - EPWM3B在GPIO5上
//
//
//###################################################################
//$TI发行版:F2806x C/C++头文件和外设示例V151 $
//$发布日期:2016年2月2日$
//$Copyright:版权所有(C) 2011-2016 Texas2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//###################################################################

#include "DSP28x_Project.h"//设备头文件和示例包括文件
包含"math.h"
//#包括"gPI.h"

//本文件中找到的函数的prototype语句。
void InitEPwm1示例(void);

__interrupt void epwm1_isr (void);
__interrupt void epwm2_isr (void);
__interrupt void epwm3_isr (void);

无符号int r,y,b;
浮子ipcb1[300];
浮子ipcb2[300];
浮子ipcb3[300];

#定义PRD 6000
#Define PI 3.14159265358979323846

浮动主阀(空)


//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数可在F2806x_sysctrl.c文件中找到。
InitSysCtrl();

//步骤2. 初始化GPIO:
//此示例函数可在F2806x_gPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例

//在这种情况下,只需初始化ePWM1,ePWM2,ePWM3的GPIO引脚
//这些函数位于F2806x_ePWM.c文件中
Initepwm1gpio();
Initepwm2gpio();
Initepwm3gpio();


//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;

//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于F2806x_PIECTRL.c文件中。
InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在F2806X_DefaultIsr.C.中找到
//此函数可在F2806X_PieVect.C.中找到
InitPieVectorTable();

//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.EPWM1_INT =&epwm1_ISR;
PieVectorTable.EPWM2_INT =&epwm2_isr;
PieVectorTable.EPWM3_INT =&epwm3/isr;

EDIS;//这是禁用写入EALLOW保护寄存器所必需的

//步骤4. 初始化所有设备外围设备:
//此函数位于F2806x_InitPeripherals.c中
// InitPeripherals();//本示例不需要

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

InitEPwm1Example();

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

//启用连接到EPWM1-3 INT的CPU INT3;
IER |= M_INT3;

//在PIE中启用ePWM INTN:组3中断1-3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

//步骤6。 空闲循环。 只需坐下来永远循环(可选):
对于(;;)

_ASM (" NOP");
}

}

__interrupt void epwm1_isr (void)

用于(r=0;r<300;r++)

ipcb1[r]= PRD*sin (2*Pi*r 0.0.0333万);

EPwm1Regs.CMPA.Half.CMPA = ipcb1[r];

if(((((EPwm1Regs.TBCTR-(PRD/2)*2)>(ipcb1[r])//设置操作

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;
}
否则

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAD = AQ_Clear;
}
如果(r=301){
R=0;
}
}

//清除此计时器的INT标志
EPwm1Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}

__interrupt void epwm2_isr (void)

对于(y=0;y<300;y++)

ipcb2[y]=PRD*sin (2*Pi*y 0.0.0333万)+ 2.0.9439万);
EPwm2Regs.CMPA.Half.CMPA = ipcb2[y];

//设置操作
IF (((EPwm2Regs.TBCTR -(PRD/2))*2)>(ipcb2[y]))

EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在CAU上设置PWM2A
EPwm2Regs.AQCTLA.bit.CAD = AQ_Clear;//清除CAD上的PWM2A
EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;
}
否则

EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAD = AQ_Clear;
}
如果(y=301){
Y=0;
}
}

//清除此计时器的INT标志
EPwm2Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}

__interrupt void epwm3_isr (void)

对于(b=0;b<300;b++)

ipcb3[b]= PRD*sin ((2)*PI* 0.0.0333万 *b)- 2.0.9439万);

EPwm3Regs.CMPA.Half.CMPA = ipcb3[b];

if(((((EPwm3Regs.TBCTR-(PRD/2)*2)>(ipcb3[b])//设置操作

EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;
}
否则

EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm3Regs.AQCTLB.bit.CAU = AQ_SET;
EPwm3Regs.AQCTLB.bit.CAD = AQ_Clear;
}
如果(b=301){
B=0;
}


//清除此计时器的INT标志
EPwm3Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}
}
void InitEPwm1示例(void)

EALLOW;

gpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO ³õʼ»¯ÎªepwmÊä³ö
gpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
gpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
gpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
gpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;
gpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;

EDIS;

EPwm1Regs.TBPRD = PRD;//设置计时器周期
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOD;//加载每零个寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//活动低PWM -设置死区
EPwm1Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.in_mode = DBA_All;
EPwm1Regs.DBRED = 270;
EPwm1Regs.DBFED = 270;

//中断,我们将更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm1Regs.ETSEL.bit.inten = 1;//启用INT
EPwm1Regs.ETPS.bit.INTPRD = ET_3;//在第三个事件上生成INT


EPwm2Regs.TBPRD = PRD;//设置计时器周期
EPwm2Regs.TBPHS.Half.TBPHS = 0x0535;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//仅为观察范围而缓慢

//有源低互补PWM -设置死区
EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.in_mode = DBA_All;
EPwm2Regs.DBRED = 270;
EPwm2Regs.DBFED = 270;

//中断,我们将在此处修改死区
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm2Regs.ETSEL.bit.inten = 1;//启用INT
EPwm2Regs.ETPS.bit.INTPRD = ET_3;//在第三个事件上生成INT

EPwm3Regs.TBPRD = PRD;//设置计时器周期
EPwm3Regs.TBPHS.Half.TBPHS = 0xA6A;//相位为0
EPwm3Regs.TBCTR = 0x0000;//清除计数器
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;//速度慢,因此我们可以观察范围

//有源高互补PWM -设置死区
EPwm3Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBCTL.bit.in_mode = DBA_All;
EPwm3Regs.DBRED = 270;
EPwm3Regs.DBFED = 270;

//中断我们将更改死区的位置
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm3Regs.ETSEL.bit.inten = 1;//启用INT
EPwm3Regs.ETPS.bit.INTPRD = ET_3;//在第三个事件上生成INT
}


//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADDAGUDURU,

    您进行了什么调试? 代码是否多次进入PWM1 ISR? 您是否能够查看PWM2和PWM3的标志是否在IFR中发送?  

    请参见 《技术参考手册》的图1-93, 它显示了中断到达CPU所需启用的功能。

    此致,
    科迪