工具/软件:Code Composer Studio
尊敬的所有人:
我希望使用 ECAP 中断来捕获多个脉冲、然后更改来自 ePWM 端口的 PWM 信号的占空比。 PWM 函数与"Example_2802xEPwmUpDownAQ"示例相同、该示例已经有大约3个中断。 我可以使用按键的外部中断很好地更改 PWM 信号的占空比。 但是、在我将 ECAP 中断添加到程序中后、从未发生过该中断。 我仍然可以使用键更改 PWM 信号、但 ECAP 功能不起作用。 我从示例"Example_2802xECap_Capture_PWM"中学到了 ECAP 函数。 该示例只有1个中断、但我的程序有4个中断。 该程序用于更改 PWM 信号的周期、但我的程序用于占空比。
我尝试更改中断的优先级、例如"Example_2802xSWPrioritedInterrupts"。 问题 并没有 真正 消失。
可以有人帮助我吗?
#define ISRs_Group3 (M_INT1|M_INT2|M_INT3|M_INT4) #define ISRs_group4 (M_INT1|M_INT3|M_INT4) IER = 0x0000; IFR &= 0x0000; //使用指向 shell 中断 //服务例程(ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2802x_PieVect.c 中找到 InitPieVectTable(); //此示例中使用的中断被重新映射到 这个文件中的// ISR 函数。 EALLOW;//需要此操作来写入 EALLOW 受保护寄存 器 PieVectTable.EPWM1_INT =&epwm1_ISR; PieVectTable.EPWM2_INT =&epwm2_ISR; PieVectTable.EPWM3_INT =&epwm3_ISR; PieVectTable.EECINT_ISR;PieCAP1_EPIRINT =&EAP1;EAP1 //这是禁用写入 EALLOW 受保护寄存器所必需 的//步骤4。 初始化所有器件外设: //此函数位于 F2802x_InitPeripheral.c // InitPeripherals ();//此示例不需要 //对于此示例,仅初始化 ePWM EALLOW; CtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; InitEPwm1Insample (EP1initsample.) InitEPwm3Examples(); InitECapture(); EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; EDIS; //步骤5. 特定于用户的代码、启用中断: //将时间关键代码和闪存设置代码复制到 RAM //这包括以下 ISR 函数:EPwm1_timer_ISR ()、EPwm2_timer_ISR () // EPwm3_timer_ISR 和 InitFlash (); // RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsStart 符号由链接器创建// memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize); //调用闪存初始化以设置闪存等待状态 //此函数必须驻留在 RAM InitFlash ()中; //启用连接到 EPWM1-3的 CPU INT3: ECap1IntCount = 0; ECPIR1.Pie1.piR1.piR2.piR2.pi1;PiePie1 = PiePie1; PiePie1 = PiePie1。PiePiePiePiePie1 = Pie1。PiePiePiePie1。PiePiePie1 PieCtrlRegs.PIEIER3.bit.INTx3 = 1; PieCtrlRegs.PIEIER4.bit.INTx1 = 1; // PieCtrlRegs.PIEIER3.all = 0x00FF; // PieCtrlRegs.PIER4.ALL = 0x00FF;// PieCtrlTI_INTR4 ; 全局中断= 0x00FF_INTR4;/ INTRISTR.INTR=ENTI_INTRS.INTR=ENTRS.INTR=ENTRS.INTRS.INTR=ENTRS.INTRS.INTR=ENTRS.INTRS.INTRS.INTRS.INTR=ENTR=0x00FF;//全局中断 //启用全局实时中断 DBGM
ECAP 功能:
void InitECapture () { ECap1Regs.ECEINT.all = 0x0000; //禁用所有捕捉中断 ECap1Regs.ECCLR.ALL = 0xFFFF; //清除所有 CAP 中断标志 ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁用 CAP1-CAP4寄存器加载 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器被停止 //配置外设寄存 器 ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; //一次性 ECap1Regs.ECCTL2.bit.STOP_Wrap = 3; //在4个事件时停止 ECap1Regs.ECCTL1.bit.CAP1POL=1; //下降边沿 ECap1Regs.ECCTL1.bit.CAP2POL=0; //上升沿 ECap1Regs.ECCTL1.bit.CAP3POL=1; //下降边沿 ECap1Regs.ECCTL1.bit.CAP4POL=0; //上升沿 ECap1Regs.ECCTL1.bit.CTRST1 = 1; //差动操作 ECap1Regs.ECCTL1.bit.CTRST2 = 1; //差动操作 ECap1Regs.ECCTL1.bit.CTRST3 = 1; //差动操作 ECap1Regs.ECCTL1.bit.CTRST4 = 1; //差动操作 ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; //在 ECap1Regs.ECCTL2.bit.SYNCO_SEL 中启用 SYNC = 0; //通过 ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //启用捕捉单元 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //起始计数 器 ECap1Regs.ECCTL2.bit.rearm = 1; // arm 一次性 ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //启用 CAP1-CAP4寄存器加载 ECap1Regs.ECEINT.BIT.CEVT4 = 1; // 4个事件=中断 }
四个中断:
_interrupt void epwm1_ISR (void){my code} __interrupt void epwm2_ISR (void){my code} __interrupt void epwm3_ISR (void){my code} __interrupt void eCAP1_ISR (void){my code}