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.

[参考译文] TMS320F28P650DK:在两个 PWM 中观察到延迟

Guru**** 2796425 points

Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1606502/tms320f28p650dk-latency-observed-in-two-pwm

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

您好、

MCU 工作时钟频率是带 20MHz 控制器的 120MHz。

 我正在使用 EPWM1 和 EPWM2、但这两个 PWM 之间产生的相移约为 84ns。

输出和 PWM 初始化我有共享(容差,  

如何使这个相移为零? 请您指导我们。

image.png

这是我的初始化。

初始化 ()

  EPWM1init();
  EPWM2init();

  HWREGH (myEPWM1_BASE + EPWM_O_TBCTL)=
      ((HWREGH (myEPWM1_BASE + EPWM_O_TBCTL)&~(EPWM_TBCTL_CTRLMODE_M))|
       ((uint16_t) ePwm_counter_mode_up));

  HWREGH (myEPWM2_BASE + EPWM_O_TBCTL)=
      ((HWREGH (myEPWM2_BASE + EPWM_O_TBCTL)&~(EPWM_TBCTL_CTRLMODE_M))|
       ((uint16_t) ePwm_counter_mode_up));

  SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);

}

void EPWM1init( void )

  EPWM_setClockPrescaler (myEPWM1_BASE、EPWM_CLOCK_DIVIDER_1、EPWM_HSCLOCK_DIVIDER_1);
  EPWM_setTimeBasePeriod (myEPWM1_BASE、0);
  EPWM_setTimeBaseCounter (myEPWM1_BASE、0);
  EPWM_setTimeBaseCounterMode (myEPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);
  EPWM_enablePhaseShiftLoad (myEPWM1_BASE);
  EPWM_setPhaseShift (myEPWM1_BASE、0);

  EPWM_disableCounterCompareShadowLoadMode (myEPWM1_BASE、EPWM_COUNTER_COMPARE_A);
  EPWM_setCounterCompareValue (myEPWM1_BASE、EPWM_COUNTER_COMPARE_A、83);

  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_A、
                 EPWM_AQ_OUTPUT_LOW、
                 EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

  EPWM_setPeriodLoadMode (myEPWM1_BASE、EPWM_PERIOD_DIRECT_LOAD);
  PRD_CLK_GRID = PRD_CLK_GRE_CH;
  EPWM_setTimeBasePeriod (myEPWM1_BASE、PRD_CLK_GRID - 1);
  EPWM_setTimeBaseCounterMode (myEPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);

}

void EPWM2init( void )

  EPWM_setClockPrescaler (myEPWM2_BASE、EPWM_CLOCK_DIVIDER_1、EPWM_HSCLOCK_DIVIDER_1);
  EPWM_setTimeBasePeriod (myEPWM2_base、0);
  EPWM_setTimeBaseCounter (myEPWM2_base、0);
  EPWM_setTimeBaseCounterMode (myEPWM2_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);
  EPWM_setPhaseShift (myEPWM2_base、0);

  EPWM_disableCounterCompareShadowLoadMode (myEPWM2_BASE、EPWM_COUNTER_COMPARE_A);
  EPWM_setCounterCompareValue (myEPWM2_BASE、EPWM_COUNTER_COMPARE_A、83);

  EPWM_setActionQualifierAction (myEPWM2_BASE、EPWM_AQ_OUTPUT_A、
                 EPWM_AQ_OUTPUT_LOW、
                 EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
  EPWM_setActionQualifierAction (myEPWM2_BASE、EPWM_AQ_OUTPUT_A、
                 EPWM_AQ_OUTPUT_HIGH、
                 EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);

  EPWM_setPeriodLoadMode (myEPWM2_base、EPWM_PERIOD_DIRECT_LOAD);
  PRD_CLK_GRID = PRD_CLK_GRE_CH;
  EPWM_setTimeBasePeriod (myEPWM2_base、PRD_CLK_GRID - 1);
  EPWM_setTimeBaseCounterMode (myEPWM1_BASE、EPWM_COUNTER_MODE_STOP_FREEZE);

}

 

此致、

