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.

[参考译文] TMS320F280025C:F280025C–EPWM1 DCAEVT1 中断‑在 TZCLR 和 TZEINT.bit.DCAEVT1 = 0 后立即触发

Guru**** 2616675 points

Other Parts Discussed in Thread: LAUNCHXL-F280025C, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1576905/tms320f280025c-f280025c-epwm1-dcaevt1-interrupt-re-fires-immediately-after-tzclr-and-tzeint-bit-dcaevt1-0

器件型号: TMS320F280025C
主题中讨论的其他器件: LAUNCHXL-F280025CC2000WARE

您好、

我已配置 F280025C 的 EPWM1 模块、以从 DCAEVT1.inter 信号触发 TZ 中断、CMPSS3H 滤波信号会与该中断触发。 EPWM1 模块的配置在末尾显示

CMPSS3H 信号变为高电平(通过 GPIO 监控)后、EPWM1_TZ 的 ISR 将按预期执行。 中断在 ISR 内未得到确认。

在以固定时基运行的另一个函数内、执行以下代码:

        EALLOW;
        EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0;  // Event disabled
        EPwm1Regs.TZEINT.bit.DCAEVT1 = 0;
        EDIS;

        //
        // Clear CMPSS flag
        //
        EALLOW;
        EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;   // Clear event latch
        EPwm1Regs.TZCLR.bit.INT  = 1;       // Clear TZ INT flag
        EDIS;

        // Acknowledge the interrupt
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;

预计将禁用 DCAEVT1 触发 EPWM1_TZ 中断的机制。 尽管如此、一旦 EPWM1_TZ 中断得到确认、就会重新触发该中断。 即使 CMPSS3H 滤波信号为低电平(通过 GPIO 进行监控)、也会禁用 DCAEVT1 并禁用 DCAEVT1 中断。 我想知道为什么会重新触发 EPWM1_TZ 中断?

EPWM1 模块配置:

// Disable the ePWM1 module before configuration
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;

    // Configure the Time-Base (TB) Submodule
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;  // Up-count mode
    EPwm1Regs.TBPRD = PWM_TIME_BASE_PERIOD;     // Set the period value
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;     // Disable phase loading
    EPwm1Regs.TBPHS.bit.TBPHS = 0;              // Phase is 0
    EPwm1Regs.TBCTR = 0;                        // Clear counter
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;       // Clock pre-scale
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    // Clock high speed pre-scale

    // Configure the Counter-Compare (CC) Submodule
    EPwm1Regs.CMPA.bit.CMPA = 1;//PWM_TIME_BASE_PERIOD / 2;      // Set compare A value (50% duty cycle)

    // Configure the Action-Qualifier (AQ) Submodule
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;       // Clear output A on up-count
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;         // Set output A on zero

    // Configure the Event-Trigger (ET) Submodule
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // Select SOC on counter zero
    EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;       // Generate pulse on 1st event
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;            // Enable SOC on A group

    //
    // Bypass CMPSS output signal through ePWM-XBAR
    //

    /* 1) Select MUX4.0 (CMPSS3H) for TRIP4 */
    EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX4 = 0;     /* MUX4.0 → CMPSS3H */

    /* 2) Enable that MUX path */
    EPwmXbarRegs.TRIP4MUXENABLE.all        = 0x0000;
    EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX4   = 1;     /* gate it on       */

    //
    // Bypass CMPSS output signal through Digital Compare submodule
    //

    // Select which signal goes to DCAH (TRIP4 → DCAH)
    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 4-1;

    // Select which signal goes to DCAEVT1 (DCAH → DCAEVT1)
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;      // DCAEVTI Selection: DCAH = high, DCAL = don't care

    // Select version of DCAEVT1 (not filtered, synchronous)
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL     = 0;   /* Event source = DCAEVT1 */
    EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0;   /* Synchronous        */

    //
    // Configure Trip Zone submodule to generate interrupt from  CMPSS output signal
    //
    /* 2) Define what happens to the PWM pins when that event occurs
          ->  “do nothing”                                          */
    EPwm1Regs.TZCTL.bit.TZA = TZ_NO_CHANGE;  /* 11b = no change     */
    EPwm1Regs.TZCTL.bit.TZB = TZ_NO_CHANGE;

    /* 3) Enable the DCAEVT1 interrupt inside the module      */
    EPwm1Regs.TZEINT.all = 0;                 /* clear all enables   */
    EPwm1Regs.TZEINT.bit.DCAEVT1 = 1;         /* enable local INT    */

    // Enable the ePWM1 module
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

 

