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.

[参考译文] AM2732:ePWMA 和 ePWMB 同步

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1495321/am2732-synchronisation-of-epwma-and-epwmb

部件号:AM2732

工具/软件:

尊敬的 Al:

我的客户希望在 ePWMA 的 TBCTR 达到0且 ePWMB 计数设置为0 (与 ePWMA 相同)时通过执行同步来同步 ePWMA 和 ePWMB。

使用以下示例代码
MCU_PLUS_SDK_am273x_09_02_00_52\examples\drivers\epwm_duty_cycle

ePWMA 的 SYNCOUT 设置和 ePWMB 的 PHSEN 设置。
ePWMA 寄存器如下所示。
当 SYNCOSEL=设置为0时、会实现 TBCTR.0x01和同步输出。

[问题]

例如、当我将 ePWM 的 TBPHS 更改为"1"时、会发现当 ePWMA 的 TBCTR 设置为0时、ePWMB 的 TBCTR 未设置为"1"。 (因为输出波形不变)
我想确认此设置是否正确。
PHSEN 设置为1、但我认为 ePWMA 的同步输出未被识别(我担心 SYNCI 位也为0)。

输出波形没有问题。
检查 ePWMA 和 ePWMB 是否继续与该设置同步。

此致、

ITO

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

    尊敬的 Ito:

    感谢您联系 e2e。

    您能否阐明此用例是否存在波形问题? 这两个注释相互冲突、因此我不确定问题是波形问题还是仅存在于 CCS 中。

    -

    Unknown 说:
    、因为输出波形不会改变

    -

    Unknown 说:
    输出波形没有问题

    其次、您好像问道、对于 MCU_PLUS_SDK_am273x_09_02_00_52\examples\drivers\epwm\epwm_DUTY_cycle 中的 TBCTR 和 TBPHS、屏幕截图中的寄存器设置和值是否正确。 这是正确的吗?

    此致、

    哈雷

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

    尊敬的 Alexander:

    感谢您的答复。

    连接的波形没有问题、但他们不确定是否会始终保持同步。
    客户想要检查的是用于同步 ePWMA 和 ePWMB 的正确寄存器设置。

    如果将"1"置于 TBPHS 中、则在 ePWMA 的 TBCTR 设置为"0"时、ePWMB 的 TBCTR 应设置为"1"。
    但是、客户认为电流设置不正确、因为输出波形不变。

    -换句话说,他们敢于更改设置,以检查设置是否正确,并尝试更改波形,但失败。

    [问题]

    请检查是否能够同步第一个所附映像中的寄存器设置而不会出现问题。

    其次、您好像会问、对于 MCU_PLUS_SDK_am273x_09_02_00_52\examples\drivers\epwb\EPWM_Duty_cycle 中的 TBCTR 和 TBPHS、屏幕截图中的寄存器设置和值是否正确。 这是正确的吗?

    是的。

    此致、

    ITO

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

    尊敬的 Ito:

    非常感谢澄清。 这需要一些时间。 我将于4月4日发布最新情况。

    此致、

    哈雷

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

    尊敬的 Ito:

    ePWMB TBCTL_PHSEN 值看起来正确、但您能否确认 ePWMB 屏幕截图中的值是来自运行 EPWM_Duty_CYCLE 示例之前还是之后? 是否修改了 EPWM_DUTY_CYCLE 示例?

    我问是因为代码调用"ePWM_tbSyncDisable ()",这将禁用同步。 (即使发生同步输入事件、也不会重新加载计数值。 开机自检结束时链接。)

    如果 ePWMB 在未进行任何编辑的情况下运行 EPWM_DUTY_CYCLE、这可能会解释该问题、但我仍然需要时间检查其他 ePWMB 项目。 我可以在4月9日再次提供最新情况。

    谢谢、

    哈雷

    https://dev.ti.com/tirex/content/mcu_plus_sdk_am273x_09_02_00_52/docs/api_guide_am273x/group__DRV__EPWM__MODULE.html#ga49bd10727c0dc4329e8bee9dd362f00b

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

    嗨、Haley、

    感谢您的答复。

    ePWMB TBCTL_PHSEN 值看起来正确、但您能否确认 ePWMB 屏幕截图中的值是来自运行 ePwm_DUTY_cycle 示例之前还是之后? 并且是否无论如何修改了 EPWM_DUTY_CYCLE 示例?

    ePWMB 是  运行 EPWM_DUTY_CYCLE 示例后的值。

    请参阅以下代码进行修改。

    #include <kernel/dpl/DebugP.h>
    #include <kernel/dpl/AddrTranslateP.h>
    #include <kernel/dpl/SemaphoreP.h>
    #include <kernel/dpl/HwiP.h>
    #include <kernel/dpl/ClockP.h>
    #include <drivers/epwm.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    
    //Stop the clock with MSS_EPWMCONFG, 
    //ePWM settings and add #define to make it work.
    #define ADDR_MSS_EPWMCONFIG             (*(volatile uint32_t*)(0x02120090))
    
    /* Global variables and objects */
    static HwiP_Object       gEpwmHwiObject_Pwm0;
    static HwiP_Object       gEpwmHwiObject_Pwm1;
    static SemaphoreP_Object gEpwmSyncSemObject;
    
    /* Function Prototypes */
    static void App_epwmIntrISR_Pwm0(void *handle);
    static void App_epwmIntrISR_Pwm1(void *handle);
    static void App_epwmConfig(void);
    
    /* variable to hold base address of EPWM that is used */
    uint32_t gGpioBaseAddr;
    
    uint32_t gEpwmBaseAddr_Pwm0;
    uint32_t gEpwmBaseAddr_Pwm1;
    uint32_t gEpwmBaseAddr_Pwm2;
    
    
    void epwm_duty_cycle_main(void *args)
    {
        int32_t             status;
        HwiP_Params         hwiPrmsPwm0, hwiPrmsPwm1;
    
        /* Open drivers to open the UART driver for console */
        Drivers_open();
        Board_driversOpen();
    
        DebugP_log("EPWM Duty Cycle Test Started ...\r\n");
        DebugP_log("Please refer EXAMPLES_DRIVERS_EPWM_DUTY_CYCLE example user \
    guide for the test setup to probe EPWM signal. \r\n");
        DebugP_log("App will wait for 60 seconds (using PWM period ISR) ...\r\n");
    
        /* Get address after translation translate */
        gGpioBaseAddr = (uint32_t) AddrTranslateP_getLocalAddr(GPIO_LED_BASE_ADDR);
        GPIO_setDirMode(gGpioBaseAddr, GPIO_LED_PIN, GPIO_LED_DIR);
    
        /* Address translate */
        gEpwmBaseAddr_Pwm0 = (uint32_t)AddrTranslateP_getLocalAddr(CONFIG_EPWM0_BASE_ADDR);
        gEpwmBaseAddr_Pwm1 = (uint32_t)AddrTranslateP_getLocalAddr(CONFIG_EPWM1_BASE_ADDR);
        gEpwmBaseAddr_Pwm2 = (uint32_t)AddrTranslateP_getLocalAddr(CONFIG_EPWM2_BASE_ADDR);
    
        /* Stop all three channels with epwmconfig in MSS_CTRL */
        ADDR_MSS_EPWMCONFIG = 0x00000000;
    
        /* Configure PWM */
        App_epwmConfig();
    
        /* START */
        ADDR_MSS_EPWMCONFIG = 0x07000000;
    
        while(1)
        {
            ;
        }
    
        EPWM_etIntrDisable(gEpwmBaseAddr_Pwm0);
        EPWM_etIntrClear(gEpwmBaseAddr_Pwm0);
        EPWM_etIntrDisable(gEpwmBaseAddr_Pwm1);
        EPWM_etIntrClear(gEpwmBaseAddr_Pwm1);
        HwiP_destruct(&gEpwmHwiObject_Pwm0);
        HwiP_destruct(&gEpwmHwiObject_Pwm1);
        SemaphoreP_destruct(&gEpwmSyncSemObject);
    
        DebugP_log("EPWM Duty Cycle Test Passed!!\r\n");
        DebugP_log("All tests have passed!!\r\n");
    
        Board_driversClose();
        Drivers_close();
    }
    
    static void App_epwmConfig(void)
    {
        /* ePWMA=triggerA */
        /* TBSTS phsen=0 */
        *(volatile uint32_t *)gEpwmBaseAddr_Pwm0      = 0x00018110;
        /* TBPRD */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm0+8)  = 0x001F0000;
        /* CMPA */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm0+16) = 0x00070000;
        /* AQCTLA + CMPB */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm0+20) = 0x0121000F;
        
        /* ePWMB=triggerB */
        *(volatile uint32_t *)gEpwmBaseAddr_Pwm1      = 0x00018104;
        /* TBPRD */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm1+8)  = 0x001F0000;
        /* CMPA */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm1+16) = 0x00030000;
        /* AQCTLA + CMPB */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm1+20) = 0x0121000B;
    
        /* ePWMC=12.5MHz output */
        *(volatile uint32_t *)gEpwmBaseAddr_Pwm2      = 0x00018000;
        /* TBPRD */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm2+8)  = 0x000f0000;
        /* CMPA */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm2+16) = 0x00070000;
        /* AQCTLA + CMPB */
        *(volatile uint32_t *)(gEpwmBaseAddr_Pwm2+20) = 0x02240007;
    }

    此致、

    ITO

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

    尊敬的 Ito:

    我完成了寄存器和代码的审核。 尽管寄存器值对于该用例是正确的、但我有四项代码修改建议、这可能有助于解决该问题。

    这些建议基于 EPWM_DUTY_CYCLE、这是 TRM 中以相同频率控制多个降压转换器部分的类似用例、也基于 ePWM API (链接到末尾的 API)。

    • 将 AQCTLA CAD 和 CBD 位设置为 b'1以进行清除(也称为 EPWM_AW_ACTION_LOW)
      • 这是要检查的主要差异
    • 使用 EPWM_tbSyncEnable 来确保为 TBPHS 寄存器设置一个值
      • 屏幕截图和代码未显示两个 ePWM 的 TBPHS 寄存器
    • 使用更多的 API 和 EPWM_DUTY_CYCLE 代码
      • 示例:使用 EPWM_tbSetSyncOutMode (gEpwmBase Addr_Pwm 1、EPWM_TB_SYNC_OUT_EVT_SYNCIN)和 EPWM_tbSetSyncOutMode (gEpwmBase Addr_Pwm 0、EPWM_TB_SYNC_OUT_EVT_CNT_EQ_ZERO);
    • 还可以尝试修改用例要求以利用 SWFSYNC 位强制同步脉冲

    链接: https://dev.ti.com/tirex/content/mcu_plus_sdk_am273x_09_02_00_52/docs/api_guide_am273x/group__DRV__EPWM__MODULE.html#gaa19cd037728952934ce0e5b08ab55c4d

    谢谢、

    哈雷

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

    嗨、Haley、

    感谢您的答复。

    我会检查你给我的信息。

    [问题]
    即使 TBPHS 更改为"1"、当 ePWMA 的 TBCTR 设置为0时、ePWMB 的 TBCTR 变为"1"这种现象是否正确?

    此致、

    ITO

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

    尊敬的 Ito:

    如果您所引用的 TBPHS 是针对 ePWMB、则是。

    原因如下:

    •  对于您的用例、当 TBCTR 为0时、ePWMA 应发送同步输出信号(引用如下)。 然后、该同步输出进入 ePWMB 的 EPWMxSYNCI 时同步输出
  • "EPWMxSYNCI:同步输入脉冲"的时基计数器同步 TRM 部分说明
    • 当输入同步脉冲为时、相位寄存器的值被加载到计数器寄存器中
      检测到(TBPHS→TBCTR)。 该操作发生在下一个有效的时基时钟(TBCLK)边沿上。

总体而言、TBCTR 变为"1"、因为 TBPHS 是"1"。 请注意、我假设时钟边沿有效、并忽略此答案中 EPWMB_SYNCI = 0的屏幕截图。 让我知道,如果我需要考虑所有以前的帖子或以前的部分帖子未来的任何问题。

谢谢、

哈雷