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.

TMS320F280049C: 采用CMPSS 设置跳闸条件进入EPWM3 TZ中断和EPWM4 TZ中断,采用同一个跳闸条件中断触发源,EPWM3能正常发波,而EPWM4不能发波。

Part Number: TMS320F280049C


28049C 采用CMPSS 设置跳闸条件进入EPWM3 TZ中断和EPWM4 TZ中断,采用同一个CMPSS跳闸条件中断触发源,EPWM3能正常发波,而EPWM4不能发波,包括以下2个问题:

(1)进入EPWM3 TZ和EPWM4 TZ中断的频率不同,中断时间均为510ns左右。进入EPWM3 TZ中断频率约为88kHz,而EPWM4 TZ中断频率约为1.28MHz,包括变量定义、声明、Main.c主函数、CMPSS、ADC等配置完全一样,且EPWM3和EPWM4配置过程也完全一样,而输出结果却不同。

__interrupt void epwm3TZISR(void)
{
    GpioDataRegs.GPASET.bit.GPIO11=1;
    Flag2++;
    compAValue = 2*HWREGH(EPWM3_BASE + EPWM_O_TBCTR)-70;

    f_PRD[0]=0.0001*compAValue+0.9999*f_PRD[1];
    f_PRD[1]=f_PRD[0];

    HWREGH(EPWM3_BASE + EPWM_O_TBPRD) = f_PRD[0];
    CMPSS_setMaxRampValue(CMPSS4_BASE, Ref);

    // Clear INT flag for this timer
    EALLOW;
    HWREGH(EPWM3_BASE + EPWM_O_TZCLR) |= (EPWM_TZ_FLAG_DCAEVT1|EPWM_TZ_INTERRUPT);
    EDIS;
    // Acknowledge interrupt group
    HWREGH(PIECTRL_BASE + PIE_O_ACK) = INTERRUPT_ACK_GROUP2;
    GpioDataRegs.GPACLEAR.bit.GPIO11=1;

}

__interrupt void epwm4TZISR(void)
{
    GpioDataRegs.GPASET.bit.GPIO11=1;
    Flag2++;
    compAValue = 2*HWREGH(EPWM4_BASE + EPWM_O_TBCTR)-70;

    f_PRD[0]=0.0001*compAValue+0.9999*f_PRD[1];
    f_PRD[1]=f_PRD[0];

    HWREGH(EPWM4_BASE + EPWM_O_TBPRD) = f_PRD[0];
    CMPSS_setMaxRampValue(CMPSS4_BASE, Ref);

    // Clear INT flag for this timer
    EALLOW;
    HWREGH(EPWM4_BASE + EPWM_O_TZCLR) |= (EPWM_TZ_FLAG_DCAEVT1|EPWM_TZ_INTERRUPT);
    EDIS;
    // Acknowledge interrupt group
    HWREGH(PIECTRL_BASE + PIE_O_ACK) = INTERRUPT_ACK_GROUP2;
    GpioDataRegs.GPACLEAR.bit.GPIO11=1;
}

