TI中文支持网
TI专业的中文技术问题搜集分享网站

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 timerEALLOW;HWREGH(EPWM3_BASE + EPWM_O_TZCLR) |= (EPWM_TZ_FLAG_DCAEVT1|EPWM_TZ_INTERRUPT);EDIS;// Acknowledge interrupt groupHWREGH(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 timerEALLOW;HWREGH(EPWM4_BASE + EPWM_O_TZCLR) |= (EPWM_TZ_FLAG_DCAEVT1|EPWM_TZ_INTERRUPT);EDIS;// Acknowledge interrupt groupHWREGH(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); // disableGPIO_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); // disableGPIO_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); // disableGPIO_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); // disableGPIO_setPinConfig(EPWM4_BASE_L_GPIO_PIN_CONFIG);
}

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

Yale Li:

这两个波形是什么信号?在哪个引脚上监测到的?

,

丘球球QYG:

“GpioDataRegs.GPASET.bit.GPIO11=1和GpioDataRegs.GPACLEAR.bit.GPIO11=1;;”这两句语句,分别放在epwm3TZISR和epwm4TZISR中断里的开头和结尾,即进入中断时刻GPIO11置高,中断执行完成GPIO11复位,目的是查看进入中断需要的时长和频率。在测试epwm3TZISR中断时注释掉epwm4TZISR中断,反之一样,在测试epwm4TZISR中断时注释掉epwmTZISR中断。

,

Yale Li:

EPWM3波形的频率和ISR的频率能对上吗?

根据你发上来的代码,周期值设定的都是一样的,频率应该相同才对。

丘球球QYG 说:EPWM3的TBCTR寄存器在某一时刻数值为0x06F2,EPWM4的TBCTR寄存器在某一时刻数值为0x3DD3,都一样存在数值,区别只是大小不同

你在初始化EPWM模块之前,有关闭EPWM的外设时钟、然后在初始化之后再打开吗?这样配置之后,两个EPWM模块的计数值应该是相同的。

,

丘球球QYG:

您好,EPWM3发波频率和epwm3TZISR中断频率是一致的,当然,EPWM4发波频率和epwm4TZISR中断频率也是一致的。但是前者EPWM3的频率是88kHz,是正确的,而后者EPWM4的频率是1.28MHz,是错误的,我直接将EPWM3和epwm3TZISR改数字为EPWM4和epwm4TZISR出现的问题,但是不知道问题如何解决,主要就是epwm4TZISR和EPWM4之间的配置存在问题。

,

Yale Li:

丘球球QYG 说:但是前者EPWM3的频率是88kHz,是正确的,而后者EPWM4的频率是1.28MHz

两个的频率设计的是一样的吗?也就是说TBPRD的配置是一样的吗?你可以在调试的时候看一下TBPRD寄存器确定一下。还有你预期的EPWM4的频率是都多少?

除了同步移相的配置可能有所区别以外,其它方面的配置基本都是一样的。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280049C: 采用CMPSS 设置跳闸条件进入EPWM3 TZ中断和EPWM4 TZ中断,采用同一个跳闸条件中断触发源,EPWM3能正常发波,而EPWM4不能发波。
分享到: 更多 (0)