工具/软件: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
}
//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================