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的方波波形才是呀。

