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.

[参考译文] TMS320F28.0049万:EPWMB的计数问题

Guru**** 2589280 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1093976/tms320f280049-count-up_down-problem-with-epwmb

部件号:TMS320F28.0049万
Thread:sysconfigC2000WARE中讨论的其它部件

您好,

我让ePWM在Up_DOWN模式下工作,我按如下方式进行资格鉴定:

    // ePWMA High when TBCTR=0
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
     EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

    // ePWMA Low when up count TBCTR=CMPA
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
     EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);

    // ePWMA High when down count TBCTR=CMPA
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
     EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);

    // ePWMB Low when TBCTR=0
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
     EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

    // ePWMB High when up count TBCTR=CMPA
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
     EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);

    // ePWMB Low when down count TBCTR=CMPA
    EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
     EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);

所以,我从EPMW_A高开始,当我到达比较器时,我将其降低,然后在向下穿过比较器时再次将其提高。 ePWM_B的工作是互补的。

我在ePWM_B上得到以下峰值,而_A保持低(占空比= 0)

可能是什么问题?

n´t我使用Just COUNT_UP模式,我没有这个问题...

非常感谢!

路易斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luis,

    我已将您的帖子分配给主题专家,但由于美国假期,请期待我们在星期一结束前回复您。

    最佳,
    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这应该是由于行动的优先次序。 您能否查看TRM中的表格,了解具有不同优先级的操作。

    或者,您可以将 ePWM_AQ_OUTPT_ON_TIMEBASE _ZERO和 ePWM_AQ_OUTPT_ON_TIMEBASE _句 点的所有操作设置为
    不执行任何操作选项。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Nima:

    感谢您的回复,但这不能解决问题:

        // ePWMA High when TBCTR=0
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
         EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        // ePWMA Low when up count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
         EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // ePWMA High when down count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
         EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        // ePWMB Low when TBCTR=0
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
         EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        // ePWMB High when up count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
         EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // ePWMB Low when down count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
         EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        ///////////// check this out!!!!! if this helps!!!
        // ePWMB Low when down count TBCTR=PERIOD
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
          EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);

    我不´m它能是什么…… ´s,虽然我一直在考虑“死时间”,但这一数值比规定的要高,所以没有。

    谢谢!

    巴西,

    路易斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luis,上面的代码片段,你没有尝试我建议的内容。 您可以尝试一下吗?

    ePWM_AQ_OUTPT_NO_CHANGE

    对所有非CMPAU和CMPAD操作使用上述项目。

    ePWM_setActionQualifierAction (ePWM_bas[PWM],ePWM_AQ_OUTPT_B,
    ePWM_AQ_OUTPT_NO_CHANGE,ePWM_AQ_OUTPT_ON_TIMEBASE周期);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉,我很失望。

    你是不是想这样?

        // ePWMA NO CHANGE when TBCTR=0
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
          EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        // ePWMA Low when up count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
         EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // ePWMA High when down count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_A,
         EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        // ePWMB NO CHANGE when TBCTR=0
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
          EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
    
        // ePWMB High when up count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
         EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        // ePWMB Low when down count TBCTR=CMPA
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
         EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        // ePWMB NO CHANGE when down count TBCTR=PERIOD
        EPWM_setActionQualifierAction(EPWM_BASE[pwm], EPWM_AQ_OUTPUT_B,
          EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);

    我会在周一来这里试试的:)  

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的! 试试吧!

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另外,如果您有C2000Ware 4.01 ,请使用sysconfig工具!

    www.ti.com/.../spracx3.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉,但问题仍然存在...  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否可以尝试将OUTPT_A的CMBB操作设置为无更改,反之亦然?

    NIMA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Nima:

    我正在进行几次测试,然后我意识到问题是我使用HRPWM模块,而不是使用正常的ePWM ...

      // Calibrate MEP_ScaleFactor
      do {
          sfoStatus = SFO();
      } while(sfoStatus == SFO_INCOMPLETE);
    
      //#MEP steps per coarse step at 180ps(10n/180ps) MEP_scaleFactor=55
      HRPWM_setMEPStep(base, MEP_ScaleFactor);
    
      // HRCAL uses the EPWM1 clock
      SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
    
      // Turn off high-resolution period control, as we do only duty control.
      HRPWM_disablePhaseShiftLoad(base); //--> Enable this for Phase shift load (DAB)
    
      HRPWM_setMEPControlMode(base, HRPWM_CHANNEL_A,
        HRPWM_MEP_DUTY_PERIOD_CTRL);
      // MEP control on both edges. For channel A
      HRPWM_setMEPEdgeSelect(base, HRPWM_CHANNEL_A,
        HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
      HRPWM_setCounterCompareShadowLoadEvent(base,
        HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    
      //Setting of comparator, phase and deadband HR-modes
      HRPWM_setCounterCompareValue(base, HRPWM_COUNTER_COMPARE_A, 0);
    
      HRPWM_enableAutoConversion(base);
    
      HRPWM_enablePeriodControl(base); //-->Enable this for Duty cycle load (Buck/AC/DC)
    
      //synchronization pulse input
      HRPWM_setSyncPulseSource(base, HRPWM_PWMSYNC_SOURCE_ZERO);

    当我以这种方式初始化HRPWM时,我就遇到了这个问题...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正在使用SFO库?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,  

    是的,我´m使用它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不需要:

    //#在180PS (10n/180PS)时每粗步进的MEP步数MEP_ScaleFactor=55
    HRPWM_setMEPStep (BASE,MEP_ScaleFactor);

    在执行SFO或任何其他初始化之前,需要完成以下代码行。

    // HRCAL使用EPWM1时钟
    sysctl_enablePeripheral (sysctl_Periph_CLK_EPWM1);

    使用HRPWM时,您有一个占空比限制:

    请参阅TRM的本节。