您好!
我有一个问题、我配置了两个以不同频率运行的 ePWM、我希望它们同相。 我希望 SPWM_U (EPWM1_BASE)上触发 SPWM_for_ADC (EPWM7_BASE)。 我一定忘记了配置、能帮我吗?
谢谢
Damien
void epwm_init(uint32_t base)
{
/**Parameters*/
EPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP);
EPWM_setTimeBaseCounter(base, 0U);
EPWM_setClockPrescaler(base, EPWM_CLOCK_DIVIDER_4, EPWM_HSCLOCK_DIVIDER_4);
/**Set up shadowing*/
EPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
/**Set actions
For boost assembly*/
EPWM_setActionQualifierAction(base, SPWM_TOP, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(base, SPWM_TOP, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
/**For buck assembly*/
EPWM_setActionQualifierAction(base, SPWM_BOT, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(base, SPWM_BOT, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
}
void epwm_settings(uint32_t base)
{
if((base == SPWM_U) ||
(base == SPWM_V) ||
(base == SPWM_W))
{
//for test
EPWM_setCounterCompareValue(SPWM_U, EPWM_COUNTER_COMPARE_B, 78);
EPWM_setCounterCompareValue(SPWM_V, EPWM_COUNTER_COMPARE_B, 78);
EPWM_setTimeBasePeriod(base, EPWM_TBPRD);
}
else if(base == SPWM_FOR_ADC)
{
EPWM_setCounterCompareValue(SPWM_FOR_ADC, EPWM_COUNTER_COMPARE_A, 78);//CMPA_EPWM_ADC
EPWM_setTimeBasePeriod(SPWM_FOR_ADC, 156);//EPWM_TBPRD_ADC
}
else if(base == SPWM_REGU)
{
EPWM_setTimeBasePeriod(base, EPWM_TBPRD_REGU);
/**Initialize PWM to regulation interrupt*/
EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, CMPA_EPWM_REGU);
/// Interrupt where we will change the Compare Values
/// Select INT on Time base counter zero event,
/// Enable INT, generate INT on 1rd event
EPWM_setInterruptSource(base, EPWM_INT_TBCTR_ZERO);
EPWM_enableInterrupt(base);
EPWM_setInterruptEventCount(base, 1U);
}
}
void epwm_set_phase(uint32_t base, uint16_t phi)
{
/**Configure ePMWs*/
// Todo comments to explain
if(phi == 0)
{
EPWM_disablePhaseShiftLoad(base);
EPWM_setPhaseShift(base, phi);
EPWM_enableSyncOutPulseSource(base, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
}
else
{
uint16_t tbphs = epwm_get_tbphs_from_phi(base, phi);
EPWM_setSyncInPulseSource(base, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
EPWM_enablePhaseShiftLoad(base);
EPWM_selectPeriodLoadEvent(base, EPWM_SHADOW_LOAD_MODE_SYNC);
EPWM_setPhaseShift(base, tbphs);
EPWM_setTimeBaseCounter(base, tbphs);
}
}
