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-F28379D:带 BOOSTXL-DRV8301.

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1220583/launchxl-f28379d-dual-axis-servo-drive-with-boostxl-drv8301

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:BOOSTXL-DRV8301、DRV8301、 C2000WARE、SFRA、 TIDM-02007、BOOSTXL-3PHGANINVcontrolSUITE

大家好

我是指 E2E 论坛上的这篇文章: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/997461/tms320f28379d-stuck-at-level-1-with-fcl-example

我还想修改示例、使其能够使用 BOOSTXL-DRV8301运行。

按照上述帖子中的步骤、我进行了以下更改:

  • 由于 DRV8301栅极为高电平有效、因此我反转了所有栅极禁用和启用
  • 将 nFault 引脚更改为 GPIO19
  • 已将 OT 更改为 GPIO18 (OCTW)
  • 将 GPIO18设置为  INPUTXBAR1
  • 已更改电压 ADC 的换算系数(除以3)
  • 将 GPIO18从输出更改为输入
  • 在运行偏移校准之前激活门

偏移校准运行良好(偏移约为0.5pu)、并且 Vbus 电压得到正确测量、但跳闸区域一直指示过流。 当我重置跳闸标志时、跳闸标志会立即重新激活。

我在帖子的步骤1-3中进行了更改、但我不明白在代码中到底需要更改什么。

请在这里帮帮我。

此致

