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.

[参考译文] TMS320F28377D:相移功能和 ePWM 模块之间的同步

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/672311/tms320f28377d-phase-shift-capability-and-sync-between-epwm-modules

器件型号:TMS320F28377D

我正在尝试在设计中实现相同的 ePWM 通道之间的120度相移、如 sprug04a 图59和60以及示例13代码 snip 所示。  我的设计唯一的区别是我使用的是驱动程序库例程、而不是直接寄存器访问方法、并且我尝试在 epwm1、epwm4、 epwm7、同时使 ePWM 2和3与 epwm1、ePWM 5和6的相位与 epwm4相同、而 ePWM 8 和9 的相位与 epwm7相同。  我接近成功、但不完全正确、因为我为 epwm7a/7b 获取的波形似乎与 我想要的波形相反、因此7b (7a 的补码)看起来像我希望7a 看起来的波形。  我想知道、作为一个相对较新的 ePWM 外设用户、我想做的是不是可能的、我刚刚遇到了一些寄存器设置错误、还是有一些类似简单但不明显的事情。

谢谢、

Susan

//----------------------------------
//文件信息
//--------------------
//文件名:ePWM_CONFIG.c
//说明:设置 DSP ePWM 的源代码
//设计说明:处理开发板与 proto 硬件//
------
//修订历史记录:
//日期 按变更描述
//--- ---- ----------------------------------------
// 20180314原始斜接
器//--- ---- ----------------------------------------

#include "ePWM.h"
#include "peripherals.h"

#define EPWM_TIMER_TBPRD 1875 //这将是向上向下计数模式下的3750计数或150MHz/2下的20kHz
#define EPWM_MIN_CMPA 1250 //= 33%

#define 门限死区1USEC 75

//
initEPWM -配置 ePWM_MIN_PHASE_INT_UPM_32

位





;t INT_UPM_PHASE_INT_UPM_U = 32位/INT_UPM_PHASE = INT_INT_INT_INT_INT_INT_UPM_U = INT_UPM_U = INT_UPM_U = INT_UPM_U 32位/INT_UPM_U = INT_UPM_U
ePWM_SyncCountMode SYNC_COUNT_MODE = ePWM_COUNT_MODE_UP_ACT_SYNC;
bool PHASE_ENABLE = false;

switch (ePWM_group)
{
案例 ePWM_Group_One:
PHASE_A_BASE = EPWM1_BASE;
PHASE_b_BASE = EPWM2_BASE;
PHASE_c_base = EPWM3_base;
PHASE_SHIFT_COUNT = 0;
PHASE_ENABLE = false;
SYNC_COUNT_MODE = EPWM_COUNT_MODE_UP_ACT_SYNC;
中断;

案例 ePWM_Group_Two:
PHASE_A_base = EPWM4_base;
PHASE_b_BASE = EPWM5_base;
PHASE_c_base = EPWM6_BASE;
PHASE_SHIFT_COUNT = 1250;
PHASE_ENABLE = true;
SYNC_COUNT_MODE = EPWM_COUNT_MODE_DOWN_ACT_SYNC;
中断;

案例 ePWM_Group_Three:
PHASE_A_BASE = EPWM7_BASE;
PHASE_b_BASE = EPWM8_BASE;
PHASE_c_base = EPWM9_BASE;
PHASE_SHIFT_COUNT = 1250;
PHASE_ENABLE = true;
SYNC_COUNT_MODE = EPWM_COUNT_MODE_UP_ACT_SYNC;
中断;

默认值:
断言(false);
break;
}

ePWM_setupCommon (PHASE_A_base、PHASE_ENABLE、PHASE_SHIFT_COUNT、SYNC_COUNT_MODE);
ePWM_setupCommon (PHASE_b_BASE、TRUE、0、SYNC_COUNT_MODE);
ePWM_setupCommon (PHASE_c_base、 true、0、SYNC_COUNT_MODE);

if (EPWM_GROUP = EPWM_GROK_ONE)
{
//选择 INT on 时基计数器零事件,
//启用 INT,在发生第一个事件时生成 INT
ePWM_setInterruptSource (PHASE_A_base、ePWM_INT_TBCTR_ZERO);
ePWM_enableInterrupt (PHASE_A_base);
ePWM_setInterruptEventCount (PHASE_A_base、1U);
}


