Dear c2000 expert,
Regarding to HRPWM, I have some questions:
1. From reference manual, HRLOAD should be set to load at CTR = 0 OR CTR = PRD in up down mode, is it possible to set load at CTR = 0 only? Because I have 3 PWMs, writing to EPWM registers take some time, and it will cause some of PWM's register didn't update if load either at CTR = 0 OR CTR = PRD while PWM runs in about 1Mhz.
2. Rising edge jitter, when I configure TB in up-down mode, and the rising edge is at the CTR = 0, falling edge is at CTR reaches to CMPA in up direction, then I see the rising edge have some jitter, jitter time is 10ns. Can you please help me know why?
Jitter initialization code, I just change the AQ register configuration from TI's example code.
void initHRPWM(uint32_t period)
{
uint16_t j;
//
// ePWM channel register configuration with HRPWM
// ePWMxA / ePWMxB toggle low/high with MEP control on Rising and Falling edges
//
for (j=1;j<LAST_EPWM_INDEX_FOR_EXAMPLE;j++)
{
EPWM_setEmulationMode(ePWM[j], EPWM_EMULATION_FREE_RUN);
//
// Set-up TBCLK
//
EPWM_setTimeBasePeriod(ePWM[j], period-1);
EPWM_setPhaseShift(ePWM[j], 0U);
EPWM_setTimeBaseCounter(ePWM[j], 0U);
//
// set duty 50% initially
//
HRPWM_setCounterCompareValue(ePWM[j], HRPWM_COUNTER_COMPARE_A, (period/2 << 8) + 1);
HRPWM_setCounterCompareValue(ePWM[j], HRPWM_COUNTER_COMPARE_B, (period/2 << 8) + 1);
//
// Set up counter mode
//
EPWM_setTimeBaseCounterMode(ePWM[j], EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad(ePWM[j]);
EPWM_setClockPrescaler(ePWM[j],
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setSyncOutPulseMode(ePWM[j], EPWM_SYNC_OUT_PULSE_DISABLED);
//
// Set up shadowing
// MUST BE CTR=(ZER & PRD)
//
EPWM_setCounterCompareShadowLoadMode(ePWM[j],
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);
EPWM_setCounterCompareShadowLoadMode(ePWM[j],
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);
//
// Set actions
//
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
#if CHANNEL_B_AS_ZRO_PRD_REF == 1
//
// Use B channel as the ZERO and PRD reference
//
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
#else
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(ePWM[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
#endif
HRPWM_setMEPEdgeSelect(ePWM[j], HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM[j], HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
//
// Set up shadowing
// MUST BE CTR=(ZER & PRD)
//
HRPWM_setCounterCompareShadowLoadEvent(ePWM[j], HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
#if CHANNEL_B_AS_ZRO_PRD_REF == 0
HRPWM_setMEPEdgeSelect(ePWM[j], HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM[j], HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
//
// Set up shadowing
// MUST BE CTR=(ZER & PRD)
//
HRPWM_setCounterCompareShadowLoadEvent(ePWM[j], HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
#endif
HRPWM_enableAutoConversion(ePWM[j]);
//
// Turn on high-resolution period control for DUTY to take HR on BOTH EDGEs.
//
HRPWM_enablePeriodControl(ePWM[j]);
HRPWM_enablePhaseShiftLoad(ePWM[j]);
//
// Interrupt where we will change the Compare Values
// Select INT on Time base counter zero event,
// Enable INT, generate INT on 1st event
//
//EPWM_setInterruptSource(ePWM[j], EPWM_INT_TBCTR_ZERO);
//EPWM_enableInterrupt(ePWM[j]);
//EPWM_setInterruptEventCount(ePWM[j], 1U);
}
}
Regards,
Jack