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.

[参考译文] LAUNCHXL-F28P65X:两个 CPU 项目中未获取 EPWM 信号

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1352543/launchxl-f28p65x-epwm-signals-not-taken-out-in-two-cpu-project

器件型号:LAUNCHXL-F28P65X
主题中讨论的其他器件: SysConfigC2000WARE

您好!  

在使用两个 CPU 的 LAUNCHXL-F28P65X 板上、我面临一个测试项目问题、其中我设置了一个 EPWM 通道(在单个 CPU 项目上运行)、但在 EPWM 通道5 (GPIO 8和9)的引脚上没有输出。

我使用 SysConfig 工具设置项目。 我的一般配置为:

  • CCS 版本:12.6
  • 编译器版本:22.6.1
  • SysConfig 版本:1.20.0
  • 评估板:LAUNCHXL F28P65X

ePWM 功能完全独立于我添加到两个 CPU 的其他功能。 ePWM 的定义在 board.c/.h 中生成以下源代码。 默认情况下、ePWM5被 CPU1保留。 在 device.c 中启用 ePWM 外设。

有任何想法为什么我在 GPIO 8和9上没有为我的 ePWM5获得输出信号?

board.h:

//
// EPWM5 -> myEPWM0引脚多路复用
//
//
// EPWM5_A - GPIO 设置
//
#define GPIO_PIN_EPWM5_A 8
#define myEPWM0_EPWMA_GPIO 8
#define myEPWM0_EPWMA_PIN_CONFIG GPIO_8_EPWM5_A
//
// EPWM5_B - GPIO 设置
//
#define GPIO_PIN_EPWM5_B 9
#define myEPWM0_EPWMB_GPIO 9
#define myEPWM0_EPWMB_PIN_CONFIG GPIO_9_EPWM5_B

//*****
//
// ePWM 配置
//
//*****
#define myEPWM0_BASE EPWM5_BASE
#define myEPWM0_TBPRD 500
#define myEPWM0_COUNTER_MODE EPWM_COUNTER_MODE_UP_DOWN
#define myEPWM0_TBPHS 250
#define myEPWM0_CMPA 275
#define myEPWM0_CMPB 200
#define myEPWM0_CMPC 0
#define myEPWM0_CMPD 0
#define myEPWM0_DBRED 0
#define myEPWM0_DBFED 0
#define myEPWM0_TZA_ACTION EPWM_TZ_ACTION_HIGH_Z
#define myEPWM0_TZB_ACTION ePWM_TZ_ACTION_HIGH_Z
#define myEPWM0_INTERRUPT_SOURCE EPWM_INT_TBCTR_DISABLED

board.c:

//*****
//
// ePWM 配置
//
//*****
void ePWM_init (){
ePWM_setClockPrescaler (myEPWM0_BASE、ePWM_CLOCK_DIVIDER _1、ePWM_HSCLOCK_DIVIDER_4);
EPWM_setTimeBasePeriod (myEPWM0_BASE、500);
EPWM_setTimeBaseCounter (myEPWM0_BASE、0);
EPWM_setTimeBaseCounterMode (myEPWM0_BASE、EPWM_COUNTER_MODE_UP_DOWN);
EPWM_enablePhaseShiftLoad (myEPWM0_BASE);
EPWM_setPhaseShift (myEPWM0_BASE、250);
EPWM_setSyncInPulseSource (myEPWM0_BASE、EPWM_SYNC_IN_PULSE_SRC_DISABLE);
EPWM_setCounterCompareValue (myEPWM0_BASE、EPWM_COUNTER_COMPARE_A、275);
EPWM_setCounterCompareShadowLoadMode (myEPWM0_BASE、EPWM_COUNTER_COMPARE_A、EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue (myEPWM0_BASE、EPWM_COUNTER_COMPARE_B、200);
EPWM_setCounterCompareShadowLoadMode (myEPWM0_BASE、EPWM_COUNTER_COMPARE_B、EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierT2TriggerSource (myEPWM0_BASE、EPWM_AQ_TRIGG_EVENT_TRIG_DCA_2);
EPWM_enableGlobalLoadRegisters (myEPWM0_BASE、EPWM_GL_REGISTER_AQCTLA_AQCTLA2);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_enableGlobalLoadRegisters (myEPWM0_BASE、EPWM_GL_REGISTER_AQCTLB_AQCTLB2);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_NO_CHANGE、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (myEPWM0_BASE、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
ePWM_setRisingEdgeDelayCountShadowLoadMode (myEPWM0_BASE、ePWM_RED_LOAD_ON_CNTR_ZERO);
ePWM_disableRisingEdgeDelayCountShadowLoadMode (myEPWM0_BASE);
EPWM_setFallingEdgeDelayCountShadowLoadMode (myEPWM0_BASE、EPWM_FED_LOAD_ON_CNTR_ZERO);
ePWM_disableFallingEdgeDelayCountShadowLoadMode (myEPWM0_BASE);

此致

帕特里克

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

    尊敬的 Patrik:

    我怀疑 pinMux 问题、您可以帮助我了解项目详细信息吗、它是一个"系统"项目还是两个单核项目吗? 此外、两个 CPU 中是否都使用了 ePWM 5?

    谢谢。此致、

    马德哈瓦

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

    尊敬的 Madhava:  

    感谢您的答复。

    该项目由三个 CCS 项目组成、这些项目具有一个一般多项目、每个 CPU 一个。 我从 C2000Ware 5.2.0中导入了项目(当时为 IPC 双核示例)。 ePWM 仅在 CPU1中使用、并且定义了必要的 GPIO (#8和#9)、并仅在该 CPU 中使用 ePWM 的 SysConfig 中的 PinMux 部分。  

    由于外设的默认用法是在 CPU1上使用、因此我在这里不做任何更改。 外设也已启用、针对此模式的访问控制为默认值、意思是"针对读取和写入的完全访问"。

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

    尊敬的 Patrik:

    感谢您的答复! 我尝试了使用 ipc_basic_syscfg_multiple 示例。 我已经在 CPU1中添加了 EPWM5并在 board.c 中检查了 pinmux_init ()。 以下是我的观察。

    1. pinmux 初始化始终位于 CPU1中。 即使外设、在这种情况下也会从 CPU1或 CPU2添加 ePWM。
    2. 我注意到您共享的代码没有 pinmux_init()函数。 请检查一下。

    pinmux_init ()代码包含以下行,请注意,无论外设添加到哪个内核 SysConfig ,它始终存在于 CPU1中。  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //
    // EPWM5 -> myEPWM0 Pinmux
    //
    GPIO_setPinConfig(myEPWM0_EPWMA_PIN_CONFIG);
    GPIO_setPadConfig(myEPWM0_EPWMA_GPIO, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(myEPWM0_EPWMA_GPIO, GPIO_QUAL_SYNC);
    GPIO_setPinConfig(myEPWM0_EPWMB_PIN_CONFIG);
    GPIO_setPadConfig(myEPWM0_EPWMB_GPIO, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(myEPWM0_EPWMB_GPIO, GPIO_QUAL_SYNC);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    下面是我关于您的设置的问题。 您能否同时提供这些信息?

    1. ePWM 配置是在 CPU1还是 CPU2中完成的?
    2. 是否有为相关的 ePWM 生成 pinmux_init()函数?
    3. 如果 pinmux_init()被生成,是否在添加了 ePWM 配置的内核之前运行了具有 pinmux_init()的内核?


    谢谢。此致、
    马德哈瓦

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

    尊敬的 Madhava:  

    PinMux_init()在 CPU1的 Board_init()中被调用为第一项,其中正好描述了您所提到的代码。

    关于您的其他问题:

    PWM 的配置在 CPU1中完成

    2.生成一个 PinMux_init()函数,用于配置所使用的 GPIO。

    3. PinMux_init ()函数是 Board_Init ()函数中第一个被调用的函数

    生成的 PinMux_init()函数正在工作,因为所有其他配置的 GPIO 都在正常工作。

    此致

    帕特里克

    #include "board.h"

    //*****
    //
    //板配置
    //初始化模块的其余部分。
    //如果您希望执行所有模块,请在您的应用程序中调用此函数
    //初始化。
    //如果您不想使用某些初始化,而不使用
    // Board_init 使用单个模块初始化
    //
    //*****
    void Board_init()
    {
    EALLOW;

    PinMux_init ();
    sysctl_init();
    sync_init();
    ASYSCTL_init ();
    MEMCFG_init ();
    adc_init();
    can_init();
    CPUTIME_INIT();
    ePWM_init ();
    GPIO_init ();
    IPC_SYSCFG_init ();
    interrupt_init();

    EDIS;

    //*****
    //
    // PINMUX 配置
    //
    //*****
    void PinMux_init ()
    {
    //
    //分配给 CPU1的模块的 PinMux
    //

    //
    //模拟-> myANALOGUEPinMux0引脚多路复用
    //
    //用于 A0/DACA_OUT 的模拟引脚多路复用器
    GPIO_setPinConfig (GPIO_227_GPIO227);
    // AIO ->已选择模拟模式
    GPIO_setAnalogMode (227、GPIO_analog_enabled);
    //针对 B1/DACC_OUT 的模拟引脚多路复用器
    GPIO_setPinConfig (GPIO_234_GPIO234);
    // AIO ->已选择模拟模式
    GPIO_setAnalogMode (234、GPIO_ANALOG_ENABLED);
    //
    // CANA -> myCAN0 Pinmux
    //
    GPIO_setPinConfig (myCAN0_CANRX_PIN_CONFIG);
    GPIO_setPadConfig (myCAN0_CANRX_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (myCAN0_CANRX_GPIO、GPIO_QUAL_ASYNC);

    GPIO_setPinConfig (myCAN0_CANTX_PIN_CONFIG);
    GPIO_setPadConfig (myCAN0_CANTX_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (myCAN0_CANTX_GPIO、GPIO_QUAL_ASYNC);

    //
    // EPWM5 -> myEPWM 引脚多路复用
    //
    GPIO_setPinConfig (myEPWM_EPWMA_PIN_CONFIG);
    GPIO_setPadConfig (myEPWM_EPWMA_GPIO、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (myEPWM_EPWMA_GPIO、GPIO_QUAL_SYNC);

    GPIO_setPinConfig (myEPWM_EPWMB_PIN_CONFIG);
    GPIO_setPadConfig (myEPWM_EPWMB_GPIO、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (myEPWM_EPWMB_GPIO、GPIO_QUAL_SYNC);

    // GPIO13 -> myGPIO0引脚多路复用
    GPIO_setPinConfig (GPIO_13_GPIO13);
    // GPIO25 -> myCPU1Toggle_GPIO0引脚多路复用
    GPIO_setPinConfig (GPIO_25_GPIO25);
    //
    //分配给 CPU2的模块的 PinMux
    //

    //
    // SCIB -> mySCIB 引脚多路复用
    //
    GPIO_setPinConfig (mySCIB_SCIRX_PIN_CONFIG);
    GPIO_setPadConfig (mySCIB_SCIRX_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (mySCIB_SCIRX_GPIO、GPIO_QUAL_ASYNC);

    GPIO_setPinConfig (mySCIB_SCITX_PIN_CONFIG);
    GPIO_setPadConfig (mySCIB_SCITX_GPIO、GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (mySCIB_SCITX_GPIO、GPIO_QUAL_ASYNC);