工具/软件:Code Composer Studio
你好
当我使用 SC TZ GPIO24或59运行 TZ 时、在我的程序中配置了类似这样的 TZ
它被跳闸(无 PWM 波形)、这意味着它没有进入 ISR
#include "F28x_Project.h"
#include "math.h"
#include
#include
#define PWM_PRD 10000;
#define Phi1 1500;//(625) 45度相位
#define Phi2 1500;//(625) 45度相位
#define PI 3.14159265358979323846
//uint32 EPwm1TZIntCount;
//uint32 EPwm2TZIntCount;
//void InitTzGpio (void);
void InitEPwm1_2Example (void);
void LED_init();控制卡上的//LED
//void InitEPwm2Examples(void);//void InitEPwm3Examples(void);//void InitEPwm4Examples(void);//void InitEPwm5Examples(void);//void InitEPwm6Examples(void);
//void InitEPwmGpio_TZ (void);
_interrupt void epwm1_ISR (void);
unsigned int i=0、m=0、k=0;
unsigned int a=0;
unsigned int b[101]={0};
void main (void)
{
InitSysCtrl();
对于(m=0;m<100;m++)
{
a=sin (pi*0.02*m);
b[m]= 5000*A + 5000;//50%半正弦波周期。
}
B[100]=0;
InitGpio();
EALLOW;
InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm3Gpio();
InitEPwm4Gpio();
InitEPwm5Gpio();
InitEPwm6Gpio();
// InitTzGpio();//TZ1 = GPIO12、TZ2 = GPIO13
// InitEPwmGpio_TZ ();
//GpioCtrlRegs.GPBDIR.bit.GPIO52=1;
EDIS;
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT =&epwm1_ISR;
InitEPwm1_2Examples();
//InitEPwm2Examples();//InitEPwm3Examples();//InitEPwm4Examples();//InitEPwm5Examples();//InitEPwm6Examples();
EDIS;
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3=1;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
for (;;)
{
ASM (" NOP");
}
}
_interrupt void epwm1_ISR (void)
{
GpioDataRegs.GPBDAT.bit.GPIO52=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1;// GPIO26 = GPIO26 //绿色_1
if (EPwm1Regs.TZFlG.bit.OST = 0 && EPwm2Regs.TZFlG.bit.OST = 0)
{//if#1无故障、执行 ISR
a=sin (pi*0.02*i);
如果(A>=0)
{//if#2
EPwm1Regs.CMPA.bit.CMPA =b[i];//EPwm1Regs.CMPB.bit.CMPB =b[i];
EPwm2Regs.CMPA.bit.CMPA =b[i];// EPwm2Regs.CMPB.BIT.CMPB =b[i];
EPwm3Regs.CMPA.bit.CMPA =b[i];// EPwm3Regs.CMPB.BIT.CMPB =b[i];
EPwm4Regs.CMPA.bit.CMPA =b[i];// EPwm4Regs.CMPB.BIT.CMPB =b[i];
EPwm5Regs.CMPA.bit.CMPA =b[i];// EPwm5Regs.CMPB.bit.CMPB =b[i];
EPwm6Regs.CMPA.bit.CMPA =b[i];// EPwm6Regs.CMPB.bit.CMPB =b[i];
}
其他
{//else for if#2
EPwm1Regs.CMPA.bit.CMPA =b[i];// EPwm1Regs.CMPB.bit.CMPB =b[i];
EPwm2Regs.CMPA.bit.CMPA =b[i];// EPwm2Regs.CMPB.bit.CMPB =b[i];
EPwm3Regs.CMPA.bit.CMPA =b[i];// EPwm3Regs.CMPB.bit.CMPB =b[i];
EPwm4Regs.CMPA.bit.CMPA =b[i];// EPwm4Regs.CMPB.BIT.CMPB =b[i];
EPwm5Regs.CMPA.bit.CMPA =b[i];// EPwm5Regs.CMPB.bit.CMPB =b[i];
EPwm6Regs.CMPA.bit.CMPA =b[i];// EPwm6Regs.CMPB.bit.CMPB =b[i];
}//end of else for IF#2
i++;
如果(i=101)
{//if#3
i=0;}//end of if#3
EALLOW;
//EPwm1Regs.TZCLR.bit.OST = 1;
//EPwm1Regs.TZCLR.bit.INT = 1;
EDIS;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
GpioDataRegs.GPBDAT.bit.GPIO52=0;
}//f1 TZ1的末端、用于 PWM 整流器故障
else //单次触发故障
{//else for if#1
GpioDataRegs.GPBDAT.bit.GPIO52=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;// GPIO25 = GPIO25 //红色
}//end of else for if#1
}//ISR 结束
空 InitEPwm1_2Examples()
{
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1;// GPIO27 = GPIO27 //绿色_2此 LED 亮起
////设置计数器模式//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增和递减计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
//时钟设置
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
//设置比较 A 值
EPwm1Regs.AQCTLA.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1A、向上
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 B 上清除 PWM1A,向下
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 A 上设置 PWM1B、向上
EPwm1Regs.AQCTLB.bit.PRD = AQ_CLEAR;//在事件 B 上清除 PWM1B,向下
//PWM 设置
EPwm1Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm1Regs.TBCTR = 0;
////设置计数器模式//
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增和递减计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
////设置操作//
EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;//在事件 A 上设置 PWM1A、向上
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1A、向下
EPwm2Regs.AQCTLB.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1B、向上
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上清除 PWM1B,向下
EPwm2Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm2Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm2Regs.TBCTR = 0;
////设置计数器模式//
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增和递减计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
////设置操作//
EPwm3Regs.AQCTLA.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1A、向上
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 B 上清除 PWM1A,向下
EPwm3Regs.AQCTLB.bit.PRD = AQ_CLEAR;//在事件 A 上设置 PWM1B、向上
EPwm3Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上清除 PWM1B,向下
EPwm3Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm3Regs.TBPHS.bit.TBPHS = 10000 - PHI1;//相位为0
EPwm3Regs.TBCTR = 0;
////设置计数器模式//
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增和递减计数
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
////设置操作//
EPwm4Regs.AQCTLA.bit.PRD = AQ_CLEAR;//在事件 A 上设置 PWM1A、向上
EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1A、向下
EPwm4Regs.AQCTLB.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1B、向上
EPwm4Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上清除 PWM1B,向下
EPwm4Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm4Regs.TBPHS.bit.TBPHS = 10000-PHI1;//相位为0
EPwm4Regs.TBCTR = 0;
////设置计数器模式//
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上和向下计数 EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
////设置操作//
EPwm5Regs.AQCTLA.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1A、向上
EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR;//在事件 B 上清除 PWM1A,向下
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 A 上设置 PWM1B、向上
EPwm5Regs.AQCTLB.bit.PRD = AQ_CLEAR;//在事件 B 上清除 PWM1B,向下
EPwm5Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm5Regs.TBPHS.bit.TBPHS = 10000 - Phi2;//相位为0
EPwm5Regs.TBCTR = 0;
////设置计数器模式//
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增和递减计数
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV =0;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=0;
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;
////设置重影//
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
////设置操作//
EPwm6Regs.AQCTLA.bit.PRD = AQ_CLEAR;//在事件 A 上设置 PWM1A、向上
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 B 上清除 PWM1A、向下
EPwm6Regs.AQCTLB.bit.PRD = AQ_SET;//在事件 A 上设置 PWM1B、向上
EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上清除 PWM1B,向下
EPwm6Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
EPwm6Regs.TBPHS.bit.TBPHS = 10000 - Phi2;//相位为0
EPwm6Regs.TBCTR = 0;
//***跳匣区域***//
EALLOW;
//GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;// GPIO25 = GPIO25 //红色
//设置三倍频源
EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;//TZ1为单次触发模式
// EPwm2Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;// TZ1为一次性
// EPwm3Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;//TZ1为一次性
// EPwm1Regs.TZSEL.bit.CBC2 = TZ_ENABLE;//TZ2为逐周期
// EPwm2Regs.TZSEL.bit.CBC2 = TZ_ENABLE;//TZ2为逐周期
// EPwm3Regs.TZSEL.bit.CBC2 = TZ_ENABLE;//TZ2为逐周期
//设置行程操作
// EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//PWM1A 在三态时变为低电平
// EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;//PWM1B 在三极时变为低电平
// EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//PWM2A 在三态时变为低电平
// EPwm2Regs.TZCTL.bit.TSB = TZ_FORCE_LO;//PWM2B 在三极时变为低电平
// EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//PWM3A 在三态时变为低电平
// EPwm3Regs.TZCTL.bit.TSB = TZ_FORCE_LO;//PWM3B 在三极时变为低电平
///
// EPwm5Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//PWM5A 在三态时变为低电平
// EPwm5Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// PWM5B 在三态时变为低电平
// EPwm6Regs.TZCTL.bit.TZA = TZ_FORCE_LO;//PWM6A 在三态时变为低电平
// EPwm6Regs.TZCTL.bit.TSB = TZ_FORCE_LO;//PWM6B 在三极时变为低电平
// EPwm1Regs.TZEINT.bit.OST = 1;
EDIS;
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;// GPIO25 = GPIO25 //红色
//启用 INT 设置
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第三个事件发生时生成 INT
// GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;// GPIO25 = GPIO25 //红色
}
void LED_init ()
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;// GPIO25 = GPIO25 //红色
// GPIO-39 - controlCARD 上的引脚功能= LED10
//GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;// 0=GPIO、1=CANTX-A、2=Resv、3=Resv
//GpioCtrlRegs.GPBDIR.bit.GPIO39 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPACLEAR.bit.GPIO39 = 1;//如果->初始设置为低电平则取消注释
//GpioDataRegs.GPBSET.BIO39 = 1;//取消注释 if ->初始设置为高电平
// GPIO-34 - controlCARD 上的引脚功能= LED9
//GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0=GPIO、1=COMP2OUT、2=EPWMSYNCI、3=ADCSOCA
//GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;//如果->初始设置为低电平则取消注释
//GpioDataRegs.GPBSET.BIO34 = 1;//取消注释 if ->初始设置为高电平
// GPIO-52 -引脚功能= LED 绿色
// GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;//
// GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO52 = 1;//如果->初始设置为低电平、则取消注释
// GpioDataRegs.GPBSET.BIO52 = 1;//如果->初始设置为高电平则取消注释
// GPIO-53 -引脚功能= LED 绿色
// GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;//
// GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO53 = 1;//如果->最初设置为低电平、则取消注释
// GpioDataRegs.GPBSET.BIO53 = 1;//如果->初始设置为高电平则取消注释
// GPIO-56 -引脚功能=红色 LED
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;//
// GpioCtrlRegs.GPBDIR.bit.GPIO56 = 1;// 1 =输出、0 =输入
// GpioDataRegs.GPBCLEAR.bit.GPIO56 = 1;//如果->初始设置为低电平、则取消注释
// GpioDataRegs.GPBSET.BIO56 = 1;//如果->初始设置为高电平则取消注释
EDIS;
}