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.
Hi,
I use 3 launchpads to create a 1 Master - 2 Slaves configuration.
I am using clock signals from Master to synchronize SPWM generation on the slaves. I reset PCLKCR2.bit.EPWM1 | EPWM2 to turn OFF the outputs and set the same bits to turn ON the outputs.
The problem I am facing is that even when I load identical code on both the slave launchpads, when I turn OFF; randomly one of the boards is HIGH and the other is LOW or vice versa. Or sometimes both are LOW or both are HIGH. I would like to ensure that both the boards are LOW when I turn OFF the outputs by resetting PCLKCR2 register bits.
My EPWM1 initialization function on slave is as below. Could you please suggest the changes needed in the below initialization to achieve LOW output when output is turned off?
void epwm1init(void) { /* Disable TBCLK within the EPWM*/ SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); /* Time Base Control Register */ EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); EPWM_setPeriodLoadMode(EPWM1_BASE, EPWM_PERIOD_SHADOW_LOAD); EPWM_selectPeriodLoadEvent(EPWM1_BASE, EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO); EPWM_enablePhaseShiftLoad(EPWM1_BASE); EPWM_setCountModeAfterSync(EPWM1_BASE, EPWM_COUNT_MODE_DOWN_AFTER_SYNC); EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); /* Setup Time-Base (TB) Submodule --*/ EPWM_setTimeBasePeriod(EPWM1_BASE, EPWM1_PRD); /* Time-Base Phase Register */ EPWM_setPhaseShift(EPWM1_BASE, 0); /* Time Base Counter Register */ EPWM_setTimeBaseCounter(EPWM1_BASE, 0); /* Setup Counter_Compare (CC) Submodule */ /* Counter Compare Control Register */ EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_C, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_D, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0); // EPWM_setCounterCompareValue(EPWM1_BASE, // EPWM_COUNTER_COMPARE_A, 500); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 139); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_C, 32000); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_D, 32000); /* Setup Action-Qualifier (AQ) Submodule */ EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); /* Action Qualifier Software Force Register */ EPWM_setActionQualifierContSWForceShadowMode( EPWM1_BASE, EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO); /* Action Qualifier Continuous S/W Force Register */ EPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED); EPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED); /* Setup Dead-Band Generator (DB) Submodule */ /* Dead-Band Generator Control Register */ EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true); EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO); EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO); EPWM_setFallingEdgeDelayCount(EPWM1_BASE, 40); EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 40); /* Setup Event-Trigger (ET) Submodule */ /* Event Trigger Selection and Pre-Scale Register */ EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A); EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_ZERO_OR_PERIOD); EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 1); EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_B); EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_B, EPWM_SOC_TBCTR_ZERO_OR_PERIOD); EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_B, 1); EPWM_enableInterrupt(EPWM1_BASE); EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO_OR_PERIOD); EPWM_setInterruptEventCount(EPWM1_BASE, 1); /* Setup PWM-Chopper (PC) Submodule */ /* PWM Chopper Control Register */ EPWM_disableChopper(EPWM1_BASE); EPWM_setChopperFreq(EPWM1_BASE, 0); EPWM_setChopperFirstPulseWidth(EPWM1_BASE, 0); EPWM_setChopperDutyCycle(EPWM1_BASE, 0); /* Set up Trip-Zone (TZ) Submodule */ EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC1); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC2); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC3); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC4); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC5); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC6); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCAEVT2); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCBEVT2); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT2); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT3); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT4); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT5); EPWM_disableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT6); EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCAEVT1); EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCBEVT1); /* Trip Zone Control Register */ EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_ACTION_DISABLE); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT2, EPWM_TZ_ACTION_DISABLE); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCBEVT1, EPWM_TZ_ACTION_DISABLE); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCBEVT2, EPWM_TZ_ACTION_DISABLE); /* Trip Zone Enable Interrupt Register */ EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST); EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_CBC); EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_DCAEVT1); EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_DCAEVT2); EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_DCBEVT1); EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_DCBEVT2); /* Digital Compare A Control Register */ EPWM_disableDigitalCompareSyncEvent(EPWM1_BASE, EPWM_DC_MODULE_A); EPWM_enableDigitalCompareADCTrigger(EPWM1_BASE, EPWM_DC_MODULE_A); EPWM_setDigitalCompareEventSyncMode(EPWM1_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_INPUT_SYNCED); EPWM_setDigitalCompareEventSyncMode(EPWM1_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_2, EPWM_DC_EVENT_INPUT_NOT_SYNCED); /* Digital Compare B Control Register */ EPWM_disableDigitalCompareSyncEvent(EPWM1_BASE, EPWM_DC_MODULE_B); EPWM_disableDigitalCompareADCTrigger(EPWM1_BASE, EPWM_DC_MODULE_B); EPWM_setDigitalCompareEventSyncMode(EPWM1_BASE, EPWM_DC_MODULE_B, EPWM_DC_EVENT_1, EPWM_DC_EVENT_INPUT_SYNCED); EPWM_setDigitalCompareEventSyncMode(EPWM1_BASE, EPWM_DC_MODULE_B, EPWM_DC_EVENT_2, EPWM_DC_EVENT_INPUT_SYNCED); /* Digital Compare Trip Select Register */ EPWM_enableDigitalCompareTripCombinationInput(EPWM1_BASE, EPWM_DC_COMBINATIONAL_TRIPIN4, EPWM_DC_TYPE_DCAH); EPWM_enableDigitalCompareTripCombinationInput(EPWM1_BASE, EPWM_DC_COMBINATIONAL_TRIPIN1, EPWM_DC_TYPE_DCAL); EPWM_enableDigitalCompareTripCombinationInput(EPWM1_BASE, EPWM_DC_COMBINATIONAL_TRIPIN5, EPWM_DC_TYPE_DCBH); EPWM_enableDigitalCompareTripCombinationInput(EPWM1_BASE, EPWM_DC_COMBINATIONAL_TRIPIN1, EPWM_DC_TYPE_DCBL); /* Trip Zone Digital Comparator Select Register */ EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE, EPWM_TZ_DC_OUTPUT_A1, EPWM_TZ_EVENT_DCXH_HIGH); EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE, EPWM_TZ_DC_OUTPUT_A2, EPWM_TZ_EVENT_DC_DISABLED); EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE, EPWM_TZ_DC_OUTPUT_B1, EPWM_TZ_EVENT_DCXH_HIGH); EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE, EPWM_TZ_DC_OUTPUT_B2, EPWM_TZ_EVENT_DC_DISABLED); /* Digital Compare Filter Control Register */ EPWM_disableDigitalCompareBlankingWindow(EPWM1_BASE); EPWM_setDigitalCompareBlankingEvent(EPWM1_BASE, EPWM_DC_WINDOW_START_TBCTR_ZERO); EPWM_disableDigitalCompareWindowInverseMode(EPWM1_BASE); EPWM_setDigitalCompareFilterInput(EPWM1_BASE, EPWM_DC_WINDOW_SOURCE_DCAEVT1); EPWM_setDigitalCompareWindowOffset(EPWM1_BASE, 0); EPWM_setDigitalCompareWindowLength(EPWM1_BASE, 0); /* Digital Compare Capture Control Register */ EPWM_disableDigitalCompareCounterCapture(EPWM1_BASE); /* HRPWM Configuration Register */ HRPWM_setOutputSwapMode(EPWM1_BASE, FALSE); HRPWM_setChannelBOutputPath(EPWM1_BASE, HRPWM_OUTPUT_ON_B_NORMAL); /* Update the Link Registers with the link value for all the Compare values and TBPRD */ /* No error is thrown if the ePWM register exists in the model or not */ EPWM_setupEPWMLinks(EPWM1_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_TBPRD); EPWM_setupEPWMLinks(EPWM1_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_COMP_A); EPWM_setupEPWMLinks(EPWM1_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_COMP_B); EPWM_setupEPWMLinks(EPWM1_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_COMP_C); EPWM_setupEPWMLinks(EPWM1_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_COMP_D); /* SYNCPER - Peripheral synchronization output event */ HRPWM_setSyncPulseSource(EPWM1_BASE, HRPWM_PWMSYNC_SOURCE_PERIOD); /* Set the ePWM clock divider*/ SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1); SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); /* Disables the clock - to be enabled when Sync Trigger is received*/ EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM1 = 0; EDIS; }
I have tried
1. Clearing TBCTR before turning OFF clock, does not work.
2. I also tried using Action Qualifier SW Force registers just before turning OFF clock, does not work.
Regards,
Rashmitha
Rashmitha,
Please take a look at this thread. It suggests a more deterministic way to set all EPWM to a desired state.
Thanks & Regards,
Santosh
Hi Santosh Jha
Could you please provide the sample for implementing the solution proposed in that thread?
Regards,
Rashmitha
Rashmitha,
That are multiple examples in C2000Ware SDk which illustrates ePWM trip-zone. Please take a look at the pwm examples at: C:/ti/c2000/C2000Ware_4_01_00_00/driverlib/f2837xd/examples/cpu1/epwm/CCS
Thanks & Regards,
Santosh
Hi Santosh Jha,
Thank you for your response.
I have found a simpler way of achieving it with the below lines before turning off EPWM clock. And then I do a reinitialization of the EPWM module before I turn on the clock. This seems to be working for now.
/* Action Qualifier One shot S/W Force Register */
EPWM_setActionQualifierSWAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierSWAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierSWAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierSWAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW);
EPWM_forceActionQualifierSWAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A);
EPWM_forceActionQualifierSWAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B);
EPWM_forceActionQualifierSWAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A);
EPWM_forceActionQualifierSWAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B);
Regards,
Rashmitha