Other Parts Discussed in Thread: C2000WARE
我在例程中进行了如下所示的修改,但是波形并没有移相,是高精度移相和高精度周期代码有冲突吗...
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.
我在例程中进行了如下所示的修改,但是波形并没有移相,是高精度移相和高精度周期代码有冲突吗...
float32_t count_a = (0.3 * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_a = (count_a);
HRPWM_setPhaseShift(ePWM_low_1[i], compCount_a);
//EPWM_setPhaseShift(ePWM_low_1[i], 5);
//HRPWM_setTimeBaseCounter(ePWM_low_1[i], 36);
EPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
initHRPWM(EPWM_TIMER_TBPRD);
HRPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
HRPWM_setSyncOutPulseMode(myEPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
HRPWM_setSyncOutPulseMode(myEPWM3_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM4, SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
HRPWM_setSyncOutPulseMode(myEPWM4_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
HRPWM_setSyncOutPulseMode(myEPWM5_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
HRPWM_setSyncOutPulseMode(myEPWM6_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
HRPWM_setSyncPulseSource(myEPWM1_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
HRPWM_setSyncPulseSource(myEPWM2_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
HRPWM_setSyncPulseSource(myEPWM3_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
HRPWM_setSyncPulseSource(myEPWM4_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
HRPWM_setSyncPulseSource(myEPWM5_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
HRPWM_setSyncPulseSource(myEPWM6_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);
//EPWM_selectPeriodLoadEvent(myEPWM1_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
//EPWM_selectPeriodLoadEvent(myEPWM2_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
HRPWM_enablePhaseShiftLoad(myEPWM1_BASE);
EPWM_enablePhaseShiftLoad(myEPWM1_BASE);
HRPWM_enablePhaseShiftLoad(myEPWM2_BASE);
EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
int k;
for(k=1; k<LAST_EPWM_INDEX_FOR_EXAMPLE; k++)
{
EPWM_enablePhaseShiftLoad(ePWM_low_1[k]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[k]);
}
uint16_t H = 40;
//uint16_t h = (H);
float32_t count_h = (0.2 * (float32_t)(EPWM_TIMER_TBPRD << 8));
uint32_t compCount_h = (count_h);
HRPWM_setPhaseShift(myEPWM1_BASE,H<<8); //H<<8
EPWM_setTimeBaseCounter(myEPWM1_BASE, H);
HRPWM_setPhaseShift(myEPWM2_BASE,H<<8); //H<<8
EPWM_setTimeBaseCounter(myEPWM2_BASE, H);
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
int P1 = 600,P2 = 605;
double F1_1 = 0.124,F1_2 = 0.128;
double F2_1 = 0.1255,F2_2 = 0.1286;
double P = 604.25,F1 = fabs(P-P1)/5*F1_1 + fabs(P-P2)/5*F1_2,F2 = fabs(P-P1)/5*F2_1 + fabs(P-P2)/5*F2_2;
int i = 1;
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_a = (0.2 * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_a = (count_a);
HRPWM_setPhaseShift(ePWM_low_1[i], compCount_a);
EPWM_setPhaseShift(ePWM_low_1[i], 5);
//HRPWM_setTimeBaseCounter(ePWM_low_1[i], 36);
EPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
}
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_b = (0.2 * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_b = (count_b);
HRPWM_setPhaseShift(ePWM_low_2[i], compCount_b);
EPWM_setPhaseShift(ePWM_low_2[i], 5);
//HRPWM_setTimeBaseCounter(ePWM_low_2[i], 36);
EPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
}
//SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
for(;;)
{
status = SFO(); // in background, MEP calibration module
// continuously updates MEP_ScaleFactor
if (status == SFO_ERROR)
{
error(); // SFO function returns 2 if an error occurs & #
// of MEP steps/coarse step
} // exceeds maximum of 255.
}
}
//
// epwm1ISR - ePWM 1 ISR
//
//__interrupt void epwm1ISR(void)
//{
// EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
// Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
//}
void initHRPWM(uint32_t period)
{
uint16_t j;
float32_t count_1 = (0.02 * (float32_t)(EPWM_TIMER_TBPRD << 8));
uint32_t compCount_1 = (count_1);
for (j=1;j<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW;j++)
{
EPWM_setEmulationMode(ePWM_high[j], EPWM_EMULATION_FREE_RUN);
//
// Set-up TBCLK
//
HRPWM_setTimeBasePeriod(ePWM_high[j], ((period-1)<<8));
//HRPWM_setPhaseShift(ePWM_high[j], 0U);
//HRPWM_enablePhaseShiftLoad(ePWM_high[j]);
//EPWM_enablePhaseShiftLoad(ePWM_high[j]);
EPWM_setTimeBaseCounter(ePWM_high[j], 0U);
EPWM_setTimeBaseCounterMode(ePWM_high[j], EPWM_COUNTER_MODE_UP);
EPWM_setPeriodLoadMode(ePWM_high[j],EPWM_PERIOD_SHADOW_LOAD);
EPWM_selectPeriodLoadEvent(ePWM_high[j], EPWM_SHADOW_LOAD_MODE_SYNC);
EPWM_setClockPrescaler(ePWM_high[j],
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
//HRPWM_setCounterCompareShadowLoadEvent(ePWM_high[j], HRPWM_CHANNEL_A,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
//HRPWM_setCounterCompareShadowLoadEvent(ePWM_high[j], HRPWM_CHANNEL_B,HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
//EPWM_setSyncOutPulseMode(ePWM_high[j], EPWM_SYNC_OUT_PULSE_DISABLED);
//EPWM_setSyncOutPulseMode(ePWM_high[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲
EPWM_setCounterCompareShadowLoadMode(ePWM_high[j],
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(ePWM_high[j],
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
HRPWM_setCounterCompareValue(ePWM_high[j], EPWM_COUNTER_COMPARE_A, (period/2 << 8));
HRPWM_setCounterCompareValue(ePWM_high[j], EPWM_COUNTER_COMPARE_B, (period/2 << 8));
//
// Set actions
//
EPWM_setActionQualifierAction(ePWM_high[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM_high[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM_high[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(ePWM_high[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
//if (j==1)
//EPWM_setSyncOutPulseMode(ePWM_high[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲
//设置死区
HRPWM_setRisingEdgeDeadBandDelayInput(ePWM_high[j], EPWM_DB_INPUT_EPWMA);
//EPWM_setRisingEdgeDelayCountShadowLoadMode(ePWM_high[j],EPWM_RED_LOAD_ON_CNTR_ZERO);
//EPWM_setDeadBandCounterClock(ePWM_high[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
HRPWM_setRisingEdgeDelayCount(ePWM_high[j], Deadband_delay_High);
HRPWM_setDeadBandDelayMode(ePWM_high[j],EPWM_DB_RED,true);
HRPWM_setDeadBandOutputSwapMode(ePWM_high[j],EPWM_DB_OUTPUT_A,false);
HRPWM_setDeadBandDelayPolarity(ePWM_high[j],EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
HRPWM_setFallingEdgeDeadBandDelayInput(ePWM_high[j], EPWM_DB_INPUT_EPWMB);
//EPWM_setFallingEdgeDelayCountShadowLoadMode(ePWM_high[j],EPWM_RED_LOAD_ON_CNTR_ZERO);
//EPWM_setDeadBandCounterClock(ePWM_high[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
HRPWM_setFallingEdgeDelayCount(ePWM_high[j], Deadband_delay_High);
HRPWM_setDeadBandDelayMode(ePWM_high[j],EPWM_DB_FED,true);
HRPWM_setDeadBandOutputSwapMode(ePWM_high[j],EPWM_DB_OUTPUT_B,false); //输出不交换
HRPWM_setDeadBandDelayPolarity(ePWM_high[j],EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);
HRPWM_setMEPEdgeSelect(ePWM_high[j], HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM_high[j], HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(ePWM_high[j], HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_setMEPEdgeSelect(ePWM_high[j], HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM_high[j], HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(ePWM_high[j], HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_enableAutoConversion(ePWM_high[j]);
//
// Turn off high-resolution period control.
//
//EPWM_disablePhaseShiftLoad(ePWM_high[j]);
HRPWM_enablePeriodControl(ePWM_high[j]);
}
//设置低压侧前、后各四个管子
for (j=1;j<LAST_EPWM_INDEX_FOR_EXAMPLE;j++)
{
EPWM_setEmulationMode(ePWM_low_1[j], EPWM_EMULATION_FREE_RUN);
//
// Set-up TBCLK
//
EPWM_setTimeBasePeriod(ePWM_low_1[j], ((period-1)));
//HRPWM_setPhaseShift(ePWM_low_1[j], 0U);
//HRPWM_enablePhaseShiftLoad(ePWM_low_1[j]);
//EPWM_enablePhaseShiftLoad(ePWM_low_1[j]);
EPWM_setTimeBaseCounter(ePWM_low_1[j], 0U);
EPWM_setTimeBaseCounterMode(ePWM_low_1[j], EPWM_COUNTER_MODE_UP);
EPWM_setPeriodLoadMode(ePWM_low_1[j],EPWM_PERIOD_SHADOW_LOAD);
//EPWM_selectPeriodLoadEvent(ePWM_low_1[j], EPWM_SHADOW_LOAD_MODE_SYNC);
EPWM_setClockPrescaler(ePWM_low_1[j],
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
//EPWM_setSyncOutPulseMode(ePWM_low_1[j], EPWM_SYNC_OUT_PULSE_DISABLED);
//EPWM_setSyncOutPulseMode(ePWM_low_1[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲
EPWM_setCounterCompareShadowLoadMode(ePWM_low_1[j],
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(ePWM_low_1[j],
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(ePWM_low_1[j], EPWM_COUNTER_COMPARE_A, (period/2 ));
EPWM_setCounterCompareValue(ePWM_low_1[j], EPWM_COUNTER_COMPARE_B, (period/2 ));
//
// Set actions
//
EPWM_setActionQualifierAction(ePWM_low_1[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM_low_1[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(ePWM_low_1[j],
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(ePWM_low_1[j],
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
//if (j==1)
EPWM_setSyncOutPulseMode(ePWM_low_1[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲
//设置死区
EPWM_setRisingEdgeDeadBandDelayInput(ePWM_low_1[j], EPWM_DB_INPUT_EPWMA);
//EPWM_setRisingEdgeDelayCountShadowLoadMode(ePWM_low_1[j],EPWM_RED_LOAD_ON_CNTR_ZERO);
//EPWM_setDeadBandCounterClock(ePWM_low_1[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
EPWM_setRisingEdgeDelayCount(ePWM_low_1[j], Deadband_delay_Low);
EPWM_setDeadBandDelayMode(ePWM_low_1[j],EPWM_DB_RED,true);
EPWM_setDeadBandOutputSwapMode(ePWM_low_1[j],EPWM_DB_OUTPUT_A,false);
EPWM_setDeadBandDelayPolarity(ePWM_low_1[j],EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setFallingEdgeDeadBandDelayInput(ePWM_low_1[j], EPWM_DB_INPUT_EPWMB);
//EPWM_setFallingEdgeDelayCountShadowLoadMode(ePWM_low_1[j],EPWM_RED_LOAD_ON_CNTR_ZERO);
//EPWM_setDeadBandCounterClock(ePWM_low_1[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
EPWM_setFallingEdgeDelayCount(ePWM_low_1[j], Deadband_delay_Low);
EPWM_setDeadBandDelayMode(ePWM_low_1[j],EPWM_DB_FED,true);
EPWM_setDeadBandOutputSwapMode(ePWM_low_1[j],EPWM_DB_OUTPUT_B,false); //输出不交换
EPWM_setDeadBandDelayPolarity(ePWM_low_1[j],EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);
HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_PHASE_CTRL);
//HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_PHASE_CTRL);
//HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_enableAutoConversion(ePWM_low_1[j]);
//
// Turn off high-resolution period control.
//
//EPWM_disablePhaseShiftLoad(ePWM_low_1[j]);
HRPWM_enablePeriodControl(ePWM_low_1[j]);
}
}
//
// error - Halt debugger when called
//
void error (void)
{
ESTOP0; // Stop here and handle error
}compCount_a
这个值是EPWM的相移值+HRPWM的相移值。
我看您代码种调用HRPWM_setPhaseShift后又调用了EPWM_setPhaseShift,那这样的话相移值仅仅是EPWM的相移值。
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_a = (0.2 * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_a = (count_a);
HRPWM_setPhaseShift(ePWM_low_1[i], compCount_a);
EPWM_setPhaseShift(ePWM_low_1[i], 5);
//HRPWM_setTimeBaseCounter(ePWM_low_1[i], 36);
EPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
}
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_b = (0.2 * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_b = (count_b);
HRPWM_setPhaseShift(ePWM_low_2[i], compCount_b);
EPWM_setPhaseShift(ePWM_low_2[i], 5);
//HRPWM_setTimeBaseCounter(ePWM_low_2[i], 36);
EPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
}
int P1 = 600,P2 = 605;
double F1_1 = 0.124,F1_2 = 0.128;
double F2_1 = 0.1255,F2_2 = 0.1286;
double P = 604.25,F1 = fabs(P-P1)/5*F1_1 + fabs(P-P2)/5*F1_2,F2 = fabs(P-P1)/5*F2_1 + fabs(P-P2)/5*F2_2;
int i = 1;
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_a = ((0.98-0.21458) * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_a = (count_a);
HRPWM_setPhaseShift(ePWM_low_1[i], compCount_a);
//uint16_t compCount_a_1 = (compCount_a);
//HRPWM_setHiResPhaseShiftOnly(ePWM_low_1[i], 50u);
EPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
}
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_b = ((0.98-0.22) * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_b = (count_b);
HRPWM_setPhaseShift(ePWM_low_2[i], compCount_b);
EPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
}
我更改成上面的程序之后仍然无法实现高精度移相,上面和下面的移相值是一样的,是我的同步脉冲配置有问题吗,还是有其他问题,另外我把控制模式设置成移相控制模式,但是周期和占空比仍然是高精度的,不知道为什么
HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_PHASE_CTRL); //HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO); HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_PHASE_CTRL); //HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
下面是同步信号设置
EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); EPWM_setSyncOutPulseMode(myEPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); EPWM_setSyncOutPulseMode(myEPWM3_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM4, SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT); EPWM_setSyncOutPulseMode(myEPWM4_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); EPWM_setSyncOutPulseMode(myEPWM5_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); EPWM_setSyncOutPulseMode(myEPWM6_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
下面是我PWM模块的配置程序
EPWM_setTimeBasePeriod(ePWM_low_1[j], ((period-1))); //HRPWM_setPhaseShift(ePWM_low_1[j], 0U); //HRPWM_enablePhaseShiftLoad(ePWM_low_1[j]); //EPWM_enablePhaseShiftLoad(ePWM_low_1[j]); EPWM_setTimeBaseCounter(ePWM_low_1[j], 0U); EPWM_setTimeBaseCounterMode(ePWM_low_1[j], EPWM_COUNTER_MODE_UP); EPWM_setPeriodLoadMode(ePWM_low_1[j],EPWM_PERIOD_SHADOW_LOAD); //EPWM_selectPeriodLoadEvent(ePWM_low_1[j], EPWM_SHADOW_LOAD_MODE_SYNC); EPWM_setClockPrescaler(ePWM_low_1[j], EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); //EPWM_setSyncOutPulseMode(ePWM_low_1[j], EPWM_SYNC_OUT_PULSE_DISABLED); //EPWM_setSyncOutPulseMode(ePWM_low_1[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲 EPWM_setCounterCompareShadowLoadMode(ePWM_low_1[j], EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(ePWM_low_1[j], EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareValue(ePWM_low_1[j], EPWM_COUNTER_COMPARE_A, (period/2 )); EPWM_setCounterCompareValue(ePWM_low_1[j], EPWM_COUNTER_COMPARE_B, (period/2 )); // // Set actions // EPWM_setActionQualifierAction(ePWM_low_1[j], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(ePWM_low_1[j], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(ePWM_low_1[j], EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(ePWM_low_1[j], EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); //if (j==1) //EPWM_setSyncOutPulseMode(ePWM_low_1[j],EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲 //设置死区 EPWM_setRisingEdgeDeadBandDelayInput(ePWM_low_1[j], EPWM_DB_INPUT_EPWMA); //EPWM_setRisingEdgeDelayCountShadowLoadMode(ePWM_low_1[j],EPWM_RED_LOAD_ON_CNTR_ZERO); //EPWM_setDeadBandCounterClock(ePWM_low_1[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE); EPWM_setRisingEdgeDelayCount(ePWM_low_1[j], Deadband_delay_Low); EPWM_setDeadBandDelayMode(ePWM_low_1[j],EPWM_DB_RED,true); EPWM_setDeadBandOutputSwapMode(ePWM_low_1[j],EPWM_DB_OUTPUT_A,false); EPWM_setDeadBandDelayPolarity(ePWM_low_1[j],EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setFallingEdgeDeadBandDelayInput(ePWM_low_1[j], EPWM_DB_INPUT_EPWMB); //EPWM_setFallingEdgeDelayCountShadowLoadMode(ePWM_low_1[j],EPWM_RED_LOAD_ON_CNTR_ZERO); //EPWM_setDeadBandCounterClock(ePWM_low_1[j],EPWM_DB_COUNTER_CLOCK_FULL_CYCLE); EPWM_setFallingEdgeDelayCount(ePWM_low_1[j], Deadband_delay_Low); EPWM_setDeadBandDelayMode(ePWM_low_1[j],EPWM_DB_FED,true); EPWM_setDeadBandOutputSwapMode(ePWM_low_1[j],EPWM_DB_OUTPUT_B,false); //输出不交换 EPWM_setDeadBandDelayPolarity(ePWM_low_1[j],EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW); HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_MEP_PHASE_CTRL); HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO); HRPWM_setMEPEdgeSelect(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE); HRPWM_setMEPControlMode(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_MEP_PHASE_CTRL); HRPWM_setCounterCompareShadowLoadEvent(ePWM_low_1[j], HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO); HRPWM_enableAutoConversion(ePWM_low_1[j]);
您好,还是不行,我按照手册说的数据进行了修改,相位仍然只能按照周期的50分之一的步长移动,不知道什么原因,这个芯片是不是不能实现高精度移相啊
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_a = ((0.98-0.21458) * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_a = (count_a);
HRPWM_setPhaseShift(ePWM_low_1[i], 0x3c03);
//uint16_t compCount_a_1 = (count_a);
//EPWM_setPhaseShift(ePWM_low_1[i], 5U);
//HRPWM_setHiResPhaseShiftOnly(ePWM_low_1[i], 0x0006<<8);
EPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_1[i]);
}
for(i=1; i<LAST_EPWM_INDEX_FOR_EXAMPLE_NEW; i++)
{
float32_t count_b = ((0.98-0.22) * (float32_t)(EPWM_TIMER_TBPRD<<8 ));
uint32_t compCount_b = (count_b);
HRPWM_setPhaseShift(ePWM_low_2[i], 0x3c02);
EPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
HRPWM_enablePhaseShiftLoad(ePWM_low_2[i]);
}抱歉让您久等了,这款芯片可以实现高精度移相。
//#############################################################################
//
// FILE: hrpwm_ex2_slider.c
//
// TITLE: HRPWM Slider.
//
//! \addtogroup driver_example_list
//! <h1>HRPWM Slider</h1>
//!
//! This example modifies the MEP control registers to show edge displacement
//! due to HRPWM. Control blocks of the respective ePWM module channel A and B
//! will have fine edge movement due to HRPWM logic.
//!
//! Monitor ePWM1 A/B pins on an oscilloscope.
//
//
//#############################################################################
//
// $Release Date: $
// $Copyright:
// Copyright (C) 2013-2022 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//#############################################################################
//
// Included Files
//
#include "driverlib.h"
#include "device.h"
#include "board.h"
#define EPWM_TIMER_TBPRD 100UL
//
// Globals
//
uint16_t dutyFine = 1;
uint16_t previousDutyFine = 1;
uint16_t status;
//
// Function Prototypes
//
void initHRPWM(uint32_t period);
void error(void);
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
//
// Disable pin locks and enable internal pull ups.
//
Device_initGPIO();
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Initialize the EPWM GPIOs and CHANGE XBAR inputs from using GPIO0
//
Board_init();
EALLOW;
GPIO_setPinConfig(GPIO_2_EPWM2A);
GPIO_setPinConfig(GPIO_3_EPWM2B);
EPWM_setClockPrescaler(EPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);
EPWM_setTimeBasePeriod(EPWM2_BASE, 0);
EPWM_setTimeBaseCounter(EPWM2_BASE, 0);
EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
EPWM_disablePhaseShiftLoad(EPWM2_BASE);
EPWM_setPhaseShift(EPWM2_BASE, 0);
EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, 0);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, 0);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EDIS;
//
// Disable sync(Freeze clock to PWM as well)
//
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
initHRPWM(EPWM_TIMER_TBPRD);
//
// Enable sync and clock to PWM
//
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
//
// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
//
EINT;
ERTM;
for(;;)
{
if (dutyFine != previousDutyFine)
{
//HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_A,
// (EPWM_TIMER_TBPRD/2 << 8) | dutyFine);
//HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_B,
// (EPWM_TIMER_TBPRD/2 << 8) | dutyFine);
HRPWM_setPhaseShift(EPWM2_BASE, dutyFine);
previousDutyFine = dutyFine;
}
}
}
void initHRPWM(uint32_t period)
{
EPWM_setEmulationMode(myEPWM1_BASE, EPWM_EMULATION_FREE_RUN);
EPWM_setEmulationMode(EPWM2_BASE, EPWM_EMULATION_FREE_RUN);
//
// Set-up TBCLK
//
EPWM_setTimeBasePeriod(myEPWM1_BASE, period-1);
EPWM_setTimeBasePeriod(EPWM2_BASE, period-1);
EPWM_setPhaseShift(myEPWM1_BASE, 0U);
HRPWM_setPhaseShift(EPWM2_BASE, dutyFine);
EPWM_setTimeBaseCounter(myEPWM1_BASE, 0U);
EPWM_setTimeBaseCounter(EPWM2_BASE, 0U);
//
// set duty 50% initially
//
HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_A, (period/2 << 8));
HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_B, (period/2 << 8));
HRPWM_setCounterCompareValue(EPWM2_BASE, HRPWM_COUNTER_COMPARE_A, (period/2 << 8));
HRPWM_setCounterCompareValue(EPWM2_BASE, HRPWM_COUNTER_COMPARE_B, (period/2 << 8));
//
// Set up counter mode
//
EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);
EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_UP);
EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
HRPWM_enablePhaseShiftLoad(EPWM2_BASE);
EPWM_setClockPrescaler(myEPWM1_BASE,
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setClockPrescaler(EPWM2_BASE,
EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
//
// Set up shadowing
//
EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE,
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE,
EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE,
EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
//
// Set actions
//
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(EPWM2_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(EPWM2_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
HRPWM_setMEPEdgeSelect(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_EDGE);
HRPWM_setMEPControlMode(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(myEPWM1_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_setMEPEdgeSelect(myEPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_EDGE);
HRPWM_setMEPControlMode(myEPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(myEPWM1_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_setMEPEdgeSelect(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_PHASE_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO);
HRPWM_setMEPEdgeSelect(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setMEPControlMode(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_PHASE_CTRL);
HRPWM_setCounterCompareShadowLoadEvent(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
//
// Since we are not using the SFO the Auto Conversion
// ***MUST*** be DISABLED .
//
HRPWM_disableAutoConversion(myEPWM1_BASE);
//
// Turn off high-resolution period control.
//
HRPWM_disablePeriodControl(myEPWM1_BASE);
HRPWM_disablePhaseShiftLoad(myEPWM1_BASE);
}
//
// error - Halt debugger when called
//
void error (void)
{
ESTOP0; // Stop here and handle error
}
我的代码是在C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f2837xd\examples\cpu1\hrpwm-->hrpwm_ex2_slider例程的基础上修改的。您导入工程后用我上传的代码替换掉工程的原代码即可。
在debug时:


导入GEL文件后:

现象:
当移相值为1时:


当移相值为100时:


从相应寄存器(TBPHSHR)及示波器上都可以看到移相值发生了变化。
当移相值为100时,移相14.4ns,14.4/100=144ps,大约就是1个MEP step的值。
代码写的有点乱,但是验证了高精度移相。
这个问题持续时间确实有点久,最后再次向您表示抱歉。