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.

[参考译文] TMS320F2800157:芯片应用问题

Guru**** 2539600 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1292804/tms320f2800157-application-issues-of-chips

器件型号:TMS320F2800157
主题中讨论的其他器件:C2000WARE

当我根据例程使用 TIME0中断和 PWM 中断时、PWM 中断周期突然发生变化、从100us 到86us、从而在20kHz time0中断之前产生10kHz PWM 中断。 波形如下所示。 您能帮助我了解一下目前的情况、以及有哪些好的建议吗?

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

    尊敬的 Tony:

    生成中断时、是否使用事件触发子模块在每个 PRD 或 ZRO 中生成 EPWM 中断?

    您是否在运行时完全更改 PWM 周期?

    您如何确定这些中断的范围? 您是否可以共享生成此问题的代码片段?

    此致!

    马瑞安

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

    EPWM 中断由 ZREO 中事件触发的子模块生成、并且在运行期间 PWM 周期不会改变。

    PWM 中断执行期间允许 Time0中断

    20K 中断和10K 中断、10K 允许20K 中断;

    当两个中断都通过 PWM 触发时、例如使用 PWM1触发20K 中断、使用 PWM2触发10K 中断、则10K 中断周期不会突然发生变化;

    当使用 TIME0触发20K 中断并使用 PWM2触发10K 中断时、10k 中断周期将出现突然变化

    这两种情况下、只有20K 中断的触发源不同、其他条件相同

    此外、同时执行 TIME0开始计数功能和使能 PWM 外设时钟功能

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

    对相关代码部分进行补充、

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

    尊敬的 Tony:

    我已经执行了一个测试用例、在这个用例中、ePWM1为10kHz、ePWM2为20kHz。 我还配置了 Timer0、以便每20kHz 生成一次 ISR。

    这背后的原因是 PIE 的优先级方案、其中 TIMER0位于组1中、并且始终高于 ePWM ISR、因此应在任何 ePWM ISR 之前首先处理计时器 ISR。

    如果您计划使用两个 ISR、我认为使用两个具有相同 PWM 频率的 PWM 将允许您生成所需的内容、而不是使用 TIMER0 ISR。

    //
    // Globals
    //
    uint16_t cpuTimer0IntCount;
    uint16_t cpuTimer1IntCount;
    uint16_t cpuTimer2IntCount;
    bool PWM_ONLY_ISR = true;
    
    void INT_myEPWM0_ISR(void){
        // Channel 1 on scope
        GPIO_writePin(myGPIO1, 1);
        EPWM_clearEventTriggerInterruptFlag(myEPWM0_BASE);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
        GPIO_writePin(myGPIO1, 0);
    }
    
    
    void INT_myEPWM1_ISR(void){
        // Channel 2 on scope
        GPIO_writePin(myGPIO0, 1);
        EPWM_clearEventTriggerInterruptFlag(myEPWM1_BASE);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
        GPIO_writePin(myGPIO0, 0);
    }
    __interrupt void cpuTimer0ISR(void)
    {
        // Channel 3 on scope
        GPIO_writePin(myGPIO2, 1);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
        GPIO_writePin(myGPIO2, 0);
    }
    
    void main(void)
    {
        //
        // Initializes device clock and peripherals
        //
        Device_init();
    
        //
        // Initializes PIE and clears PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initializes the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // PinMux and Peripheral Initialization
        //
        Board_init();
        EPWM_setTimeBaseCounter(myEPWM0_BASE, 0);
        EPWM_setTimeBaseCounter(myEPWM1_BASE, 0);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
        CPUTimer_startTimer(CPUTIMER0_BASE);
        //
        // C2000Ware Library initialization
        //
        C2000Ware_libraries_init();
    
        //
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // Reset interrupt counter
        //
        cpuTimer0IntCount = 0;
        cpuTimer1IntCount = 0;
        cpuTimer2IntCount = 0;
    
        //
        // IDLE loop. Just sit and loop forever (optional)
        //
        while (1)
        {
        }
    }
    void Board_init()
    {
        EALLOW;
    
        PinMux_init();
        SYSCTL_init();
        SYNC_init();
        CPUTIMER_init();
        EPWM_init();
        GPIO_init();
        INTERRUPT_init();
    
        EDIS;
    }
    
    //*****************************************************************************
    //
    // PINMUX Configurations
    //
    //*****************************************************************************
    void PinMux_init()
    {
        //
        // PinMux for modules assigned to CPU1
        //
    
        //
        // EPWM1 -> myEPWM0 Pinmux
        //
        //
        // EPWM2 -> myEPWM1 Pinmux
        //
        // GPIO5 -> myGPIO0 Pinmux
        GPIO_setPinConfig(GPIO_5_GPIO5);
        // GPIO1 -> myGPIO1 Pinmux
        GPIO_setPinConfig(GPIO_1_GPIO1);
        // GPIO6 -> myGPIO2 Pinmux
        GPIO_setPinConfig(GPIO_6_GPIO6);
    
    }
    
    //*****************************************************************************
    //
    // CPUTIMER Configurations
    //
    //*****************************************************************************
    void CPUTIMER_init(){
        CPUTIMER0_BASE_init();
    }
    
    void CPUTIMER0_BASE_init(){
        CPUTimer_setEmulationMode(CPUTIMER0_BASE_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
        CPUTimer_setPreScaler(CPUTIMER0_BASE_BASE, 0U);
        CPUTimer_setPeriod(CPUTIMER0_BASE_BASE, 6000U);
        CPUTimer_enableInterrupt(CPUTIMER0_BASE_BASE);
        CPUTimer_stopTimer(CPUTIMER0_BASE_BASE);
    
        CPUTimer_reloadTimerCounter(CPUTIMER0_BASE_BASE);
    }
    
    //*****************************************************************************
    //
    // EPWM Configurations
    //
    //*****************************************************************************
    void EPWM_init(){
        EPWM_setClockPrescaler(myEPWM0_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setTimeBasePeriod(myEPWM0_BASE, 6000);
        EPWM_setTimeBaseCounter(myEPWM0_BASE, 0);
        EPWM_setTimeBaseCounterMode(myEPWM0_BASE, EPWM_COUNTER_MODE_UP_DOWN);
        EPWM_disablePhaseShiftLoad(myEPWM0_BASE);
        EPWM_setPhaseShift(myEPWM0_BASE, 0);
        EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM0_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
        EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM0_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
        EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM0_BASE);
        EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM0_BASE);
        EPWM_enableInterrupt(myEPWM0_BASE);
        EPWM_setInterruptSource(myEPWM0_BASE, EPWM_INT_TBCTR_PERIOD);
        EPWM_setInterruptEventCount(myEPWM0_BASE, 1);
        EPWM_setClockPrescaler(myEPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setTimeBasePeriod(myEPWM1_BASE, 3000);
        EPWM_setTimeBaseCounter(myEPWM1_BASE, 0);
        EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
        EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
        EPWM_setPhaseShift(myEPWM1_BASE, 0);
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
        EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
        EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);
        EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);
        EPWM_enableInterrupt(myEPWM1_BASE);
        EPWM_setInterruptSource(myEPWM1_BASE, EPWM_INT_TBCTR_ZERO);
        EPWM_setInterruptEventCount(myEPWM1_BASE, 1);
    }
    
    //*****************************************************************************
    //
    // GPIO Configurations
    //
    //*****************************************************************************
    void GPIO_init(){
        myGPIO0_init();
        myGPIO1_init();
        myGPIO2_init();
    }
    
    void myGPIO0_init(){
        GPIO_writePin(myGPIO0, 0);
        GPIO_setPadConfig(myGPIO0, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(myGPIO0, GPIO_QUAL_SYNC);
        GPIO_setDirectionMode(myGPIO0, GPIO_DIR_MODE_OUT);
    }
    void myGPIO1_init(){
        GPIO_writePin(myGPIO1, 0);
        GPIO_setPadConfig(myGPIO1, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(myGPIO1, GPIO_QUAL_SYNC);
        GPIO_setDirectionMode(myGPIO1, GPIO_DIR_MODE_OUT);
    }
    void myGPIO2_init(){
        GPIO_writePin(myGPIO2, 0);
        GPIO_setPadConfig(myGPIO2, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(myGPIO2, GPIO_QUAL_SYNC);
        GPIO_setDirectionMode(myGPIO2, GPIO_DIR_MODE_OUT);
    }
    
    //*****************************************************************************
    //
    // INTERRUPT Configurations
    //
    //*****************************************************************************
    void INTERRUPT_init(){
    
        // Interrupt Setings for INT_CPUTIMER0_BASE
        Interrupt_register(INT_CPUTIMER0_BASE, &cpuTimer0ISR);
        Interrupt_enable(INT_CPUTIMER0_BASE);
    
        // Interrupt Setings for INT_myEPWM0
        Interrupt_register(INT_myEPWM0, &INT_myEPWM0_ISR);
        Interrupt_enable(INT_myEPWM0);
    
        // Interrupt Setings for INT_myEPWM1
        Interrupt_register(INT_myEPWM1, &INT_myEPWM1_ISR);
        Interrupt_enable(INT_myEPWM1);
    }
    //*****************************************************************************
    //
    // SYNC Scheme Configurations
    //
    //*****************************************************************************
    void SYNC_init(){
        SysCtl_setSyncOutputConfig(SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT);
        //
        // SOCA
        //
        SysCtl_enableExtADCSOCSource(0);
        //
        // SOCB
        //
        SysCtl_enableExtADCSOCSource(0);
    }
    //*****************************************************************************
    //
    // SYSCTL Configurations
    //
    //*****************************************************************************
    void SYSCTL_init(){
        //
        // sysctl initialization
        //
        SysCtl_setStandbyQualificationPeriod(2);
        SysCtl_configureType(SYSCTL_ECAPTYPE, 0, 0);
        SysCtl_selectErrPinPolarity(0);
    
        SysCtl_disableMCD();
    
    
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRCAL);
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCANA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_LINA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_PMBUSA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DCC0);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPG1);
    
    
    
    }
    

    下面是示波器屏幕截图:

    此致!

    马瑞安

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

    尊敬的 Tony:

    您是否能够运行以下测试用例? 此测试用例是否反映了您尝试实现的目标?

    我无法重现您看到的问题。 您能否提供一些与此问题相关的简易代码?

    此致!

    马瑞安

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

    尊敬的 Tony:

    为了补充 Ryan 的观点:还有几种其他方法可以让此功能按您的预期工作。

    1.您可以允许 Timer0中断让其他中断"嵌套"在其中。 请参阅此处的指南: https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html 这基本上允许您在计时器中断运行时停止它、使其他中断在它内部运行、然后返回以完成计时器中断。 当出现诸如 ePWM 之类的真正关键的中断时、人们通常会这样做。 每隔更新一次其他 ISR、以允许 ePWM 中断在它们内部发生、然后设置 EINT。 请仔细遵循该指南中的说明、因为其中有一些重要的警告。

    2.您可以在软件中对中断的优先级进行重新排序,以 C2000Ware 中的示例"interrupt_ex3_sw_priitations.c"为指导。 这也是一个非常好的选择。

    可以大幅提高计时器中断速度、这样就不会阻止 ePWM 中断。 这个问题不太可能没问题、因为它意味着你需要将计时器中断中的处理推送到优先级较低的任务、这对于您的应用程序来说可能是不可接受的。

    此致、

    文斯

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

    尊敬的 Tony:

    摘自另一个主题:

    解释1:在定时器中断期间、可能已经触发了 PWM 模块的更新或重新加载、从而导致 PWM 定时器的状态发生变化。 这将导致 PWM 周期缩短或产生额外的脉冲

    一旦完成初始化、ePWM 就不会重新加载新设置。 如果您在 计时器中断期间更新 ePWM 配置、那么这将解释 这个短 PWM 周期。

    解释2:在定时器中断过程中、为了执行 PWM 模块要求的操作、可能会发生延迟。 这将导致 PWM 中断的触发时间早于定时器中断、从而缩短 PWM 中断周期。

    在计时器中断期间、您是否采取了任何措施来更改 ePWM 寄存器? PWM 的脉冲宽度和周期似乎发生变化。 您是否要写入 TBPRD 或 CMPA / CMPB 寄存器? 浅蓝色波形是否为 PWM 输出?

    由于 ePWM 的优先级低于计时器 ISR、因此 ePWM ISR 必须等待计时器 ISR 完成、以便清除事件触发中断状态标志。  

    您能否提供有关如何生成 EPWM ISR 的更多详细信息? 我认为如果输出 PWM 脉冲、PWM 周期的缩短将是因为 ePWM ISR 在某种程度上依赖于计时器 ISR、并导致一些 ePWM 配置更改。

    此致!

    马瑞安

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

    在编程操作期间、未对 ePWM 的寄存器进行任何更改、

    当 CTR = 0时、PWM 中断功能由事件触发的子模块生成

    在同样的条件下、当 PWM1和 PWM2同时使用时不会出现周期减少的问题;只有在定时器和 PWM 组合使用时才会出现 PWM 中断周期减少的问题。 在这两种工作条件下、只有中断触发源不同、其余相同

    关键是这种情况是否有规避方法、F280039芯片是否有同样的问题。 谢谢!

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

    尊敬的 Tony:

    您能否提供生成此问题的代码? 我无法复制此问题。  

    如果 TIMER0中断与 PWM 中断重叠、则 CTR == ZRO 上的 PWM 中断将被延迟。 但是、ePWM 的周期不应改变。 您应该能够通过输出 ePWM 信号和测量频率来验证这一点。 如果 PWM 输出频率保持不变、且只有中断频率发生变化、则属于中断优先级问题。 请参考 Vince 关于如何避免这种情况的建议。

    此致!

    马瑞安