Other Parts Discussed in Thread: C2000WARE
Hello Forms,
I tried to generate Variable Sine PWM Signals using ePWM Signals at 10kHz Frequency
Observations as Follows:
PWM Signals - 9.98KHz.
Dead Band (RED/FED) - 400ns
Vdc = 48V
Modulation Index = 0.01
Natural Frequecy (Set) = 25Hz
Natural Frequecy (Observation) = ~23.5Hz
ePWM Configuration used as Follows.
void EPWM_init(){
EPWM_setClockPrescaler(EPWM_1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(EPWM_1_BASE, 2499);
EPWM_setTimeBaseCounter(EPWM_1_BASE, 0);
EPWM_setTimeBaseCounterMode(EPWM_1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad(EPWM_1_BASE);
EPWM_setPhaseShift(EPWM_1_BASE, 0);
EPWM_forceSyncPulse(EPWM_1_BASE);
EPWM_setSyncOutPulseMode(EPWM_1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
EPWM_setSyncPulseSource(EPWM_1_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
EPWM_setCounterCompareValue(EPWM_1_BASE, EPWM_COUNTER_COMPARE_A, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM_1_BASE, EPWM_COUNTER_COMPARE_B, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_disableActionQualifierShadowLoadMode(EPWM_1_BASE, EPWM_ACTION_QUALIFIER_A);
EPWM_setActionQualifierShadowLoadMode(EPWM_1_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_disableActionQualifierShadowLoadMode(EPWM_1_BASE, EPWM_ACTION_QUALIFIER_B);
EPWM_setActionQualifierShadowLoadMode(EPWM_1_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setDeadBandDelayPolarity(EPWM_1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_LOW);
EPWM_setDeadBandDelayMode(EPWM_1_BASE, EPWM_DB_RED, true);
EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM_1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_setRisingEdgeDelayCount(EPWM_1_BASE, 40);
EPWM_setDeadBandDelayMode(EPWM_1_BASE, EPWM_DB_FED, true);
EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM_1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_setFallingEdgeDelayCount(EPWM_1_BASE, 40);
EPWM_setDeadBandCounterClock(EPWM_1_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
EPWM_enableInterrupt(EPWM_1_BASE);
EPWM_setInterruptSource(EPWM_1_BASE, EPWM_INT_TBCTR_PERIOD);
EPWM_setInterruptEventCount(EPWM_1_BASE, 1);
EPWM_enableADCTrigger(EPWM_1_BASE, EPWM_SOC_A);
EPWM_setADCTriggerSource(EPWM_1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_1_BASE, EPWM_SOC_A, 1);
EPWM_enableADCTrigger(EPWM_1_BASE, EPWM_SOC_B);
EPWM_setADCTriggerSource(EPWM_1_BASE, EPWM_SOC_B, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_1_BASE, EPWM_SOC_B, 1);
EPWM_setClockPrescaler(EPWM_2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setPeriodLoadMode(EPWM_2_BASE, EPWM_PERIOD_DIRECT_LOAD);
EPWM_setTimeBasePeriod(EPWM_2_BASE, 2499);
EPWM_setupEPWMLinks(EPWM_2_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_TBPRD);
EPWM_setTimeBaseCounter(EPWM_2_BASE, 0);
EPWM_setTimeBaseCounterMode(EPWM_2_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_enablePhaseShiftLoad(EPWM_2_BASE);
EPWM_setPhaseShift(EPWM_2_BASE, 2);
EPWM_setSyncOutPulseMode(EPWM_2_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
EPWM_setSyncPulseSource(EPWM_2_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
EPWM_setCounterCompareValue(EPWM_2_BASE, EPWM_COUNTER_COMPARE_A, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM_2_BASE, EPWM_COUNTER_COMPARE_B, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_disableActionQualifierShadowLoadMode(EPWM_2_BASE, EPWM_ACTION_QUALIFIER_A);
EPWM_setActionQualifierShadowLoadMode(EPWM_2_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_disableActionQualifierShadowLoadMode(EPWM_2_BASE, EPWM_ACTION_QUALIFIER_B);
EPWM_setActionQualifierShadowLoadMode(EPWM_2_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setDeadBandDelayPolarity(EPWM_2_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_LOW);
EPWM_setDeadBandDelayMode(EPWM_2_BASE, EPWM_DB_RED, true);
EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM_2_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_setRisingEdgeDelayCount(EPWM_2_BASE, 40);
EPWM_setDeadBandDelayMode(EPWM_2_BASE, EPWM_DB_FED, true);
EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM_2_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_setFallingEdgeDelayCount(EPWM_2_BASE, 40);
EPWM_setDeadBandCounterClock(EPWM_2_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
EPWM_enableADCTrigger(EPWM_2_BASE, EPWM_SOC_A);
EPWM_setADCTriggerSource(EPWM_2_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_2_BASE, EPWM_SOC_A, 1);
EPWM_enableADCTrigger(EPWM_2_BASE, EPWM_SOC_B);
EPWM_setADCTriggerSource(EPWM_2_BASE, EPWM_SOC_B, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_2_BASE, EPWM_SOC_B, 1);
EPWM_setClockPrescaler(EPWM_3_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(EPWM_3_BASE, 2499);
EPWM_setupEPWMLinks(EPWM_3_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_TBPRD);
EPWM_setTimeBaseCounter(EPWM_3_BASE, 0);
EPWM_setTimeBaseCounterMode(EPWM_3_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_enablePhaseShiftLoad(EPWM_3_BASE);
EPWM_setPhaseShift(EPWM_3_BASE, 2);
EPWM_setSyncOutPulseMode(EPWM_3_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
EPWM_setSyncPulseSource(EPWM_3_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
EPWM_setCounterCompareValue(EPWM_3_BASE, EPWM_COUNTER_COMPARE_A, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_3_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM_3_BASE, EPWM_COUNTER_COMPARE_B, 1250);
EPWM_setCounterCompareShadowLoadMode(EPWM_3_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_disableActionQualifierShadowLoadMode(EPWM_3_BASE, EPWM_ACTION_QUALIFIER_A);
EPWM_setActionQualifierShadowLoadMode(EPWM_3_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_disableActionQualifierShadowLoadMode(EPWM_3_BASE, EPWM_ACTION_QUALIFIER_B);
EPWM_setActionQualifierShadowLoadMode(EPWM_3_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierSWAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM_3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setDeadBandDelayPolarity(EPWM_3_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_LOW);
EPWM_setDeadBandDelayMode(EPWM_3_BASE, EPWM_DB_RED, true);
EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM_3_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_setRisingEdgeDelayCount(EPWM_3_BASE, 40);
EPWM_setDeadBandDelayMode(EPWM_3_BASE, EPWM_DB_FED, true);
EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM_3_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_setFallingEdgeDelayCount(EPWM_3_BASE, 40);
EPWM_setDeadBandCounterClock(EPWM_3_BASE, EPWM_DB_COUNTER_CLOCK_HALF_CYCLE);
EPWM_enableADCTrigger(EPWM_3_BASE, EPWM_SOC_A);
EPWM_setADCTriggerSource(EPWM_3_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_3_BASE, EPWM_SOC_A, 1);
EPWM_enableADCTrigger(EPWM_3_BASE, EPWM_SOC_B);
EPWM_setADCTriggerSource(EPWM_3_BASE, EPWM_SOC_B, EPWM_SOC_TBCTR_PERIOD);
EPWM_setADCTriggerEventPrescale(EPWM_3_BASE, EPWM_SOC_B, 1);
}
Compare Value Assignment as Follows.
static inline uint16_t limitCMP(epwmInformation *epwmInfo, uint16_t cmp)
{
if(cmp < epwmInfo->epwmMinCompB) cmp = epwmInfo->epwmMinCompB;
if(cmp > epwmInfo->epwmMaxCompB) cmp = epwmInfo->epwmMaxCompB;
return cmp;
}
void updateCompareSoft(epwmInformation *epwmInfo, uint16_t targetCmpA, uint16_t targetCmpB)
{
uint16_t currentCmpA = EPWM_getCounterCompareValue(epwmInfo->epwmModule,
EPWM_COUNTER_COMPARE_A);
uint16_t currentCmpB = EPWM_getCounterCompareValue(epwmInfo->epwmModule,
EPWM_COUNTER_COMPARE_B);
// Soft step size — controls how fast we approach the target
uint16_t stepSize = epwmInfo->stepSize;
// - Duty Compare Value
/*if(targetCmpA>epwmInfo->epwmMaxCompA)
{
targetCmpA = epwmInfo->epwmMaxCompA;
}
if(targetCmpA<epwmInfo->epwmMinCompA)
{
targetCmpA = epwmInfo->epwmMinCompA;
}*/
//targetCmpA = LimitVerification(targetCmpA, epwmInfo->epwmMinCompA, epwmInfo->epwmMaxCompA);
// Update CMPA smoothly
if(currentCmpA < targetCmpA)
{
currentCmpA = (targetCmpA - currentCmpA > stepSize) ?
(currentCmpA + stepSize) : targetCmpA;
}
else if(currentCmpA > targetCmpA)
{
currentCmpA = (currentCmpA - targetCmpA > stepSize) ?
(currentCmpA - stepSize) : targetCmpA;
}
EPWM_setCounterCompareValue(epwmInfo->epwmModule,
EPWM_COUNTER_COMPARE_A,
targetCmpA);
// + Duty Compare Value
//targetCmpB = LimitVerification(targetCmpB, epwmInfo->epwmMinCompB, epwmInfo->epwmMaxCompB);
if(targetCmpB>epwmInfo->epwmMaxCompB)
{
targetCmpB = epwmInfo->epwmMaxCompB;
}
if(targetCmpB<epwmInfo->epwmMinCompB)
{
targetCmpB = epwmInfo->epwmMinCompB;
}
// Update CMPB smoothly
if(currentCmpB < targetCmpB)
{
currentCmpB = (targetCmpB - currentCmpB > stepSize) ?
(currentCmpB + stepSize) : targetCmpB;
}
else if(currentCmpB > targetCmpB)
{
currentCmpB = (currentCmpB - targetCmpB > stepSize) ?
(currentCmpB - stepSize) : targetCmpB;
}
EPWM_setCounterCompareValue(epwmInfo->epwmModule,
EPWM_COUNTER_COMPARE_B,
targetCmpB);
}
void UpdateAction(void)
{
pVabc_pu.value[0] = limitCMP(&epwm1Info, pVabc_pu.value[0]);
pVabc_pu.value[1] = limitCMP(&epwm2Info, pVabc_pu.value[1]);
pVabc_pu.value[2] = limitCMP(&epwm3Info, pVabc_pu.value[2]);
updateCompareSoft(&epwm1Info,(uint16_t) pVabc_pu.value[0],(uint16_t) pVabc_pu.value[0]);
updateCompareSoft(&epwm2Info,(uint16_t) pVabc_pu.value[1],(uint16_t) pVabc_pu.value[1]);
updateCompareSoft(&epwm3Info,(uint16_t) pVabc_pu.value[2],(uint16_t) pVabc_pu.value[2]);
}
Main Interrupt
__interrupt void INT_EPWM_1_ISR(void)
{
UpdateAction();
//... Protections
if (NOT_ON_FLAG != 0) {
pastdelta =
(SineFrequency * 0.00005); // 2*TBPRD*Interrupt Frequency
Currentdelta += pastdelta;
Temp_Rad = Currentdelta * 12.56637061;
// OverFlow Protection
if (Temp_Rad >= TWO_PI) {
//Currentdelta = 0;
Temp_Rad -= TWO_PI;
}
Compa1 = modulation_index *
sinf(Temp_Rad); // Amplitude(10) * Sinef(rad) = I_sense1
Compa2 = modulation_index *
sinf((Temp_Rad - 2.094395f)); // Amplitude * Sinef(rad
// - 2.094395f) = I_sense2
Compa3 = -Compa1 - Compa2; // Park() -< theta +30 = rad
pVabc_pu.value[0] = (uint16_t)((Compa1 * (amplitude_scale_1)) +
(amplitude_scale_1));
pVabc_pu.value[1] = (uint16_t)((Compa2 * (amplitude_scale_2)) +
(amplitude_scale_2));
pVabc_pu.value[2] = (uint16_t)((Compa3 * (amplitude_scale_3)) +
(amplitude_scale_3));
} else {
Currentdelta = 0;
}
Kindly Let me Know if any Issue in the above code.
Thanks in Advance,
Soumitri Kumar



