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.

[参考译文] TMS320F280025C:输入 XBAR 跳闸 GPIO 配置

Guru**** 2413340 points
Other Parts Discussed in Thread: C2000WARE, LAUNCHXL-F280025C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128887/tms320f280025c-input-xbar-trip-gpio-configuration

器件型号:TMS320F280025C
主题中讨论的其他器件:C2000WARELAUNCHXL-F280025C

您好!

我使用的是 Motorcontrol SDK 示例通用电机控制实验室、配置了 nFault GPIO34来触发 ePWM 模块并关闭控制器。

我现在想添加另一个 GPIO 跳闸输入、但无法使其正常工作。

我所做的工作:

在 hal.h 中-将 GPIO 25配置为额外的 TRIP 引脚:

//! \brief Defines the gpio for the nFAULT of Power Module
#define MTR1_PM_nFAULT_GPIO     34

//! \brief Defines the gpio for the nFAULT of Power Module
#define MTR1_PM_nFAULT_2_GPIO   25

...

//------------------------------------------------------------------------------
// XBAR-EPWM
#define MTR1_XBAR_TRIP_ADDRL    XBAR_O_TRIP7MUX0TO15CFG
#define MTR1_XBAR_TRIP_ADDRH    XBAR_O_TRIP7MUX16TO31CFG

#define MTR1_IDC_XBAR_EPWM_MUX  XBAR_EPWM_MUX05_CMPSS3_CTRIPL   // CMPSS3-LP
#define MTR1_IDC_XBAR_MUX       XBAR_MUX05                      // CMPSS3-LP

#define MTR1_IU_XBAR_EPWM_MUX   XBAR_EPWM_MUX00_CMPSS1_CTRIPH       // CMPSS1-HP
#define MTR1_IV_XBAR_EPWM_MUX   XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L  // CMPSS3-HP&LP
#define MTR1_IW_XBAR_EPWM_MUX   XBAR_EPWM_MUX01_CMPSS1_CTRIPL       // CMPSS1-LP

#define MTR1_IU_XBAR_MUX        XBAR_MUX00          // CMPSS1-HP
#define MTR1_IV_XBAR_MUX        XBAR_MUX04          // CMPSS3-HP&LP
#define MTR1_IW_XBAR_MUX        XBAR_MUX01          // CMPSS1-LP

#define MTR1_XBAR_INPUT1        XBAR_INPUT1
#define MTR1_XBAR_INPUT2        XBAR_INPUT2
#define MTR1_TZ_OSHT1           EPWM_TZ_SIGNAL_OSHT1
#define MTR1_TZ_OSHT2           EPWM_TZ_SIGNAL_OSHT2

#define MTR1_XBAR_TRIP          XBAR_TRIP7
#define MTR1_DCTRIPIN           EPWM_DC_COMBINATIONAL_TRIPIN7

#define MTR1_IU_XBAR_OUT_MUX    XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH       // CMPSS1-HP
#define MTR1_IV_XBAR_OUT_MUX    XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH_OR_L  // CMPSS3-HP&LP
#define MTR1_IW_XBAR_OUT_MUX    XBAR_OUT_MUX01_CMPSS1_CTRIPOUTL       // CMPSS1-LP

在 hal.c 中-将 GPIO25引脚配置为输入(我使用外部上拉电阻):

    GPIO_setPinConfig(GPIO_25_GPIO25);
    GPIO_setDirectionMode(25, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(25, GPIO_PIN_TYPE_STD);

在 hal.c 中-设置跳闸区域:

    XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IU_XBAR_EPWM_MUX);

    // Configure TRIP7 to be CTRIP1H and CTRIP1L using the ePWM X-BAR
    XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IV_XBAR_EPWM_MUX);

    // Configure TRIP7 to be CTRIP3H and CTRIP3L using the ePWM X-BAR
    XBAR_setEPWMMuxConfig(MTR1_XBAR_TRIP, MTR1_IW_XBAR_EPWM_MUX);

    // Disable all the mux first
    XBAR_disableEPWMMux(MTR1_XBAR_TRIP, 0xFFFF);

    // Enable Mux 0  OR Mux 4 to generate TRIP
    XBAR_enableEPWMMux(MTR1_XBAR_TRIP, MTR1_IU_XBAR_MUX |
                                       MTR1_IV_XBAR_MUX | MTR1_IW_XBAR_MUX);
