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

  • 您好,您使用的是哪个例程?

  • hrpwm-ex1-duty-sfo

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请问高精度移相需要怎么配置呢,我调用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]);
    }
  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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]);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我更改成上面的程序之后仍然无法实现高精度移相,上面和下面的移相值是一样的,是我的同步脉冲配置有问题吗,还是有其他问题,另外我把控制模式设置成移相控制模式,但是周期和占空比仍然是高精度的,不知道为什么

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    下面是同步信号设置

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 下面是我PWM模块的配置程序

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

  • 您好,还是不行,我按照手册说的数据进行了修改,相位仍然只能按照周期的50分之一的步长移动,不知道什么原因,这个芯片是不是不能实现高精度移相啊

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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]);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 而且手册说的那个函数也不对,应该是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倍,这样不能符合项目要求,您给出的这个程序好像是只是高精度的改变周期吧?

  • 我跟进一下

  • 您好,请问这个型号的芯片能实现我上面说的连续移相吗

  • 我还在等待回复

  • 您好,有回复了吗

  • 不好意思,有几个点还需要确认一下。

    我一直在持续跟进这件事。

  • 抱歉让您久等了,这款芯片可以实现高精度移相。

    hrpwm_ex2_slider.c
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //#############################################################################
    //
    // 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: $
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的代码是在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的时候会变得更小,您知道是怎么回事吗

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

x 出现错误。请重试或与管理员联系。