Dear team:
When my customer configured synchronization between PWM modules. He uses pwm1 to synchronize pwm2 / 3 (with 180° phase shift). At the same time, the synchronization source of pwm4 also comes from pwm1.
At present, synchronization and phase shift have been realized.
However, the period of the first pulse output by Synchronous PWM is not fixed, Sometimes the period of the first pulse is three times that of the set pulse, and sometimes the period of the lower pulse is half that of the set pulse.
The following is the customer's code. Is there any problem with the configuration?
void InitEPWM(void) { Gpio_Pwm_cfg(); PWM2_PWM3_Close(); //lop1 pwm关闭 PWM1_PWM4_Close(); //lop2 pwm关闭 SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); // 关同步 Disable sync(Freeze clock to PWM as well) initEPWM2(); initEPWM3(); initEPWM1(); initEPWM4(); SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); // 开同步 Enable sync and clock to PWM } void Gpio_Pwm_cfg(void) { // 设置 GPIO0/1 为 ePWM1A/1B GPIO_setPadConfig(0, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_0_EPWM1A); GPIO_setPadConfig(1, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_1_EPWM1B); // 设置 GPIO2/3 为 ePWM2A/2B GPIO_setPadConfig(2, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_2_EPWM2A); GPIO_setPadConfig(3, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_3_EPWM2B); // 设置 GPIO4/5 为 ePWM3A/3B GPIO_setPadConfig(4, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_4_EPWM3A); GPIO_setPadConfig(5, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_5_EPWM3B); // 设置 GPIO6/7 为 ePWM4A/4B GPIO_setPadConfig(6, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_6_EPWM4A); GPIO_setPadConfig(7, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_7_EPWM4B); } //EPWM1的初始化配置 void initEPWM1() { EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1,EPWM_HSCLOCK_DIVIDER_1); //ePWM 时钟为100MHZ EPWM_setTimeBaseCounterMode(EPWM1_BASE,EPWM_COUNTER_MODE_UP_DOWN); //设置计数模式(增计数) EPWM_setTimeBaseCounter(EPWM1_BASE,0); //计数初始值设置 EPWM_setTimeBasePeriod(EPWM1_BASE,PWM_PERIOD); //计数周期 fs=100kHz(1000) EPWM_setPeriodLoadMode(EPWM1_BASE,EPWM_PERIOD_SHADOW_LOAD); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_disablePhaseShiftLoad(EPWM1_BASE); EPWM_setPhaseShift(EPWM1_BASE, 0U); EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,EPWM1_MIN_CMPA); //设定比较值 EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,EPWM1_MIN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setSyncOutPulseMode(EPWM1_BASE,EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //计数到零时发出同步脉冲 EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA); //配置死区输入模式 EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性 EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_RED,true); EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_FED,true); //配置输出模式 EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_A,false); EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_B,false); //输出不交换 EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 80); //上升沿延时 EPWM_setFallingEdgeDelayCount(EPWM1_BASE,80); //下降沿延时 EPWM_enableADCTrigger(EPWM1_BASE,EPWM_SOC_A); EPWM_setADCTriggerSource(EPWM1_BASE,EPWM_SOC_A,EPWM_SOC_TBCTR_PERIOD); EPWM_setADCTriggerEventPrescale(EPWM1_BASE,EPWM_SOC_A,1); } //EPWM2的初始化配置 void initEPWM2() { EPWM_setClockPrescaler(EPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); //ePWM 时钟为100MHZ EPWM_setTimeBaseCounterMode(EPWM2_BASE,EPWM_COUNTER_MODE_UP_DOWN); //设置计数模式(updown EPWM_setTimeBaseCounter(EPWM2_BASE,0); //计数初始值设置 EPWM_setTimeBasePeriod(EPWM2_BASE,PWM_PERIOD); //计数周期 EPWM_setPeriodLoadMode(EPWM2_BASE,EPWM_PERIOD_SHADOW_LOAD); //周期加载模式 EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_A,EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareValue(EPWM2_BASE,EPWM_COUNTER_COMPARE_A,EPWM2_MIN_CMPA); //设定比较值 EPWM_setCounterCompareValue(EPWM2_BASE,EPWM_COUNTER_COMPARE_B,EPWM2_MIN_CMPA); EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM2_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM2_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_enablePhaseShiftLoad(EPWM2_BASE); //使能相位寄存器 EPWM_setSyncOutPulseMode(EPWM2_BASE,EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); //计数到零时发出同步脉冲 EPWM_setPhaseShift(EPWM2_BASE,2000); EPWM_setRisingEdgeDeadBandDelayInput(EPWM2_BASE,EPWM_DB_INPUT_EPWMA); //互补生成PWMB EPWM_setFallingEdgeDeadBandDelayInput(EPWM2_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setDeadBandDelayPolarity(EPWM2_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM2_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性,这里实际上体现了PWMA和PWMB是互补的 EPWM_setDeadBandDelayMode(EPWM2_BASE,EPWM_DB_RED,true); EPWM_setDeadBandDelayMode(EPWM2_BASE,EPWM_DB_FED,true); //配置输出模式 EPWM_setDeadBandOutputSwapMode(EPWM2_BASE,EPWM_DB_OUTPUT_A,false); EPWM_setDeadBandOutputSwapMode(EPWM2_BASE,EPWM_DB_OUTPUT_B,false); //输出不交换 EPWM_setRisingEdgeDelayCount(EPWM2_BASE,80); //上升沿延时 EPWM_setFallingEdgeDelayCount(EPWM2_BASE,80); //下降沿延时 } //EPWM3的初始化配置 void initEPWM3() { EPWM_setTimeBaseCounterMode(EPWM3_BASE, EPWM_COUNTER_MODE_UP_DOWN); EPWM_disablePhaseShiftLoad(EPWM3_BASE); EPWM_setClockPrescaler(EPWM3_BASE,EPWM_CLOCK_DIVIDER_1,EPWM_HSCLOCK_DIVIDER_1); EPWM_setTimeBasePeriod(EPWM3_BASE, PWM_PERIOD); EPWM_enablePhaseShiftLoad(EPWM3_BASE); //使能相位寄存器 EPWM_setSyncOutPulseMode(EPWM3_BASE,EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); //计数到零时发出同步脉冲 EPWM_setPhaseShift(EPWM3_BASE, 2000); //移向180° EPWM_setTimeBaseCounter(EPWM3_BASE, 0); EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_A,EPWM3_MIN_CMPA); EPWM_setCounterCompareValue(EPWM3_BASE, EPWM_COUNTER_COMPARE_B,EPWM3_MIN_CMPA); EPWM_setPeriodLoadMode(EPWM3_BASE,EPWM_PERIOD_SHADOW_LOAD); //周期加载模式 EPWM_setCounterCompareShadowLoadMode(EPWM3_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);//比较值加载模式 EPWM_setActionQualifierAction(EPWM3_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM3_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM3_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM3_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setRisingEdgeDeadBandDelayInput(EPWM3_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM3_BASE,EPWM_DB_INPUT_EPWMA); //配置死区输入模式 EPWM_setDeadBandDelayPolarity(EPWM3_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM3_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性 EPWM_setDeadBandDelayMode(EPWM3_BASE,EPWM_DB_RED,true); EPWM_setDeadBandDelayMode(EPWM3_BASE,EPWM_DB_FED,true); //配置输出模式经过死区 EPWM_setDeadBandOutputSwapMode(EPWM3_BASE,EPWM_DB_OUTPUT_A,false); EPWM_setDeadBandOutputSwapMode(EPWM3_BASE,EPWM_DB_OUTPUT_B,false); //输出不交换 EPWM_setRisingEdgeDelayCount(EPWM3_BASE,80); //上升沿延时 EPWM_setFallingEdgeDelayCount(EPWM3_BASE,80); //下降沿延时 } //EPWM4的初始化配置 void initEPWM4() { EPWM_setTimeBasePeriod(EPWM4_BASE, PWM_PERIOD); EPWM_enablePhaseShiftLoad(EPWM4_BASE); //使能相位寄存器 EPWM_setSyncOutPulseMode(EPWM4_BASE,EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN); //计数到零时发出同步脉冲 EPWM_setPhaseShift(EPWM4_BASE, 0); EPWM_setTimeBaseCounter(EPWM4_BASE, 0U); EPWM_setCounterCompareValue(EPWM4_BASE, EPWM_COUNTER_COMPARE_A,EPWM4_MIN_CMPA); EPWM_setCounterCompareValue(EPWM4_BASE, EPWM_COUNTER_COMPARE_B,EPWM4_MIN_CMPA); EPWM_setTimeBaseCounterMode(EPWM4_BASE, EPWM_COUNTER_MODE_UP_DOWN); EPWM_disablePhaseShiftLoad(EPWM4_BASE); EPWM_setClockPrescaler(EPWM4_BASE,EPWM_CLOCK_DIVIDER_1,EPWM_HSCLOCK_DIVIDER_1); EPWM_setPeriodLoadMode(EPWM4_BASE,EPWM_PERIOD_SHADOW_LOAD); //周期加载模式 EPWM_setCounterCompareShadowLoadMode(EPWM4_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);//比较值加载模式 EPWM_setActionQualifierAction(EPWM4_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM4_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);//pwm4A==1 EPWM_setActionQualifierAction(EPWM4_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM4_BASE,EPWM_AQ_OUTPUT_B,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);//pwm4b==0 EPWM_setRisingEdgeDeadBandDelayInput(EPWM4_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM4_BASE,EPWM_DB_INPUT_EPWMA); //配置死区输入模式 S4,S5=0 EPWM_setDeadBandDelayPolarity(EPWM4_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM4_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性 EPWM_setDeadBandDelayMode(EPWM4_BASE,EPWM_DB_RED,true); EPWM_setDeadBandDelayMode(EPWM4_BASE,EPWM_DB_FED,true); //配置输出模式 EPWM_setDeadBandOutputSwapMode(EPWM4_BASE,EPWM_DB_OUTPUT_A,false); EPWM_setDeadBandOutputSwapMode(EPWM4_BASE,EPWM_DB_OUTPUT_B,false); //输出不交换 EPWM_setRisingEdgeDelayCount(EPWM4_BASE,80); //上升沿延时 EPWM_setFallingEdgeDelayCount(EPWM4_BASE,80); //下降沿延时 }
Best regards