void initEPWM3()
{
    EPWM_selectDigitalCompareTripInput(EPWM3_BASE, EPWM_DC_TRIP_TRIPIN7, EPWM_DC_TYPE_DCAH);

    EPWM_setTripZoneDigitalCompareEventCondition(EPWM3_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH);

    EPWM_setDigitalCompareEventSource(
            EPWM3_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);

    EPWM_setDigitalCompareEventSyncMode(
            EPWM3_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_INPUT_SYNCED);

    EPWM_setActionQualifierT1TriggerSource(EPWM3_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1);

    EPWM_enableTripZoneInterrupt(EPWM3_BASE, EPWM_TZ_INTERRUPT_DCAEVT1);

    EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1,
                           EPWM_TZ_ACTION_DISABLE);

    EPWM_setPeriodLoadMode(EPWM3_BASE, EPWM_PERIOD_DIRECT_LOAD);

    EPWM_setTimeBasePeriod(EPWM3_BASE,0xFFFF);
    EPWM_setPhaseShift(EPWM3_BASE, 0U);
    EPWM_setTimeBaseCounter(EPWM3_BASE, 0U);

    EPWM_setPeriodLoadMode(EPWM3_BASE, EPWM_PERIOD_DIRECT_LOAD);

    EPWM_setTimeBaseCounterMode(EPWM3_BASE, EPWM_COUNTER_MODE_UP);
    EPWM_disablePhaseShiftLoad(EPWM3_BASE);
    EPWM_setClockPrescaler(EPWM3_BASE,
                              EPWM_CLOCK_DIVIDER_1,
                              EPWM_HSCLOCK_DIVIDER_1);

    EPWM_setActionQualifierAction(EPWM3_BASE,
                                         EPWM_AQ_OUTPUT_A,
                                         EPWM_AQ_OUTPUT_HIGH,
                                         EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction(EPWM3_BASE,
                                         EPWM_AQ_OUTPUT_A,
                                         EPWM_AQ_OUTPUT_LOW,
                                         EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
    EPWM_setActionQualifierAction(EPWM3_BASE,
                                         EPWM_AQ_OUTPUT_B,
                                         EPWM_AQ_OUTPUT_HIGH,
                                         EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction(EPWM3_BASE,
                                         EPWM_AQ_OUTPUT_B,
                                         EPWM_AQ_OUTPUT_LOW,
                                         EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);


    EPWM_setDeadBandCounterClock(EPWM3_BASE,EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
    EPWM_setRisingEdgeDelayCount(EPWM3_BASE,pwm_db_ticks_hs);
    EPWM_setFallingEdgeDelayCount(EPWM3_BASE,pwm_db_ticks_ls);

    EPWM_setDeadBandDelayMode(EPWM3_BASE,EPWM_DB_RED,true);
    EPWM_setDeadBandDelayMode(EPWM3_BASE,EPWM_DB_FED,true);
    EPWM_setRisingEdgeDeadBandDelayInput(EPWM3_BASE,EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput(EPWM3_BASE,EPWM_DB_INPUT_EPWMB);
    EPWM_setDeadBandDelayPolarity(EPWM3_BASE,EPWM_DB_RED,
                                         EPWM_DB_POLARITY_ACTIVE_HIGH);

    EPWM_setDeadBandDelayPolarity(EPWM3_BASE,EPWM_DB_FED,
                                         EPWM_DB_POLARITY_ACTIVE_LOW);
}

void initEPWM4()
{
    EPWM_selectDigitalCompareTripInput(EPWM4_BASE, EPWM_DC_TRIP_TRIPIN7, EPWM_DC_TYPE_DCAH);

    EPWM_setTripZoneDigitalCompareEventCondition(EPWM4_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH);

    EPWM_setDigitalCompareEventSource(
            EPWM4_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);

    EPWM_setDigitalCompareEventSyncMode(
            EPWM4_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_INPUT_SYNCED);

    EPWM_setActionQualifierT1TriggerSource(EPWM4_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1);


    EPWM_enableTripZoneInterrupt(EPWM4_BASE, EPWM_TZ_INTERRUPT_DCAEVT1);

    EPWM_setTripZoneAction(EPWM4_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1,
                           EPWM_TZ_ACTION_DISABLE);

    EPWM_setPeriodLoadMode(EPWM4_BASE, EPWM_PERIOD_DIRECT_LOAD);

    EPWM_setTimeBasePeriod(EPWM4_BASE,0xFFFF);
    EPWM_setPhaseShift(EPWM4_BASE, 0U);
    EPWM_setTimeBaseCounter(EPWM4_BASE, 0U);

    EPWM_setPeriodLoadMode(EPWM4_BASE, EPWM_PERIOD_DIRECT_LOAD);

    EPWM_setTimeBaseCounterMode(EPWM4_BASE, EPWM_COUNTER_MODE_UP);
    EPWM_disablePhaseShiftLoad(EPWM4_BASE);
    EPWM_setClockPrescaler(EPWM4_BASE,
                              EPWM_CLOCK_DIVIDER_1,
                              EPWM_HSCLOCK_DIVIDER_1);

    EPWM_setActionQualifierAction(EPWM4_BASE,
                                         EPWM_AQ_OUTPUT_A,
                                         EPWM_AQ_OUTPUT_HIGH,
                                         EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction(EPWM4_BASE,
                                         EPWM_AQ_OUTPUT_A,
                                         EPWM_AQ_OUTPUT_LOW,
                                         EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
    EPWM_setActionQualifierAction(EPWM4_BASE,
                                         EPWM_AQ_OUTPUT_B,
                                         EPWM_AQ_OUTPUT_HIGH,
                                         EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    EPWM_setActionQualifierAction(EPWM4_BASE,
                                         EPWM_AQ_OUTPUT_B,
                                         EPWM_AQ_OUTPUT_LOW,
                                         EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);

    EPWM_setDeadBandCounterClock(EPWM4_BASE,EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
    EPWM_setRisingEdgeDelayCount(EPWM4_BASE,pwm_db_ticks_hs);
    EPWM_setFallingEdgeDelayCount(EPWM4_BASE,pwm_db_ticks_ls);

    EPWM_setDeadBandDelayMode(EPWM4_BASE,EPWM_DB_RED,true);
    EPWM_setDeadBandDelayMode(EPWM4_BASE,EPWM_DB_FED,true);
    EPWM_setRisingEdgeDeadBandDelayInput(EPWM4_BASE,EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput(EPWM4_BASE,EPWM_DB_INPUT_EPWMB);
    EPWM_setDeadBandDelayPolarity(EPWM4_BASE,EPWM_DB_RED,
                                         EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setDeadBandDelayPolarity(EPWM4_BASE,EPWM_DB_FED,
                                         EPWM_DB_POLARITY_ACTIVE_LOW);
}

void InitGPIO()
{

    GPIO_setDirectionMode(11, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);
    GPIO_setMasterCore(11, GPIO_CORE_CPU1);
    GPIO_setQualificationMode(11, GPIO_QUAL_ASYNC);


    GPIO_setDirectionMode(EPWM3_BASE_H_GPIO,GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(EPWM3_BASE_H_GPIO,GPIO_PIN_TYPE_STD); // disable
    GPIO_setPinConfig(EPWM3_BASE_H_GPIO_PIN_CONFIG);

    GPIO_setDirectionMode(EPWM3_BASE_L_GPIO,GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(EPWM3_BASE_L_GPIO,GPIO_PIN_TYPE_STD); // disable
    GPIO_setPinConfig(EPWM3_BASE_L_GPIO_PIN_CONFIG);

    GPIO_setDirectionMode(EPWM4_BASE_H_GPIO,GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(EPWM4_BASE_H_GPIO,GPIO_PIN_TYPE_STD); // disable
    GPIO_setPinConfig(EPWM4_BASE_H_GPIO_PIN_CONFIG);

    GPIO_setDirectionMode(EPWM4_BASE_L_GPIO,GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(EPWM4_BASE_L_GPIO,GPIO_PIN_TYPE_STD); // disable
    GPIO_setPinConfig(EPWM4_BASE_L_GPIO_PIN_CONFIG);
}

(2)EPWM3和EPWM4中的TBCTR寄存器均有数值,但是EPWM3能发波,而EPWM4没有波形输出:EPWM3的TBCTR寄存器在某一时刻数值为0x06F2,EPWM4的TBCTR寄存器在某一时刻数值为0x3DD3,都一样存在数值,区别只是大小不同,EPWM4理应输出频率不同于EPWM3的方波波形才是呀。