#endif  // !(MOTOR1_ISBLDC || MOTOR1_DCLINKSS)

    // configure the input x bar for TZ2 to GPIO, where Over Current is connected --> //ToDo: Trigger another GPIO error
    XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT1, MTR1_PM_nFAULT_GPIO);
    XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT1);

    XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT2, MTR1_PM_nFAULT_2_GPIO);
    XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT2);

    // Configure Trip Mechanism for the Motor control software
    // -Cycle by cycle trip on CPU halt
    // -One shot fault trip zone
    // These trips need to be repeated for EPWM1 ,2 & 3
    for(cnt=0; cnt<3; cnt++)
    {
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT1);
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT2);


        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt],
                                   EPWM_TZ_SIGNAL_CBC6);

        //enable DC TRIP combinational input
        EPWM_enableDigitalCompareTripCombinationInput(obj->pwmHandle[cnt],
                                              MTR1_DCTRIPIN, EPWM_DC_TYPE_DCAH);

        EPWM_enableDigitalCompareTripCombinationInput(obj->pwmHandle[cnt],
                                              MTR1_DCTRIPIN, EPWM_DC_TYPE_DCBH);

        // Trigger event when DCAH is High
        EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
                                                     EPWM_TZ_DC_OUTPUT_A1,
                                                     EPWM_TZ_EVENT_DCXH_HIGH);

        // Trigger event when DCBH is High
        EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
                                                     EPWM_TZ_DC_OUTPUT_B1,
                                                     EPWM_TZ_EVENT_DCXL_HIGH);

        // Configure the DCA path to be un-filtered and asynchronous
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_A,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);

        // Configure the DCB path to be un-filtered and asynchronous
        EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt],
                                          EPWM_DC_MODULE_B,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_SOURCE_FILT_SIGNAL);

        EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
                                            EPWM_DC_MODULE_A,
                                            EPWM_DC_EVENT_1,
                                            EPWM_DC_EVENT_INPUT_NOT_SYNCED);

        EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
                                            EPWM_DC_MODULE_B,
                                            EPWM_DC_EVENT_1,
                                            EPWM_DC_EVENT_INPUT_NOT_SYNCED);

        // Enable DCA as OST
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_DCAEVT1);

        // Enable DCB as OST
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_DCBEVT1);

        // What do we want the OST/CBC events to do?
        // TZA events can force EPWMxA
        // TZB events can force EPWMxB
        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_TZA,
                               EPWM_TZ_ACTION_LOW); //ToDo: Possible to trip to high, so that the motor is coasting

        EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                               EPWM_TZ_ACTION_EVENT_TZB,
                               EPWM_TZ_ACTION_LOW);
    }

因此、我看不到我缺少的内容。 它看起来与 GPIO34引脚完全一样、应该触发 TZ2。 比较器是否缺少任何东西?

编辑: 我添加到 hal.c 的内容:

...

XBAR_setInputPin(INPUTXBAR_BASE, MTR1_XBAR_INPUT2, MTR1_PM_nFAULT_2_GPIO);
XBAR_lockInput(INPUTXBAR_BASE, MTR1_XBAR_INPUT2);

for(cnt=0; cnt<3; cnt++)
{
        ...
        EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], MTR1_TZ_OSHT2);
        ...
}

编辑2:我还从以下位置尝试了示例 ePWM_ex1_trip_zone: C:\ti\c2000Ware_4_00_00_00\driverlib\f28002x\examples\ePWM

事情是、当我使用如下 GPIO13时、我可以跳闸:

    uint32_t gp = 13;
    GPIO_setPinConfig(GPIO_13_GPIO13);
    GPIO_setDirectionMode(gp, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(gp, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(gp, GPIO_QUAL_ASYNC);
    XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT2, gp);

但是、当我使用 GPIO14时、它不起作用。 此外、当我使用 GPIO14的上拉配置时、它永远不会将其上拉。

那么、并非所有 GPIO 都有上拉电阻并用作 XBAR 的输入吗?

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

    Luke、您能否查看为 ePWM 添加的 XBAR 跳闸配置、并查看缺少哪些内容?

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

    Sebastian、您能否仅显示您添加到 hal.c 中的代码行? 您的新旅程中已有哪些新内容?

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

    我使用 hal.c 代码编辑了主要问题。

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

    我发现、例如、当我使用 GPIO35时、它可以工作、但仅当我使用外部上拉电阻器将其上拉时才有效。 在通用电机控制示例中、内部上拉不起作用、当我正确初始化它时也是如此。 在 ePWM 示例中、它工作正常。

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

    内部上拉电阻设计较弱。 它们无法提供大量电流。  

    您是否使用内部上拉电阻器触发跳闸?

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

    在通用电机控制实验中、GPIO35上的上拉电阻不起作用(输入始终保持低电平)、在上面的 ePWM 示例中、它起作用。 我真的不明白为什么 XBAR 与 GPIO 如此依赖(例如、为什么 GPIO14不会触发)、我在数据表中找不到任何关于这一点的信息。

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

    您好、Sebastian、

    我假设您使用的是该器件的 LaunchPad。 在 LaunchPad 上、GPIO14连接到许多其他源、因此在这种情况下内部上拉电阻太弱。 XBAR 与 GPIO 无关、您不会在定制 PCB 上遇到此问题。

    请参阅 C2000Ware 安装中的此文件、查看 LaunchPad 上的所有 GPIO 连接:

    /boards/LaunchPad/LAUNCHXL-F280025C/revA/MCU089A (001)_Sch.PDF

    关于 GPIO25不 触发 TZ2、请确保 GPIO25的设置不会在任何其他地方发生更改、因为这是一个使用许多不同资源的非常大的项目。 否则、您添加的代码看起来是正确的。