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.

TMS320F28388D: How to set up DCS in PWM?

Part Number: TMS320F28388D


Good afternoon.
I work with TMS320F28388D.

I'm interested in PWM

The documentation for the processor has a diagram.

It shows that the DCS can generate an interrupt.

I have a signal coming from an external circuit to the PWM. Goes to DCS.

Is it possible to get an interrupt from this signal? As shown in the diagram.

Here is the initialization code.

void PinMux_init()
{
	//
	// EPWM2 -> SYSTEM_PWM Pinmux
	//
	GPIO_setPinConfig(GPIO_2_EPWM2A);
	GPIO_setPinConfig(GPIO_148_EPWM2B);
	// GPIO0 -> myGPIOInputInterrupt0 Pinmux
	GPIO_setPinConfig(GPIO_0_GPIO0);
	// GPIO1 -> myGPIOOutput0 Pinmux
	GPIO_setPinConfig(GPIO_1_GPIO1);
	// GPIO40 -> KEY_A Pinmux
	GPIO_setPinConfig(GPIO_40_GPIO40);
	// GPIO44 -> KEY_B Pinmux
	GPIO_setPinConfig(GPIO_44_GPIO44);
	// GPIO45 -> KEY_C Pinmux
	GPIO_setPinConfig(GPIO_45_GPIO45);
	// GPIO151 -> GPIO_SYNC_INTERRUPT Pinmux
	GPIO_setPinConfig(GPIO_151_GPIO151);
	// GPIO149 -> TZ_RISEN_IN Pinmux
	GPIO_setPinConfig(GPIO_149_GPIO149);
	//
	// OUTPUTXBAR3 -> OUTPUTXBAR Pinmux
	//
	GPIO_setPinConfig(GPIO_5_OUTPUTXBAR3);
	//
	// SCIA -> SCI_DBG Pinmux
	//
	GPIO_setPinConfig(GPIO_43_SCIA_RX);
	GPIO_setPinConfig(GPIO_42_SCIA_TX);

}

void EPWM_init(){
    EPWM_setClockPrescaler(SYSTEM_PWM_BASE, EPWM_CLOCK_DIVIDER_4, EPWM_HSCLOCK_DIVIDER_4);	
    EPWM_setTimeBasePeriod(SYSTEM_PWM_BASE, 15600);	
    EPWM_setPeriodLoadMode(SYSTEM_PWM_BASE, EPWM_PERIOD_DIRECT_LOAD);	
    EPWM_setTimeBaseCounter(SYSTEM_PWM_BASE, 0);	
    EPWM_setTimeBaseCounterMode(SYSTEM_PWM_BASE, EPWM_COUNTER_MODE_UP_DOWN);	
    EPWM_setCountModeAfterSync(SYSTEM_PWM_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);	
    EPWM_enablePhaseShiftLoad(SYSTEM_PWM_BASE);	
    EPWM_setPhaseShift(SYSTEM_PWM_BASE, 0);	
    EPWM_enableSyncOutPulseSource(SYSTEM_PWM_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);	
    EPWM_setOneShotSyncOutTrigger(SYSTEM_PWM_BASE, EPWM_OSHT_SYNC_OUT_TRIG_RELOAD);	
    EPWM_setCounterCompareValue(SYSTEM_PWM_BASE, EPWM_COUNTER_COMPARE_A, 12600);	
    EPWM_setCounterCompareShadowLoadMode(SYSTEM_PWM_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);	
    EPWM_setCounterCompareValue(SYSTEM_PWM_BASE, EPWM_COUNTER_COMPARE_B, 0);	
    EPWM_setCounterCompareShadowLoadMode(SYSTEM_PWM_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);	
    EPWM_setActionQualifierAction(SYSTEM_PWM_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);	
    EPWM_enableTripZoneInterrupt(SYSTEM_PWM_BASE, EPWM_TZ_INTERRUPT_DCAEVT1);	
    EPWM_selectDigitalCompareTripInput(SYSTEM_PWM_BASE, EPWM_DC_TRIP_TRIPIN6, EPWM_DC_TYPE_DCAH);	
    EPWM_selectDigitalCompareTripInput(SYSTEM_PWM_BASE, EPWM_DC_TRIP_TRIPIN5, EPWM_DC_TYPE_DCAL);	
    EPWM_setTripZoneDigitalCompareEventCondition(SYSTEM_PWM_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH);	
    EPWM_enableDigitalCompareSyncEvent(SYSTEM_PWM_BASE, EPWM_DC_MODULE_A);	
    EPWM_setDigitalCompareEventSyncMode(SYSTEM_PWM_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_INPUT_NOT_SYNCED);	
    EPWM_selectDigitalCompareCBCLatchClearEvent(SYSTEM_PWM_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_CBC_LATCH_CLR_ON_CNTR_ZERO_PERIOD);	
    EPWM_setDigitalCompareFilterInput(SYSTEM_PWM_BASE, EPWM_DC_WINDOW_SOURCE_DCBEVT2);	
    EPWM_enableInterrupt(SYSTEM_PWM_BASE);	
    EPWM_setInterruptSource(SYSTEM_PWM_BASE, EPWM_INT_TBCTR_ZERO);	
    EPWM_setInterruptEventCount(SYSTEM_PWM_BASE, 1);	
}

What should I add to get direct from DCS and not through TZ ?

  • Hello Sergey,

    I am unable to open the image you shared. 

    But, as per my understanding you want to drive digital compare submodule other than TZ. Yes, this is possible with this function

    EPWM_setActionQualifierT2TriggerSource(uint32_t base, EPWM_ActionQualifierTriggerSource trigger) where your trigger source can be one of them

    This function sets up the sources for Action Qualifier event T2.
    //! Valid values for trigger are:
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync
    //! - EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT - Digital compare filter event
    //!
    //! \return None.

    Let me know if this is what you are looking for?

    Best Regards,

    Uttam

  • Is this image visible?

  • Hi Sergey,

    Unfortunately for F28388D with type 4 ePWM we dont have that feature. Where as the new Type-5 (F28P65 device) can generate your requirement i.e., DCS can directly generate interrupt over Event trigger without using TZEINT. 

    Best,

    Uttam