Bhavin P

 

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

    Bhavin,

    这里需要解决三个问题、我建议解决这些问题

    1.在初始化或配置 ePWM 之前、请使用以下序列  

    第一个 SysCtl_disablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);//冻结 TBCLK

    然后进行 ePWM 配置;

    之后只执行 SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);//运行 TBCLK

    这样、它就会正确同步。

    2.我注意到的另一件事是你没有配置 SyncOut 和 syncin。

    如果 SYNCOUT 为 ePWM1、则可以按如下方式对其进行配置

    EPWM_enableSyncOutPulseSource (myEPWM1_BASE、EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
     
    可以在 ePWM2 上配置 syncin、如下所示
    EPWM_setSyncInPulseSource (myEPWM2_BASE、EPWM_SYNC_IN_PULSE_SRC_SYNCOUT EPWM1);
    3.此外、您需要考虑 1~2 TBCLK 静态延迟、如 TRM 一节所示、如下所示:
    在这种情况下、可以在 ePWM2-->EPWM_setPhaseShift (myEPWM2_base、2) 中完成此操作;//在代码中这是“0"</s>“
    如果这样可以解决问题、请告诉我。
    此致、
    Sumit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Sumit,

    同时、您能为我澄清以下内容吗?

    1. 如果我使用单个 PWM 模块 EPWM1 它有两个输出(通道 A 和 B)、

      • 我们可以使用生成 PWM 信号 不同的占空比 并行接口呢?
      • 是可以实现的 零延迟 这两个 PWM 信号之间?
    2. 如果答案是肯定的、您能分享一下 配置详细信息 该设置的 RMS 电流?

    3. 此外、我还希望使用 默认输出状态为高电平 在 PWM 初始化之后、但 PWM 应仅在启动时启动 特定事件触发器 。 这可以实现吗?

    此致、

    Bhavin P

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

    1.以下是关于 A 和 B 上独立占空比控制的响应

    • 如果您希望 EPWM1 的通道 A 和通道 B 以不同的占空比运行、则可以分别使用 CMPA 和 CMPB 两个事件来调整每个通道的占空比并旁路死区模块。
    • 由于其边沿对齐 PWM 模式及其属于同一 ePWM 模块、因此使用向上计数模式时不会有任何延迟

    2.我附加了基于 SysConfig 的示例工程、该工程是根据 C2000ware 的“epwm_ex13_up_AQ"示“示例进行修改的、该示例具有 SysConfig GUI、因此会执行此操作。 ePWM1 设置为在此状态下。 您可以 在表达式窗口中更改 compAVal 以更改 A 的占空比、并更改  B 的占空比

     e2e.ti.com/.../3005.epwm_5F00_ex13_5F00_up_5F00_aq.zip

    3.我在上面的文件中设置了这个:在动作限定器设置中,你可以设置零计数高和比较事件低

    如果对此有任何问题或疑问、请告诉我

    此致、

    Sumit

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

    您好 Sumit、

    太好了、现在一切都运行正常。 但是、我还有一个具体的要求、我不确定是否可以通过 PWM 驱动器来实现。 请参阅所附的信号图。

    要求:

    1. ‑上电时 、频率应从开始 75kHz 高达 脉冲 8 、其中 通道‑A 和通道‑B 是确切的补充 差异不大
      (图中未显示脉冲 1,但存在脉冲)。

    2. 开始 脉冲 8 通道‑A 必须从进行切换 75kHz 至 13kHz

    3. 指定 通道‑B 、转换为 并不相同 至通道‑A 有一个 通道‑B 以 13kHz 频率开始其 PWM 之前的延迟
      延迟量与完全对应 通道‑A 上脉冲 8 的切换点 、如图中所示(蓝色文本)。

    4. 过渡后、 通道‑B 遵循不同的占空比

    我能够成功执行的是  

    1. 从 75KHz 到 13KHz 的通道 A 转换
    2. 无法实现通道 B 所需的延迟

    您能否建议我们在此处通过使用 Chan-A 和 B 的 ePWM 驱动器来实现此要求? 如果是,那么确切地如何运输你可以指南?

    我目前能够实现的目标是:

    • 通道‑A 转换正常 75kHz 至 13kHz
    • 是的 无法在通道‑B 上生成所需的延迟 但在通道 B 上实现了过渡  

    请告知您是否可以使用来实现此要求 EPWM 驱动器具有通道‑A 和通道‑B
    如果是、您能指导我执行此过渡所需的确切方法或顺序吗?

    此致、

    Bhavin P

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

    Bhavin,

    看起来您需要使用全局加载功能来确保仅当两个影子值写入都完成且没有保留部分值时、这两个值才从影子值加载到活动值。 请执行以下两个步骤。

    1.您可以在 syscofig 中编辑以下内容以启用全局加载。

    2.此外、在更新完成后立即在 ISR 中使用以下 API、以指示所有影子写入均已完成、现在值已准备好在下一个影子到活动事件中从影子到活动状态(在这种情况下,TBCTR =零)

    对于全局加载用例、您还可以参阅以下示例: C:\ti\c2000\C2000Ware_6_00_00\driverlib\f28p65x\examples\c28x\epwm\ccs

    如果这样可以解决您的延迟问题、请告诉我。

    此致、

    Sumit