void ePWM_setupCommon (uint32_t base、bool PHASE_ENABLE、uint16_t PHASE_SHIFT、ePWM_SyncCountMode COUNT_MODE)
{

//设置 TBCLK
ePWM_setTimeBasePeriod (base、ePWM_setTimer
);ePWM_ePwm_setTimer (base_setEPWM
);ePwM_ePwm_deTimer (base_setEPWM (base_setEPWM) PHASE_SHIFT);//PHASE_SHIFT);
ePWM_setTimeBaseCounter (base、0U);

//设置比较值
ePWM_setCounterCompareValue (base、ePWM_COUNTER_COMPARE_A、ePWM_MIN_CMPA);

//设置计数器模式
ePWM_setBaseTimeMode (base、ePWM_COUNTER_MODE_TRUE_if
)=
真(UD_UPPHED);//设置计数器模式(if)=真(UPP_ENABLE (真)
ePWM_enablePhaseShiftLoad (base);
ePWM_setSyncOutPulseMode (base、ePWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
}
否则
{
ePWM_DisablePhaseShiftLoad (base);//已禁用
ePWM_setSyncOutPulseMode (base、ePWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
}
ePWM_setClockPrescaler (base、ePWM_CLOCK_divider 1、ePWM_HSCLOCK_divider 1);

//设置重影
EPWM_setCounterCompareShadowImage LoadMode (base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);

//设置操作
EPWM_setQualifierActionifierAction (base、ePWM_AQ_OUTPUT A、ePWM_OUTPUT HIGH、ePWM_PA_OUTPWM_OUTPUT Quali_ZERO);//设置操作
(base、ePWM_Qualifier_time_Action_Quali_Quali_Quali_Quali_Action_Action_On_Action_ ePWM_AQ_output_a、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_down_cmPA);

ePWM_setDeadBandOutputSwapMode (base、ePWM_DB_output_a、 false);// A S6=0
ePWM_setDeadBandOutputSwapMode 上无交换(base、ePWM_DB_OUTPUT B、false);// B 上无交换 S7=0

ePWM_setDeadBandMode (base、ePWM_DB_RED、true);//上升沿延迟 S1 = 1 ePWM_setD_delimity


、ePWM_DB_delayMode (bandeD_sbandeD_sbed);eDbandeD_delimity、ePWM_delayDB_delaybandeD_deD_sbed
//下降沿延迟反相 S3=1

ePWM_setRisingEdgeDeadBandDelayInput (base、ePWM_DB_INPUT_EPWMA);//将 ePWMA 输入到红色 S4=0
ePWM_setFallingEdgeCountedDelayInput (base、ePWM_DB_INPUT_EPWMA);//输入 ePWM_Disloading_randrastock/ePWM



(undePWM);//将以 eLoad_delePWM

作为冗余模式(undePWM_ePWM_eLoadrandePWM_dePWM_deLoad);//以 eLoad/eLoad/ePWM_dePwm_reload (base);以 ePWM_ded/ePWM_dePWM_dePWM_dePWM_dePwm_randePWM_dePwm_randePwm_randePwm_randePwm_randePwm_randePwm (base);



ePWM_setFallingEdgeDelayCountShadowImage LoadMode (base、ePWM_FED_LOAD_FREEZE);

ePWM_DisableFallingEdgeDelayCountShadowImage LoadMode (base);

ePWM_setDeadBandCounterClock (base、ePWM_DB_counter_clock_full_cycle);

ePWM_setRisingEdgeDelayCount (base、(uint16_t) dutband_1USEC);

ePWM_setFallingEdgeDelayCount (base、(uint16_t)死区_1_USEC);
}

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

    好的、在一天之内、我检查了示波器探头、发现如果您将探头放在正确的引脚上、ePWM 120和240相移按组实际可行!  我还添加了一些代码、用于显式地为每个组启用 epwmxsyncin (使用 SYSCTL_setSyncInputConfig)、但如果选择1或4作为源代码、似乎无关紧要、这可能是因为我处于"直通"模式。  但我还记得、我看到过不应使用超过4个的链条、因此如果不建议使用、请告知。  谢谢!

    //
    // initEPWM -配置 ePWM
    //
    void ePWM_init (ePWM_group_enum ePWM_group)
    {
    uint32_t PHASE_A_base;
    uint32_t PHASE_b_BASE;
    uint32_t PHASE_c_base;
    
    uint16_t PHASE_SHIFT_COUNT = 0U;
    ePWM_COUNT_UP
    
    
    =
    {tPWM_SYNC_COUNT = ePWM_UTPM_UP;}ePWM_COUNT_COUNT_COUNT_COUNT = tSYNC_TRY_SYNC_COUNT = 0U
    案例 ePWM_Group_One:
    PHASE_A_BASE = EPWM1_BASE;
    PHASE_b_BASE = EPWM2_BASE;
    PHASE_c_base = EPWM3_base;
    PHASE_SHIFT_COUNT = 0;
    PHASE_ENABLE = false;
    SYNC_COUNT_MODE = EPWM_COUNT_MODE_UP_ACT_SYNC;
    中断;
    
    案例 ePWM_Group_Two:
    PHASE_A_base = EPWM4_base;
    PHASE_b_BASE = EPWM5_base;
    PHASE_c_base = EPWM6_BASE;
    PHASE_SHIFT_COUNT = 1250;
    PHASE_ENABLE = true;
    SYNC_COUNT_MODE = ePWM_COUNT_MODE_UP_LOW_ACT_SYNC;//ePWM_COUNT_MODE_DOWN_ACT_SYNC;
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM4、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    中断;
    
    案例 ePWM_Group_Three:
    PHASE_A_BASE = EPWM7_BASE;
    PHASE_b_BASE = EPWM8_BASE;
    PHASE_c_base = EPWM9_BASE;
    PHASE_SHIFT_COUNT = 1250;
    PHASE_ENABLE = true;
    SYNC_COUNT_MODE = EPWM_COUNT_MODE_DOWN_LOW_ACT_SYNC;// EPWM_COUNT_MODE_UP_ACT_SYNC;
    SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_EPWM7、SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
    中断;
    
    默认值:
    断言(false);
    break;
    }
    
    ePWM_setupCommon (PHASE_A_base、PHASE_ENABLE、PHASE_SHIFT_COUNT、SYNC_COUNT_MODE);
    ePWM_setupCommon (PHASE_b_BASE、TRUE、 PHASE_SHIFT_COUNT、SYNC_COUNT_MODE);
    EPWM_setupCommon (PHASE_c_base、true、 PHASE_SHIFT_COUNT、SYNC_COUNT_MODE);
    
    IF (ePWM_GROUP = ePWM_GROK_ONE)
    {
    //选择 INT on 时基计数器零事件,
    //启用 INT,在发生第一个事件时生成 INT
    ePWM_setInterruptSource (PHASE_A_base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (PHASE_A_base);
    ePWM_setInterruptEventCount (PHASE_A_base、1U);
    }
    

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

    我们很高兴问题得到解决! 请告诉我们、我们是否可以为您提供任何其他帮助。 感谢您选择 TI。

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

     谢谢-我想我对"直通"模式还是有点好奇、而不是使用 SYNCSOCREGS 寄存器(spruhm8g 中为14.14.4)在 epwmxsyncdout 中进行多路复用、作为下一组的 syncdselect。  如果我将 EPWM4SYNCOUT 替换为 EPWM1SYNCOUT 作为 EPWM7的源同步输入、代码的行为不会改变、但似乎应该在各组之间进行相位调整?  另外、关于不超过4个模块的陈述让我感到紧张、因为我将其中的9个模块连接在一起。  我是否误解了硬件手册中的警告?  

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

    您好 Susan、

    这只是说您应该通过最直接的路径路由同步信号。 例如、您不希望使用 EPWM1 -> EPWM4->EPWM7 -> EPWM8->EPWM9将 EPWM9同步到 EPWM1。 在大多数用例中、同步配置不会违反四模块限制。

    此致、

    Kris