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.

[参考译文] TMS320F280049C:TMS320F280049C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1232844/tms320f280049c-tms320f280049c

器件型号:TMS320F280049C
主题中讨论的其他器件:C2000WARE

大家好!

我正在使用代码 epwm_ex13_up_aq.c。我已在此处附加了代码。  

其目标是:

1) 1)将占空比更改至50%、并将其固定为50%。

2)提供由看门狗中的变量"Ph"定义的相移

为了实现这一点、我 在看门狗中有两个标志:AshikFlag 和 loop_counter。 若要启用相移、loop_counter 应等于 AshikFlag。

我目前面临着一些挑战:

1) 1)在较高的频率下、当我将 LOOP_COUNTER 更改为 AshikFlag 时、EPWM2变得不稳定。 我认为它是因为我在 EPWM2的 ISR 函数中放了一个硬代码。 有更智能的方法来实现它吗?

代码已添加。

谢谢。

Ashik

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//###########################################################################
//
// FILE: epwm_ex13_up_aq.c
//
// TITLE: Action Qualifier Module - Using up count.
//
//! \addtogroup driver_example_list
//! <h1> EPWM Action Qualifier (epwm_up_aq)</h1>
//!
//! This example configures ePWM1, ePWM2, ePWM3 to produce an
//! waveform with independent modulation on EPWMxA and
//! EPWMxB.
//!
//! The compare values CMPA and CMPB are modified within the ePWM's ISR.
//!
//! The TB counter is in up count mode for this example.
//!
//! View the EPWM1A/B(GPIO0 & GPIO1), EPWM2A/B(GPIO2 & GPIO3)
//! and EPWM3A/B(GPIO4 & GPIO5) waveforms via an oscilloscope.
//!
//
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    尊敬的 Ashik:

    对延迟回复深表歉意。

    这个代码片段很长、您能否在代码中标识您关心的特定位置? loop_counter 和 AshikFlag 的作用是什么? 能否提供 EPWM2在较低和较高频率下的示波器截图?

    谢谢!

    Luke

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

    Luke、您好!

    我添加了相关代码。

    我想在 PWM 达到50%占空比后从看门狗分配相移(Ph)。 我不太了解用于确定占空比何时达到50%的直观方法。 这就是为什么在 updateCompare()中,我在第623行中放置了一个标志。 在 epwm2isr()中断函数中,我做了检查(代码片段中给出)。 在将 AshikFlag 的最终值放入 loop_counter 的同时、我可以从看门狗启动 else 循环。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    __interrupt void epwm2ISR(void)
    {
    //
    // Update the CMPA and CMPB values
    //
    if (loop_counter!=AshikFlag)
    {
    updateCompare(&epwm2Info);
    }
    else
    {
    //Ph=300;
    EPWM_selectPeriodLoadEvent(myEPWM2_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
    EPWM_setPhaseShift(myEPWM2_BASE, Ph); //ashik added Ph
    EPWM_setTimeBaseCounter(myEPWM2_BASE, Ph); //ashik added Ph
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     

    看门狗

    loop_counter==AshikFlag 之前发生的所有事件

     loop_counter==AshikFlag 之后进行映射

    感谢您的帮助。

    Ashik

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

    大家好、Luke、这方面有任何更新吗?

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

    尊敬的 Ashik:

    我假设该示波器屏幕截图从顶部到底部显示了 EPWM1A、EPWM1B、EPWM2A、EPWM2B。 如果不正确、请告诉我。

    Ph 应该是300吗? 我在代码顶部看到 EPWM2_TIMER_TBPRD 为100。 这是否有意为之? 我没有看到任何用于修改 Ph 的代码、它是如何修改的?

    如果相移大于 CMPA 值、将出现错过的动作限定器事件、因为发生相移时、TBCTR 将跳过 CMPA。

    当占空比达到50%时、您对 EPWM2的期望相移是多大?

    输出中的干扰 可能是由于您 在原始代码片段的第262行对 ePWM TBCTR 进行了硬编码所致。 此代码的用途是什么? 仅仅对相移值进行编程以使相移在下一个 ePWM 周期中生效是不够的吗? 由于 ISR 中先前调用的 driverlib 函数的开销、在触发 EPWM2中断和执行此代码之间会有一定的延迟、 因此、执行此代码后、EPWM1和 EPWM2之间的有效相移实际上并不是 Ph。

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

    感谢您的回复 Luke。

    "我假设这个示波器图片从上到下依次显示了 EPWM1A、EPWM1B、EPWM2A、EPWM2B。 如果这是不正确的,请告诉我。"

    -是的,您是正确的。 虽然代码中有 EPWM3、但我目前暂不考虑该 EPWM3。

    "是不是应该是人?" 我在代码顶部看到 EPWM2_TIMER_TBPRD 为100。 这是否有意为之? 我没有看到任何修改 Ph 的代码、它是如何修改的"

    "如果相移大于 CMPA 值、将出现错过的动作限定器事件、因为发生相移时、TBCTR 将跳过 CMPA。"

    -谢谢你指出这一点。 我错了。 时间 EPWM2_TIMER_TBPRD 为100、30度漂移的 Ph 值应为~8。

    -我已将应用 Ph 的逻辑放入_interrupt void epwm2ISR (void)中。  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    __interrupt void epwm2ISR(void)
    {
    //
    // Update the CMPA and CMPB values
    //
    if (loop_counter!=AshikFlag)
    {
    updateCompare(&epwm2Info);
    }
    else
    {
    //Ph=300;
    EPWM_selectPeriodLoadEvent(myEPWM2_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
    EPWM_setPhaseShift(myEPWM2_BASE, Ph); //ashik added Ph
    EPWM_setTimeBaseCounter(myEPWM2_BASE, Ph); //ashik added Ph
    }
    //
    // Clear INT flag for this timer
    //
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我正在更新看门狗中的 Ph 值。 若要启用任何相移、loop_counter 变量需要与 AshikFlag 相同、如下图所示。

    "当占空比达到50%时、您期望 EPWM2的相移有多大?"

    -现在我期望它从10-30度的变化

    现在主要问题是、当我 通过使 loop_counter=150从看门狗启用_interrupt void epwm2ISR (void)中的逻辑时、ePWM 会变得不稳定。  

    此代码的目的是在初始不存在相移的半桥中应用 PWM、在达到50%占空比后、它将提供特定的相移。 它在低频下工作(即12.5kHz)。 但在较高频率下、epwm2变得不稳定。

    请您对此发表评论。 谢谢

    Ashik

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

    尊敬的 Ashik:

    为了说明这一点、整个代码块的目的是在 EPWM2达到50%占空比时应用相移:

    ePWM_selectPeriodLoadEvent (myEPWM2_base、ePWM_shadow_load_mode_sync);
    EPWM_setPhaseShift (myEPWM2_base、Ph);//ashik 添加了 Ph
    ePWM_setTimeBaseCounter (myEPWM2_base、Ph);//ashik 添加了 Ph

    可能是我误解了您之前的回复、但我仍然不明白为什么以下代码行是必要的:

    ePWM_setTimeBaseCounter (myEPWM2_base、Ph);//ashik 添加了 Ph

    如果调用 EPWM_setPhaseShift、相移将在下一次 EPWM1 TBCTR = 0时生效、因此不需要调用 EPWM_setTimeBaseCounter 来手动将 EPWM2 TBCTR 设置为与相移相同的值、 并且可能会影响您的同步、尤其是在较高 PWM 频率下、此时 ISR 的执行时间是恒定的。

    如果我有误解、或者为什么需要在 ISR 中调用 ePWM_setTimeBaseCounter、请告诉我。

    谢谢!

    Luke

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

    哇,太棒了 它解决了 EPWM2中的不稳定问题。 我已禁用以下行

    //ePWM_setTimeBaseCounter (myEPWM2_base、Ph);//ashik 添加了 Ph。

    只是另一个查询。

    现在 EPWM2B 从 EPWM2A 的上升沿向左移动。 我想使移位具有双向性。 如果我想把 EPWM2B 直接从 EPWM2A 的上升沿进行移位、您能否建议我应在哪个函数中进行更改?

    衷心感谢您指出我的准则中存在的错误。

    Ashik

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

    尊敬的 Ashik:

    很高兴听到这个问题解决了不稳定问题。 如果您希望在输出的一个边沿上产生延迟、您可以利用死区模块。  如果您需要有关死区模块的一般背景信息、我们在此处提供了一个非常有用的视频:

    https://www.ti.com/video/6304743885001?keyMatch=EPWM%20DEADBAND

    该模块可以延迟其中一个 EPWM 输出的上升沿或下降沿、基本上会将它们移至示波器的右侧。

    如果您有任何进一步的问题、请告诉我。

    谢谢!

    Luke

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

    Luke、您好!

    似乎看门狗在 Ph 变量中给出了一个负值、这会使 EPWM2在右侧移动。 负值转换为无符号整数。

    您能告诉我 F280049C 可以工作的最大频率是多少吗? 如何从代码中检查它?

    我可以在使用的代码中应用 HRPWM 吗?

    感谢您的支持。

     Ashik

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

    Luke、您好!

    您可以为我提供任何参考、以便我可以将 HRPWM 集成到当前代码中?

    Ashik

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

    尊敬的 Ashik:

    C2000Ware 中有使用 HRPWM 的示例、如果您在将这些示例用作在系统中添加 HRPWM 功能的基准时遇到任何问题、敬请告知。

    数据表包含系统中包括 ePWM 时钟在内的各种时钟的最大时钟值、在 F28004x 上、该值为100MHz