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 }
请问高精度移相需要怎么配置呢,我调用HRPWM_setPhaseShift(ePWM_low_1[i], compCount_a)函数,结果相位值仍然是以周期的50分之一的步长移动,而不能以其他步长移动,比如我想移相周期的0.24855倍,但是实际移相是周期的0.24倍,这样很难满足项目的要求,TI官方又没有提供高精度移相的例程
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]); }
您好,这个还是不行吧好像,我确实得到了跟图片一样的波形,但是这个程序中只用了EPWM_setPhaseShift(myEPWM3_BASE, period/2);这个函数,这样的话移相就只能是周期的50分之一的整数倍(EPWM的时钟是50Mhz,period=50),但是我需要移相周期的0.212345倍这样的数,按照这个程序的话就只能移相周期的0.22倍,这样不能符合项目要求,您给出的这个程序好像是只是高精度的改变周期吧?
抱歉让您久等了,这款芯片可以实现高精度移相。
//############################################################################# // // 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的值。
代码写的有点乱,但是验证了高精度移相。
这个问题持续时间确实有点久,最后再次向您表示抱歉。