Pavel

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

    如果您要对 双轴实现 FCL、您可以参考电机控制 SDK 中的示例、这是更新的、适合用作起始项目。

    C:\ti\c2000\C2000Ware_MotorControl_SDK_ \solutions\boostxl_3phganinv\f2837x\ccs\sensored_foc

    在单个 MCU 上使用快速电流环路(FCL)和 SFRA 的双轴电机驱动器参考设计

    TIDM-02007:https://www.ti.com/tool/TIDM-02007

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

    大家好

    我已经将 您提到的示例用作基础工程、并设法使用 BOOSTXL-3PhGaNInv 运行示例。

    但由于我的最终定制硬件使用 DRV8301芯片、因此我想调整此项目、使其能够与 BOOSTXL-DRV8301一起运行。 如前所述、跳闸区域存在一些问题。
    您能帮我 解决 这个问题吗?  

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

    实验示例是什么? 内容呢? 中提供了些什么? 目前、如果客户要开始新设计、我们建议他们在电机控制 SDK 中使用示例。

    您是否根据使用的硬件套件更改了器件配置代码? 并使用构建级别1来验证 ADC 和 PWM 配置? 然后在构建级别2中以开环方式运行电机。

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

    我使用了"C2000Ware_MotorControl_SDK_4_02_00_00"中的"双轴伺服驱动器"示例。

    如我在初始博文中所述、我认为我已经对运行 BOOSTXL-DRV8301进行了所有必要的更改。

    自从我发布初始帖子以来、我已经更接近过流跳闸的原因。
    在函数"void HAL_setupMotorFaultProtection (HAL_MTR_Handle handle、
    const float32_t currentLimit)"(dual_axi_servo_drive_hal.c"文件的说明、故障保护已设置。 将跳闸4设置为当 ADC 的值低于或高于限值时跳闸。 除了电流之外、将行程4设置为触发原始工程中的 OT GPIO24。 我已经为 GPIO18 (BOOSTXL-DRV8301上的 OCTW)更改了此选项。 如果我删除以下行、则跳闸会停止跳闸。

    //inputxbar1 trip
    //XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX01_INPUTXBAR1);

    我认为此引脚配置有误。 根据 BOOSTXL-3PhGaNInv 和 BOOSTXL-DRV8301的文档、两个引脚都应为低电平有效。 我还检查了 GPIO 的配置、两者都设置为输入引脚。 我在这里遗漏了什么?

    感谢您的帮助!

    此致
    Pavel

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

    您是否配置 SPI 以配置 DRV8301? 并设置正确的 GPIO 以启用 DRV8301?  

    如上所述、您可以尝试运行构建级别1中的代码以首先验证配置。 EPWMXBAR 用于 DRV8301的 nFAULT 引脚。 您不需要更改代码、只需要更改链接到  INPUTXBAR 的 GPIO。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否配置 SPI 以配置 DRV8301? 并设置正确的 GPIO 以启用 DRV8301?  [/报价]

    否、我不使用 SPI 配置 DRV8301。 我在库存配置中使用它。

    如上所述,您可以尝试在构建级别1中运行代码以首先验证配置

    我将使用上述示例并在构建级别1中运行它。

    EPWMXBAR 用于 DRV8301的 nFAULT 引脚。

    谢谢、我已从 OCTW 更改为 nFAULT 引脚(GPIO18 -> GPIO19)。

    您无需更改代码,只需更改链接到  INPUTXBAR 的 GPIO 即可。

    遗憾的是、在构建级别1中、跳闸仍然可以在未连接任何电机的情况下激活。

    这是我的函数:

    void HAL_setupMotorFaultProtection(HAL_MTR_Handle handle,
                                       const float32_t currentLimit)
    {
        HAL_MTR_Obj *obj = (HAL_MTR_Obj *)handle;
    
        uint16_t  cnt;
    
        EPWM_DigitalCompareTripInput tripInSet = EPWM_DC_TRIP_TRIPIN4;
    
        // High and Low Compare event trips
        uint16_t curHi = 0;
        uint16_t curLo = 0;
    
        if(handle == &halMtr[MTR_1])
        {
            tripInSet = EPWM_DC_TRIP_TRIPIN4;
    
            curHi = 2048 + M1_CURRENT_SCALE(currentLimit);
            curLo = 2048 - M1_CURRENT_SCALE(currentLimit);
    
            //Select GPIO19 as INPUTXBAR1
            //XBAR_setInputPin(M1_XBAR_INPUT_NUM, M1_XBAR_INPUT_GPIO);
            XBAR_setInputPin(M1_XBAR_INPUT_NUM, M1_nFAULT_GPIO);
    
            // Configure TRIP 4 to OR the High and Low trips from both
            // comparator 1 & 3, clear everything first
            EALLOW;
            HWREG(XBAR_EPWM_CFG_REG_BASE + XBAR_O_TRIP4MUX0TO15CFG) = 0;
            HWREG(XBAR_EPWM_CFG_REG_BASE + XBAR_O_TRIP4MUX16TO31CFG) = 0;
            EDIS;
    
            // Enable Muxes for ored input of CMPSS1H and 1L, mux for Mux0x
            //cmpss1 - tripH or tripL
            XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX00_CMPSS1_CTRIPH_OR_L);
    
            //cmpss3 - tripH or tripL
            XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L);
    
            //cmpss6 - tripH or tripL
            XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX10_CMPSS6_CTRIPH_OR_L);
    
            //inputxbar1 trip
            XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX01_INPUTXBAR1);
    
            // Disable all the muxes first
            XBAR_disableEPWMMux(XBAR_TRIP4, 0xFFFF);
    
            // Enable Mux 0  OR Mux 4 to generate TRIP4
            XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX00 | XBAR_MUX04 | XBAR_MUX10 |
                                           XBAR_MUX01);
        }
        else if(handle == &halMtr[MTR_2])
        {
            // some code for motor 2
        }
    
    
        //
        // Configure TRIP for motor inverter phases
        //
        for(cnt = 0; cnt < 3; cnt++)
        {
            // comparator references
            // Set DAC-H to allowed MAX +ve current
            CMPSS_setDACValueHigh(obj->cmpssHandle[cnt], curHi);
    
            // Set DAC-L to allowed MAX -ve current
            CMPSS_setDACValueLow(obj->cmpssHandle[cnt], curLo);
    
            //Trip 4 is the input to the DCAHCOMPSEL
            EPWM_selectDigitalCompareTripInput(obj->pwmHandle[cnt],
                                               tripInSet,
                                               EPWM_DC_TYPE_DCAH);
    
            EPWM_setTripZoneDigitalCompareEventCondition(obj->pwmHandle[cnt],
                                                         EPWM_TZ_DC_OUTPUT_A1,
                                                         EPWM_TZ_EVENT_DCXH_HIGH);
    
            EPWM_setDigitalCompareEventSource(obj->pwmHandle[cnt], EPWM_DC_MODULE_A,
                                              EPWM_DC_EVENT_1,
                                              EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);
    
            EPWM_setDigitalCompareEventSyncMode(obj->pwmHandle[cnt],
                                                EPWM_DC_MODULE_A,
                                                EPWM_DC_EVENT_1,
                                                EPWM_DC_EVENT_INPUT_NOT_SYNCED);
    
            EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_DCAEVT1);
    
            // Emulator Stop
            EPWM_enableTripZoneSignals(obj->pwmHandle[cnt], EPWM_TZ_SIGNAL_CBC6);
    
            // What do we want the OST/CBC events to do?
            // TZA events can force EPWMxA
            // TZB events can force EPWMxB
    
            // EPWMxA will go low
            // EPWMxB will go low
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_TZA,
                                   EPWM_TZ_ACTION_LOW);
    
            EPWM_setTripZoneAction(obj->pwmHandle[cnt],
                                   EPWM_TZ_ACTION_EVENT_TZB,
                                   EPWM_TZ_ACTION_LOW);
        }
    
        // clear EPWM trip flags
        DEVICE_DELAY_US(1L);
    
        for(cnt = 0; cnt < 3; cnt++)
        {
            // clear any spurious  OST & DCAEVT1 flags
            EPWM_clearTripZoneFlag(obj->pwmHandle[cnt], (EPWM_TZ_FLAG_OST |
                                                         EPWM_TZ_FLAG_DCAEVT1 |
                                                         EPWM_TZ_FLAG_CBC ));
    
            // clear any spurious  HLATCH - (not in TRIP gen path)
            CMPSS_clearFilterLatchHigh(obj->cmpssHandle[cnt]);
    
            // clear any spurious  LLATCH - (not in TRIP gen path)
            CMPSS_clearFilterLatchLow(obj->cmpssHandle[cnt]);
        }
    
        DEVICE_DELAY_US(1L);
    
        return;
    }

    我还缺少什么吗?

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否还有我遗漏的东西?

    您必须查看 DRV8301的数据表、并在此示例项目中添加 DRV8031的驱动器、以使用 SPI 配置 DRV8301的控制寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您必须查看 DRV8301的数据表,并在此示例项目中添加 DRV8031的驱动程序以使用 SPI 配置 DRV8301的控制寄存器。

    为什么需要配置 DRV8301? 我无法在所有控制寄存器的默认配置中使用它们吗?

    是否有演示项目配置 DRV8301、或者是否有适用于 DRV8301的驱动程序文件?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么需要配置 DRV8301? 我无法使用默认配置中的所有控制寄存器?

    最好通过配置控制寄存器来设置 PWM 模式和电流限制。

    是否有配置 DRV8301的演示项目,或者是否有包含 DRV8301驱动程序的文件?

    没有适用于此 双轴项目的 DRV8301示例代码、但您可以在电机控制 SDK 中找到 DRV8320RS 的驱动程序文件。 您可以参考 InstaSPIN 项目以将驱动程序文件添加到双轴项目中。

    C:\ti\c2000\C2000Ware_MotorControl_SDK_ \solutions\boostxl_drv8320rs\f28004x\ccs

    建议您在示例项目中使用支持套件 boostxl_3phganinv、这有助于开始设计。