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.

TMS320F280049: TMS320F280049:

Part Number: TMS320F280049
Other Parts Discussed in Thread: C2000WARE

我的板子型号是280049,我在用HRPWM实现高精度移相,并可以调整高精度周期,但是出来的波形没有实现,是不是我的寄存器配置有问题?

  • Hi,

    有参考一下TI给的例程吗:

    C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f28004x\examples\hrpwm

    C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f28004x\examples\hrpwm

  • C:\ti\c2000\C2000Ware_4_02_00_00\device_support\f28004x\examples\hrpwm这个试了,是可以出波形的,但改变周期延时太长了(大概要200ms),并且设置相位输出,无法移相(PWM1为基准,pwm2~4移相输出);

    C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f28004x\examples\hrpwm这个下面的例程编译缺失"board.h”,整个文件夹都搜索了,没有这个文件

  • HRPWM是只能工作在TB_COUNT_UPDOWN模式下?

  • HRPWM是只能工作在TB_COUNT_UPDOWN模式下?

    不是的;

    C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f28004x\examples\hrpwm这个下面的例程编译缺失"board.h”,整个文件夹都搜索了,没有这个文件

    可能因为某些原因导致相关文件缺失,您重新安装SDK或者换个版本试一下,我这边是完全没有问题的;

    我在用HRPWM实现高精度移相,并可以调整高精度周期

    高精度移相和高精度周期/占空比不能同时实现:

  • #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    #include "SFO_V8.h"
    #include <math.h>
    //
    // Defines
    //
    #define EPWM_TIMER_TBPRD    4545UL//5000UL
    #define LAST_EPWM_INDEX_FOR_EXAMPLE    5
    #define MIN_HRPWM_PRD_PERCENT   (20.0003f)
    #define myEPWM1_BASE EPWM1_BASE
    #define myEPWM2_BASE EPWM2_BASE
    #define myEPWM3_BASE EPWM3_BASE
    //
    // Globals
    //
    
    static float64_t periodFine = MIN_HRPWM_PRD_PERCENT;
    
    uint16_t status;
    
    //int MEP_ScaleFactor; // Global variable used by the SFO library
                         // Result can be used for all HRPWM channels
                         // This variable is also copied to HRMSTEP
                         // register by SFO() function.
    
    //volatile uint32_t ePWM[] =
    //    {myEPWM1_BASE,myEPWM2_BASE, myEPWM3_BASE};
    //
    // Function Prototypes
    //
    void initHRPWM(uint32_t period);
    void error(void);
    void PinMuxEPWM1_init();
    void PinMuxEPWM2_init();
    void PinMuxEPWM3_init();
    void EPWM1_init();
    void EPWM2_init();
    void EPWM3_init();
    void initGPIO();
    
    //
    // Main
    //
    
    void changeHZ(double zTemp,double iAngle)
    {
        uint32_t compCount = 0UL;
        double iTemp = 0.0f;
        uint32_t aTemp = 100000UL;
        uint32_t xTemp = 0UL;
        double  yTemp = 0.0f;
        uint32_t iPhase=0;
        iTemp = aTemp / zTemp;
        xTemp = floor(iTemp);  //取整数部分
        yTemp = iTemp - xTemp; //减,以取小数部分
    
    
        compCount= ((xTemp-1) << 8UL)+ (float32_t)(yTemp*256);
        HRPWM_setTimeBasePeriod(myEPWM1_BASE, compCount);
        HRPWM_setTimeBasePeriod(myEPWM3_BASE, compCount);
        HRPWM_setTimeBasePeriod(myEPWM2_BASE, compCount);
    
        //
        // set duty 50% initially
        //
        HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_A, (xTemp/2 << 8));
        //HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_B, (xTemp/2 << 8));
    
        HRPWM_setCounterCompareValue(myEPWM3_BASE, HRPWM_COUNTER_COMPARE_A, (xTemp/2 << 8));
        //HRPWM_setCounterCompareValue(myEPWM3_BASE, HRPWM_COUNTER_COMPARE_B, (xTemp/2 << 8));
    
        HRPWM_setCounterCompareValue(myEPWM2_BASE, HRPWM_COUNTER_COMPARE_A, (xTemp/2 << 8));
        //HRPWM_setCounterCompareValue(myEPWM2_BASE, HRPWM_COUNTER_COMPARE_B, (xTemp/2 << 8));
    
    //iPhase/xTemp*360=iAngle;
    //
        iTemp=((iAngle*xTemp)/360.0f);
        compCount=(uint32_t)iTemp;
        iPhase=xTemp-compCount;
    
        EPWM_setPhaseShift(myEPWM3_BASE, iPhase);
        EPWM_setPhaseShift(myEPWM2_BASE, iPhase);
    }
    void main(void)
    {
        uint16_t abit = 0;
        float32_t angle = 1.0;
        //
        //compCount= ((xTemp-1) << 8UL)+ (float32_t)(yTemp*256);
        //HRPWM_setTimeBasePeriod(myEPWM1_BASE, compCount);
        //HRPWM_setTimeBasePeriod(myEPWM3_BASE, compCount);
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull ups.
        //
        Device_initGPIO();
        CBSP_GIO_LED_Init();
        //
        // 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 EPWM GPIOs
        //
        PinMuxEPWM1_init();
        PinMuxEPWM2_init();
        PinMuxEPWM3_init();
        EPWM1_init();
        EPWM2_init();
        EPWM3_init();
    
        //
        // Calling SFO() updates the HRMSTEP register with calibrated MEP_ScaleFactor.
        // HRMSTEP must be populated with a scale factor value prior to enabling
        // high resolution period control.
        //
        while(status == SFO_INCOMPLETE)
        {
            status = SFO();
            if(status == SFO_ERROR)
            {
                error();   // SFO function returns 2 if an error occurs & # of MEP
            }              // steps/coarse step exceeds maximum of 255.
        }
    
    
    
        //
        // 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;
    
        periodFine=MIN_HRPWM_PRD_PERCENT;
        changeHZ(periodFine,90);
    
        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
        }
    
        for(;;)
        {
             //
             // Sweep DutyFine
             //
             //for(periodFine = MIN_HRPWM_PRD_PERCENT; periodFine < (MIN_HRPWM_PRD_PERCENT+0.805); periodFine += 0.1001)
             //for(periodFine = 1; periodFine < (180); periodFine++)
            LED_TOGGLE();
            if(abit>0)
            {
                if(angle<(180-1))
                {
                    angle++;
                    periodFine+=0.001;
                }
                else
                {
                    abit=0;
                }
            }
            else
            {
                if(angle>1)
                {
                    angle--;
                    periodFine-=0.001;
                }
                else
                {
                    abit=1;
                }
            }
    
             {
                 DEVICE_DELAY_US(10);
                 changeHZ(periodFine,angle);
                 //
                 // Call the scale factor optimizer lib function SFO()
                 // periodically to track for any change due to temp/voltage.
                 // This function generates MEP_ScaleFactor by running the
                 // MEP calibration module in the HRPWM logic. This scale
                 // factor can be used for all HRPWM channels. The SFO()
                 // function also updates the HRMSTEP register with the
                 // scale factor value.
                 //
                 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.
             }
         }
    }
    
    void initHRPWM(uint32_t period)
    {
        EPWM_setEmulationMode(myEPWM1_BASE, EPWM_EMULATION_FREE_RUN);
        EPWM_setEmulationMode(myEPWM2_BASE, EPWM_EMULATION_FREE_RUN);
        EPWM_setEmulationMode(myEPWM3_BASE, EPWM_EMULATION_FREE_RUN);
    
        //
        // Set-up TBCLK
        //
        EPWM_setTimeBasePeriod(myEPWM1_BASE, period-1);
        EPWM_setPhaseShift(myEPWM1_BASE, 0U);
        EPWM_setTimeBaseCounter(myEPWM1_BASE, 0U);
    
        EPWM_setTimeBasePeriod(myEPWM2_BASE, period-1);
        EPWM_setTimeBaseCounter(myEPWM2_BASE, 0U);
    
        EPWM_setTimeBasePeriod(myEPWM3_BASE, period-1);
        EPWM_setTimeBaseCounter(myEPWM3_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(myEPWM2_BASE, HRPWM_COUNTER_COMPARE_A, (period/2 << 8));
        HRPWM_setCounterCompareValue(myEPWM2_BASE, HRPWM_COUNTER_COMPARE_B, (period/2 << 8));
    
        HRPWM_setCounterCompareValue(myEPWM3_BASE, HRPWM_COUNTER_COMPARE_A, (period/2 << 8));
        HRPWM_setCounterCompareValue(myEPWM3_BASE, HRPWM_COUNTER_COMPARE_B, (period/2 << 8));
        //
        // Set up counter mode
        //
        EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);
        EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
        EPWM_setClockPrescaler(myEPWM1_BASE,
                               EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
        EPWM_setTimeBaseCounterMode(myEPWM2_BASE, EPWM_COUNTER_MODE_UP);
        EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
    
        EPWM_setTimeBaseCounterMode(myEPWM3_BASE, EPWM_COUNTER_MODE_UP);
        EPWM_enablePhaseShiftLoad(myEPWM3_BASE);
    
        uint32_t iPeriod=period/3;
        iPeriod=period*0.03;
        EPWM_setPhaseShift(myEPWM3_BASE, iPeriod);
        EPWM_setClockPrescaler(myEPWM3_BASE,
                               EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setSyncOutPulseMode(myEPWM3_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
    
        EPWM_setPhaseShift(myEPWM2_BASE, iPeriod);
        EPWM_setClockPrescaler(myEPWM2_BASE,
                               EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setSyncOutPulseMode(myEPWM2_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
    
        //
        // 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(myEPWM3_BASE,
                                             EPWM_COUNTER_COMPARE_A,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(myEPWM3_BASE,
                                             EPWM_COUNTER_COMPARE_B,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        EPWM_setCounterCompareShadowLoadMode(myEPWM2_BASE,
                                             EPWM_COUNTER_COMPARE_A,
                                             EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(myEPWM2_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(myEPWM3_BASE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        EPWM_setActionQualifierAction(myEPWM3_BASE,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        EPWM_setActionQualifierAction(myEPWM3_BASE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM3_BASE,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
    
    
        EPWM_setActionQualifierAction(myEPWM2_BASE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        EPWM_setActionQualifierAction(myEPWM2_BASE,
                                      EPWM_AQ_OUTPUT_B,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        EPWM_setActionQualifierAction(myEPWM2_BASE,
                                      EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM2_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(myEPWM3_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_EDGE);
        HRPWM_setMEPControlMode(myEPWM3_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
        HRPWM_setCounterCompareShadowLoadEvent(myEPWM3_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO);
    
        HRPWM_setMEPEdgeSelect(myEPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_EDGE);
        HRPWM_setMEPControlMode(myEPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
        HRPWM_setCounterCompareShadowLoadEvent(myEPWM2_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(myEPWM3_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_EDGE);
        HRPWM_setMEPControlMode(myEPWM3_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
        HRPWM_setCounterCompareShadowLoadEvent(myEPWM3_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
    
        HRPWM_setMEPEdgeSelect(myEPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_EDGE);
        HRPWM_setMEPControlMode(myEPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
        HRPWM_setCounterCompareShadowLoadEvent(myEPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO);
    
    
        HRPWM_enableAutoConversion(myEPWM1_BASE);
        HRPWM_enableAutoConversion(myEPWM3_BASE);
        HRPWM_enableAutoConversion(myEPWM2_BASE);
        //
        // Turn on high-resolution period control.
        //
    
        HRPWM_enablePeriodControl(myEPWM1_BASE);
        HRPWM_enablePhaseShiftLoad(myEPWM1_BASE);
    
        HRPWM_enablePeriodControl(myEPWM3_BASE);
        HRPWM_enablePhaseShiftLoad(myEPWM3_BASE);
    
        HRPWM_enablePeriodControl(myEPWM2_BASE);
        HRPWM_enablePhaseShiftLoad(myEPWM2_BASE);
    
        EPWM_forceSyncPulse(myEPWM1_BASE);
        EPWM_forceSyncPulse(myEPWM3_BASE);
        EPWM_forceSyncPulse(myEPWM2_BASE);
    
    }
    void EPWM3_init(){
        EPWM_setClockPrescaler(myEPWM3_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);
        EPWM_setTimeBasePeriod(myEPWM3_BASE, 0);
        EPWM_setTimeBaseCounter(myEPWM3_BASE, 0);
        EPWM_setTimeBaseCounterMode(myEPWM3_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
        EPWM_enablePhaseShiftLoad(myEPWM3_BASE);
        EPWM_setPhaseShift(myEPWM3_BASE, 100);
        EPWM_setCounterCompareValue(myEPWM3_BASE, EPWM_COUNTER_COMPARE_A, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM3_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareValue(myEPWM3_BASE, EPWM_COUNTER_COMPARE_B, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM3_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
     
        EPWM_setSyncOutPulseMode(myEPWM3_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
    
        EPWM_setRisingEdgeDeadBandDelayInput(myEPWM3_BASE,EPWM_DB_INPUT_EPWMA);
        EPWM_setFallingEdgeDeadBandDelayInput(myEPWM3_BASE,EPWM_DB_INPUT_EPWMA);     //配置死区输入模式
        EPWM_setDeadBandDelayPolarity(myEPWM3_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
        EPWM_setDeadBandDelayPolarity(myEPWM3_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性
        EPWM_setDeadBandDelayMode(myEPWM3_BASE,EPWM_DB_RED,true);
        EPWM_setDeadBandDelayMode(myEPWM3_BASE,EPWM_DB_FED,true);                     //配置输出模式
        EPWM_setDeadBandOutputSwapMode(myEPWM3_BASE,EPWM_DB_OUTPUT_A,false);
        EPWM_setDeadBandOutputSwapMode(myEPWM3_BASE,EPWM_DB_OUTPUT_B,false);          //输出不交换
    
        EPWM_setRisingEdgeDelayCount(myEPWM3_BASE,28);                                //上升沿延时0nS
        EPWM_setFallingEdgeDelayCount(myEPWM3_BASE,28);                               //下降沿延时0nS
        
    }
    void EPWM2_init(){
        EPWM_setClockPrescaler(myEPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);
        EPWM_setTimeBasePeriod(myEPWM2_BASE, 0);
        EPWM_setTimeBaseCounter(myEPWM2_BASE, 0);
        EPWM_setTimeBaseCounterMode(myEPWM2_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
        EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
        EPWM_setPhaseShift(myEPWM2_BASE, 100);
        EPWM_setCounterCompareValue(myEPWM2_BASE, EPWM_COUNTER_COMPARE_A, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareValue(myEPWM2_BASE, EPWM_COUNTER_COMPARE_B, 0);
        EPWM_setCounterCompareShadowLoadMode(myEPWM2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        
        EPWM_setSyncOutPulseMode(myEPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
    
    
        EPWM_setRisingEdgeDeadBandDelayInput(myEPWM2_BASE,EPWM_DB_INPUT_EPWMA);
        EPWM_setFallingEdgeDeadBandDelayInput(myEPWM2_BASE,EPWM_DB_INPUT_EPWMA);     //配置死区输入模式
        EPWM_setDeadBandDelayPolarity(myEPWM2_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
        EPWM_setDeadBandDelayPolarity(myEPWM2_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性
        EPWM_setDeadBandDelayMode(myEPWM2_BASE,EPWM_DB_RED,true);
        EPWM_setDeadBandDelayMode(myEPWM2_BASE,EPWM_DB_FED,true);                     //配置输出模式
        EPWM_setDeadBandOutputSwapMode(myEPWM2_BASE,EPWM_DB_OUTPUT_A,false);
        EPWM_setDeadBandOutputSwapMode(myEPWM2_BASE,EPWM_DB_OUTPUT_B,false);          //输出不交换
    
        EPWM_setRisingEdgeDelayCount(myEPWM2_BASE,28);                                //上升沿延时0nS
        EPWM_setFallingEdgeDelayCount(myEPWM2_BASE,28);                               //下降沿延时0nS
    }
    void EPWM1_init(){
        EPWM_setClockPrescaler(myEPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);//ePWM 时钟为100MHZ
        EPWM_setTimeBasePeriod(myEPWM1_BASE, 0);//设置周期值 = 0
        EPWM_setTimeBaseCounter(myEPWM1_BASE, 0);//设置初始值
        EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);//设置为 Stop 计数模式
        EPWM_disablePhaseShiftLoad(myEPWM1_BASE);//不偏移
        EPWM_setPhaseShift(myEPWM1_BASE, 0);//设置偏移值为0
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);//设置CMPA的值
        EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);//设置A比较值加载模式
        EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0);//设置CMPB的值
        EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);//设置B比较值加载模式
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); //ePWMA的
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
    
        
        EPWM_setRisingEdgeDeadBandDelayInput(myEPWM1_BASE,EPWM_DB_INPUT_EPWMA);
        EPWM_setFallingEdgeDeadBandDelayInput(myEPWM1_BASE,EPWM_DB_INPUT_EPWMA);     //配置死区输入模式
        EPWM_setDeadBandDelayPolarity(myEPWM1_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
        EPWM_setDeadBandDelayPolarity(myEPWM1_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性
        EPWM_setDeadBandDelayMode(myEPWM1_BASE,EPWM_DB_RED,true);
        EPWM_setDeadBandDelayMode(myEPWM1_BASE,EPWM_DB_FED,true);                     //配置输出模式
        EPWM_setDeadBandOutputSwapMode(myEPWM1_BASE,EPWM_DB_OUTPUT_A,false);
        EPWM_setDeadBandOutputSwapMode(myEPWM1_BASE,EPWM_DB_OUTPUT_B,false);          //输出不交换
    
        EPWM_setRisingEdgeDelayCount(myEPWM1_BASE,28);                                //上升沿延时0nS
        EPWM_setFallingEdgeDelayCount(myEPWM1_BASE,28);                               //下降沿延时0nS
    
    }
    
    void PinMuxEPWM3_init()
    {
        //
        // EPWM1 -> myEPWM1 Pinmux
        //
        GPIO_setPinConfig(GPIO_4_EPWM3A);
        GPIO_setPinConfig(GPIO_5_EPWM3B);
    
    }
    
    void PinMuxEPWM2_init()
    {
        //
        // EPWM1 -> myEPWM1 Pinmux
        //
        GPIO_setPinConfig(GPIO_2_EPWM2A);
        GPIO_setPinConfig(GPIO_3_EPWM2B);
    
    }
    
    void PinMuxEPWM1_init()
    {
        //
        // EPWM1 -> myEPWM1 Pinmux
        //
        GPIO_setPinConfig(GPIO_0_EPWM1A);
        GPIO_setPinConfig(GPIO_1_EPWM1B);
    }
    

    一、在本论坛找到了一个帖子,照着改了下,发现pwm2和pwm3无法同时移相,具体如下:

    1,PWM1正常开启,当开启pwm2和pwm3的时候,并同时设置pwm2和pwm3的相位角,发现只有pwm2的相位正常改变,pwn3的相位不动,;

    2,PWM1正常开启,当把pwm2关闭,开启pwm3的时候,并同时设置pwm3的相位角,发现pwn3的相位正常改变,;

    3,请问这是什么原因?

    二、我需要实现的功能是:

    1、PWM1A和PWM1B,PWM2A和PWM2B,PWM3A和PWM3B带死区互补输出;

    2、通实时改变PWM1,2,3三组六路的频率,精度是0.1HZ;

    3,PWM2A/B和PWM3A/B 相对于PWM1移相输出;

  • Hi,

    我们的技术支持基于TI的例程。

    EPWM2、3要相对于EPWM1移相,您需要设置EPWM1的同步输出信号,比如在CTR=0或CTR=PRD时输出;还需要设置EPWM2的同步输入信号为EPWM1的同步输出信号,并将这个信号直通给EPWM3。这样便实现了同步,然后EPWM2、3便会根据您配置的移相值,在同步信号到来时装载移相值进行移相。

    (EPWM同步信号链)

    死区互补输出是通过配置DB来实现的:

    详细的配置请您阅读sprui33f_TMS320F28004x Real-Time Microcontrollers Technical Reference Manual (Rev. F) Chapter 18 Enhanced Pulse Width Modulator (ePWM)

    我们只能给您提供一个大概的思路,或者为您解释困扰您的某个点。具体的代码实现您需要靠自己。TI提供的例程全部都在SDK中了。

    --

    谢谢