设备/工具

  • 器件:LAUNCHXL-F280025C  
  • CCS:12.7.1.00001  
  • 编译器:TI v22.6.1 LTS
  • C2000Ware:C2000Ware_5_02_00_00
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否使用中断计数或 GPIO 切换来看到这种 ISR 重新触发的现象?

    此致、

    Sumit  

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

    问题可能是这样 如果 TZFLG 被清除时直流跳闸事件 (DCAEVT1) 仍然存在、则会立即再次设置标志 。 这意味着、即使通过 GPIO 监控 CMPSS3H 信号并且其显示为低电平、也是如此 DCAEVT1 事件信号本身 当您清除 TZCLR 寄存器时、它可能仍被锁存或存在于数字比较子模块电平。  这正是在你的情况下发生的事情。 问题是、在清除标志并确认中断之前、您需要确保触发 DCAEVT1 的 CMPSS 信号不再激活。  在清除标志之前、您需要确保源信号确实处于非活动状态。  当您写入时TZCLR.bit.DCAEVT1 = 1、如果数字比较子模块的基础 DCAEVT1.inter 信号仍处于活动状态(即使是短暂的)、TZFLG[DCAEVT1]锁存器将立即被重新设置。 然后、当您使用确认 PIE 中断PIEACK时、会再次触发该中断、因为仍设置了该标志

    中断生成遵循以下路径:

    1. DCAEVT1.inter 信号由数字比较子模块生成
    2. 该信号设置 TZFLG[DCAEVT1] 锁存器
    3. 何时 TZEINT[DCAEVT1] 启用后、该标志为 PIE 生成中断脉冲
    4. TZFLG[INT] 也必须单独清除

    以下是推荐的方法:

    1.清除 CMPSS 比较器输出锁存器(推荐)

    在清除 ePWM 跳闸区域标志之前、您应该清除馈送 DCAEVT1 信号的 CMPSS 比较器锁存器:

    EALLOW;
    // First, clear the CMPSS3 high comparator latch
    Cmpss3Regs.COMPSTSCLR.bit.HLATCHCLR = 1;  // Clear CMPSS3H latch
    
    // Small delay to ensure the signal propagates through XBAR and DC logic
    __asm(" RPT #10 || NOP");  // ~10 cycle delay
    
    // Now disable the DCAEVT1 mechanisms
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0;  // Disable event selection
    EPwm1Regs.TZEINT.bit.DCAEVT1 = 0;   // Disable interrupt enable
    
    // Clear the Trip Zone flags
    EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;    // Clear DCAEVT1 latch
    EPwm1Regs.TZCLR.bit.INT = 1;        // Clear TZ INT flag
    
    // Acknowledge the PIE interrupt
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
    EDIS;
    2. 确认前检查标志状态

    在确认 PIE 之前验证标志是否实际已清除:

    EALLOW;
    // Clear CMPSS latch first
    Cmpss3Regs.COMPSTSCLR.bit.HLATCHCLR = 1;
    __asm(" RPT #10 || NOP");
    
    // Disable mechanisms
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0;
    EPwm1Regs.TZEINT.bit.DCAEVT1 = 0;
    
    // Clear flags
    EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;
    EPwm1Regs.TZCLR.bit.INT = 1;
    
    // Verify the flag is actually cleared
    while(EPwm1Regs.TZFLG.bit.DCAEVT1 == 1)
    {
        EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;  // Try clearing again
    }
    
    // Now acknowledge
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
    EDIS;

    3.在 ISR 中确认、稍后启用 Re

    更简洁的方法是在 ISR 中确认中断、但在准备就绪之前保持禁用事件:

    __interrupt void epwm1_tzint_isr(void)
    {
        // Handle the trip event
        // ... your trip handling code ...
        
        // Disable the DCAEVT1 interrupt and event
        EALLOW;
        EPwm1Regs.TZEINT.bit.DCAEVT1 = 0;
        EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 0;
        
        // Clear CMPSS latch
        Cmpss3Regs.COMPSTSCLR.bit.HLATCHCLR = 1;
        
        // Clear Trip Zone flags
        EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;
        EPwm1Regs.TZCLR.bit.INT = 1;
        
        // Acknowledge interrupt
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
        EDIS;
    }
    在 ISR 中:
    // When ready to re-enable
    EALLOW;
    // Re-enable the DCAEVT1 mechanisms
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;  // DCAH = high, DCAL = don't care
    EPwm1Regs.TZEINT.bit.DCAEVT1 = 1;   // Enable interrupt
    EDIS;
    其他注意事项
    1. CMPSS 滤波器延迟 :如果您使用的是 CMPSS 数字滤波器,在模拟信号下降和滤波输出变为低电平之间可能会有延迟。 确保您考虑到这一点。

    2. 同步 :您的配置使用同步 DCAEVT1DCACTL.bit.EVT1FRCSYNCSEL = 0 ()、这意味着事件与 TBCLK 同步。 这可能会引入额外的延迟。

    3. 检查 TZFLG 寄存器 :务必通过读取来验证设置了哪个特定标志EPwm1Regs.TZFLG.all,以确保您清除了正确的标志。