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.

[参考译文] TMS320F28388D:PWM SyncTo 问题

Guru**** 2680595 points

Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1594311/tms320f28388d-pwm-syncto-question

器件型号: TMS320F28388D
Thread 中讨论的其他器件: SysConfigC2000WARE

您好、  

 我们有 4 个 PWM 运行 1、3、5、8

 PWM 1 以 50 个用例运行、PWM 8 以 100 个用例运行

 PWM 1 灌入 PWM 8
 PWM 3 灌入 PWM 1
 PWM 5 灌入 PWM 1

 除非我们尝试将时间从 50 个用例更改为 80/160、否则一切都按预期运行。 我们看到的是、如果我们将 PWM 8 更改为 160、还会将 PWM 1 TBCR 更改为与 PWM 8 相同的计数。  

 这是正常的吗? 这样、当您更新主 PWM 时、TBCR 将在灌入 PWM 时更新?

 我添加了另一个 PWM 7 并将其灌入 PWM 8、当我更新 PWM 8 TBCR 时、它会在 PWM 1 和 PWM 7 上更新 TBCR。  

Dorion  

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

    Dorion、

    您能否解释一下您的设置、说明哪个 ePWM 正在发送同步输出、以及哪个相关通道将其作为同步输入?

    此致、

    Sumit

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

    您好 Sumit、  

     我想这就是您要找的。  

     我们在下面设置 ePWM8(我们调用 BISS_PWM_POS_BASE):

    // FclConfigPWMCommon:配置单个 PWM 通道以驱动三相电机
    //包括所有通道共用的配置、应针对每个 PWM 运行
    void FocConfigPWM (uint32_t pwmBase、float32_t periodCount)
    {    
       EPWM_setPeriodLoadMode (pwmBase、EPWM_PERIOD_DIRECT_LOAD);

       //由于我们处于递增计数模式、因此需要减 1。
       EPWM_setTimeBasePeriod (BISS_PWM_POS_BASE、(MICROS_TO_SYSCLK_CYCLES (periodCount)–1));    


       EPWM_setPhaseShift (pwmBase、0);
       EPWM_setTimeBaseCounter (pwmBase、0U);

       //示例显示启用此功能、但我正在同步、类似于禁用此功能的 Maglev
       EPWM_disablePhaseShiftLoad (pwmBase);

       //将 PWM 初始化为冻结、直到被告知运行。
       EPWM_setTimeBaseCounterMode (pwmBase、EPWM_COUNTER_MODE_STOP_FREEZE);

       //同步计数后。
       EPWM_setCountModeAfterSync (pwmBase、EPWM_COUNT_MODE_UP_AFTER_SYNC);

       //计数在零时触发
       EPWM_setTimeBaseCounterMode (pwmBase、EPWM_COUNTER_MODE_UP);

       EPWM_setClockPrescaler (pwmBase、EPWM_CLOCK_DIVIDER_1、EPWM_HSCLOCK_DIVIDER_1);

       //在零上启用同步输出脉冲。
       EPWM_enableSyncOutPulseSource (pwmBase、EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    }

    然后、我们设置 ePWM1、我们校准为 U_PWM_BASE、如下所示:
      // PWM 死区计数
      uint32_t dbPWMCount = muss_to_sysclk_cycles (FCL_PWM_DB_USEC);
       
      EPWM_setPeriodLoadMode (pwmBase、EPWM_PERIOD_DIRECT_LOAD);
      EPWM_setTimeBasePeriod (pwmBase、*(pHwConfig->pPwmHalfPeriodCount);
      EPWM_setPhaseShift (pwmBase、0);
      EPWM_setTimeBaseCounter (pwmBase、0U);
      //示例显示启用此功能、但我正在同步、类似于禁用此功能的 Maglev
      EPWM_disablePhaseShiftLoad (pwmBase);
      //将 PWM 初始化为冻结、直到被告知运行。
      EPWM_setTimeBaseCounterMode (pwmBase、EPWM_COUNTER_MODE_STOP_FREEZE);
      //同步计数后。  
      EPWM_setCountModeAfterSync (pwmBase、EPWM_COUNT_MODE_UP_AFTER_SYNC);
      
      //向上和向下计数以使所有 PWM Togeteter 居中
      EPWM_setTimeBaseCounterMode (pwmBase、EPWM_COUNTER_MODE_UP_DOWN);

      EPWM_setClockPrescaler (pwmBase、EPWM_CLOCK_DIVIDER_1、
                  ePWM_HSCLOCK_DIVIDER_1);
       
      //计数器比较子模块寄存器
      //初始设置占空比 0%
      //将在 COUNTER = 0 时加载新的影子值
      EPWM_setCounterCompareValue (pwmBase、EPWM_COUNTER_COMPARE_A、0);
      EPWM_setCounterCompareShadowLoadMode (pwmBase、EPWM_COUNTER_COMPARE_A、EPWM_COMP_LOAD_ON_CNTR_ZERO);
       
      //动作限定器子模块寄存器
      // cmpa 向上计数时变为低电平、COMPA 向下计数时变为高电平。
      EPWM_setActionQualifierActionComplete (pwmBase、EPWM_AQ_OUTPUT_A、
                         (EPWM_ActionQualifierEventAction)(EPWM_AQ_OUTPUT_LOW_DOWN_CMPA |
                                          EPWM_AQ_OUTPUT_HIGH_UP_CMPA);      

      //将死区时钟设置为以 TBCK 速率运行
      EPWM_setDeadBandCounterClock (pwmBase、EPWM_DB_COUNTER_FULL_CYCLE);
       
      // A 和 B 输出都从 A (IN_MODE、DEDB_mode) 获得输入
      ePWM_setRisingEdgeDeadBandDelayInput (pwmBase、ePWM_DB_INPUT_EPWMA);
      EPWM_setFallingEdgeDeadBandDelayInput (pwmBase、EPWM_DB_INPUT_EPWMA);
       
      // B 下降沿输出延迟反相、上升沿延迟不是 (POLSEL)
      EPWM_setDeadBandDelayPolarity (pwmBase、EPWM_DB_RED、EPWM_DB_POLARITY_ACTIVE_HIGH);
      EPWM_setDeadBandDelayPolarity (pwmBase、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);

      // A 和 B 由死区模块 (out_mode) 馈送
      EPWM_setDeadBandDelayMode (pwmBase、EPWM_DB_RED、TRUE);
      ePWM_setDeadBandDelayMode (pwmBase、ePWM_DB_FED、true);
       
      //无交换、A 获取 A、B 获取 B (OUTSWAP)
      ePWM_setDeadBandOutputSwapMode (pwmBase、ePWM_DB_OUTPUT_A、false);
      ePWM_setDeadBandOutputSwapMode (pwmBase、ePWM_DB_OUTPUT_B、false);

      //现在分配固定死区  
      EPWM_setRisingEdgeDelayCount (pwmBase、dbPWMCount);
      EPWM_setFallingEdgeDelayCount (pwmBase、dbPWMCount);

    ===============================================================================

    然后、我们以这种方式同步它们:  
        PwmSyncTo (U1_PWM_BASE、BISS_PWM_POS_BASE);

    然后、如果您按如下方式设置 BISS_PWM_POS_BASE 周期计数:  

        SysCtl_disablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
        EPWM_setTimeBasePeriod (BISS_PWM_POS_BASE、(MICROS_TO_SYSCLK_CYCLES (periodCount)–1));

        上面的行 setTimeBasePeriod 会将 U1_PWM_BASE TBCR 计数更改为如上所示的相同周期计数。  

    易于重现。 我们只想知道这是否是正常行为? 我们是否通过一些配置来实现这一目标?

    Dorion  

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

    忘记包含 pwmSyncTo 函数
    void PwmSyncTo (uint32_t base、uint32_t syncBase)

      EPWM_enablePhaseShiftLoad (base);
      EPWM_setupEPWMLinks (base、GetLink (syncBase)、EPWM_LINK_TBPRD);
      EPWM_setSyncInPulseSource (BASE、GetPulseSource (syncBase));
      EPWM_enableSyncOutPulseSource (syncBase、EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    }

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

    Dorion、

    配置此功能。 我建议参考 C2000Ware 中 ePMW 中的同步示例、以验证您的设置。

    此致、

    Sumit

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

    Sumit,  

     我们过去使用过 SysConfig 来帮助设置。 我可以尝试再次这样做、但我需要回答我的原始问题。 进行 SysConfig 配置不会为我提供所需的答案并且需要一些时间。  

     我的原始问题是、如果您将一个 PWM (A) 灌入另一个 PWM (B)、而您更改 PWM B 的 timeBaseCounter、它是否直接更改 PWM A 的 TBPRD 寄存器?

     我们通过先配置 PWM B、然后配置 PWM A 来解决此问题、由于 PWM 时钟禁用、这不会有任何问题、但我们希望确保我们不会与其他问题发生冲突。  

     似乎没有关于此行为的文档。  

    Dorion  

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

    同步不会更改 TBPRD、而是仅在发生同步事件时将值从 TBPHS 加载到 TBCTR。

    此致、

    Sumit