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/TMS320F28027:ECAP 中断和 ePWM 中断不能同时工作。

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601064/ccs-tms320f28027-ecap-interrupt-and-epwm-interrupt-do-not-work-at-same-time

器件型号:TMS320F28027

工具/软件: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}

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

    为了澄清、4个中断中的哪一个未生成? 如果在每个 ISR 中放置一个断点、则不会命中哪些断点? 为了帮助进行调试、我建议在 CCS 寄存器窗口中查看 PIE、ePWM 和 ECAP 的寄存器值。

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

    您好、Elizabeth、

    只有 ECAP 中断不起作用。 所有 ePWM 中断都运行良好。 我使用断点和寄存器来为中断加油。 ECAP 中断中的断点从未被中断。

    PIE 寄存器显示启用了 PWM 的 INT3和 ECAP 的 INT4。 当 ePWM 中断发生时、CMPA 和 CMPB 值也会改变。 但是、CAP1-4值始终为零。

    在"Example_2802xECap_Capture_PWM"示例中、每次发生中断时、CAP 1-4值都会更改。 该过程也可以在 ISR 中的断点处停止。

    我认为问题来自 hte 中断的优先级、但我不知道如何以正确的方式解决它。 我尝试更改优先级、但它不起作用。

    谢谢、

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

    您是否已尝试使用 ECAP 的其他设置进行调试? 例如、如果 ECCTL1是已配置的 PWM 波形、则通过修改 ECEINT 在每个捕获事件上生成中断、并在下降沿和上升沿上触发。

    它可能是中断优先级的问题、但也可能是导致 ECAP 中断不被触发的事件的时序问题。

    此致、
    Elizabeth