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.

TMS320F28379D: 28379D能实现高精度PWM移相吗

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

我在例程中进行了如下所示的修改,但是波形并没有移相,是高精度移相和高精度周期代码有冲突吗...

  • 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]);

  • 您的意思是说如果使用高精度移相的话,原本周期1us、频率1Mhz的波形可能会变成周期1.01us、频率980khz左右的是吗

  • 您看一下API手册中对相关函数的描述:

  • 您好,还是不行,我按照手册说的数据进行了修改,相位仍然只能按照周期的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]);
    }

  • 而且手册说的那个函数也不对,应该是HRPWM_enablePhaseShiftLoad(),没有后面那个HR

  • 您把工程上传上来

  • 这个工程在您那边有报错吗?

    您使用的CCS及编译器的版本分别是什么?

  • 没报错,CCS是10.1.1,编译器是TI v21.6.0.TLS

  • 您好,请问我这个工程有什么问题呢

  • 谢谢您的回复,但是您的这个例程只用到了EPWM_setPhaseShift(myEPWM3_BASE, 50)这个函数,就是移相是不连续的,而我需要连续移相

  • 我的同事稍后会更新例程的。

  • 您好,请问这个型号的芯片确定能实现连续的高精度移相吗,之前的例程好像有点问题呀

  • 您好,这个还是不行吧好像,我确实得到了跟图片一样的波形,但是这个程序中只用了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例程的基础上修改的。您导入工程后用我上传的代码替换掉工程的原代码即可。

    F2837xD_HRPWM_slider.gel

    在debug时:

    导入GEL文件后:


    现象:

    当移相值为1时:

    当移相值为100时:

    从相应寄存器(TBPHSHR)及示波器上都可以看到移相值发生了变化。

    当移相值为100时,移相14.4ns,14.4/100=144ps,大约就是1个MEP step的值。

    代码写的有点乱,但是验证了高精度移相。

    这个问题持续时间确实有点久,最后再次向您表示抱歉。

  • 好的好的,非常感谢,但是不知道为什么当移相值设为100的时候,占空比会变小,设成200的时候会变得更小,您知道是怎么回事吗

  • 我使用上述代码观测到的占空比并没有随着移相值的增大而减小