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.

[参考译文] TMS320F2800157:48V 编码器电机有时以不受控制的最大速度运行-对齐问题

Guru**** 2468610 points
Other Parts Discussed in Thread: DRV8353

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1424244/tms320f2800157-48v-encoder-motor-sometimes-running-in-uncontrolled-maximum-speed---alignment-issues

器件型号:TMS320F2800157
主题中讨论的其他器件:DRV8353

工具与软件:

团队成员、您好!

F2800157集成了 UMC 代码(最新的 SDK_2.0.0)和特定于 TI 在48V (ABI 编码器)下进行测试的栅极驱动器。 存在的相位裕度

大多数情况下、它能够成功达到提到的速度并能够在 提到的 速度下控制电机。

使用我们的定制板和48V 编码器、我们目前面临以下两个问题。

1) 1)有时电机以其运行  不受控制的最大速度 .

  电机偶尔以无法控制的 最大速度运行时。 这清楚地表明了电机对齐问题和编码器偏移产生的问题。

  为了避免偏移校准、在对齐状态下增加了 Idq 电流、如下所示。 仍然很少发生问题

  我们正面临着这种无法控制的局面  构建级别4中的速度问题 但我们是  在构建级别2和3中不会遇到此问题 .

  如何解决构建级别4中的编码器索引偏移校准的对齐问题?

2)电机额定频率和最大频率为  300   600  但在版本级别4中、使用上述48V 编码器电机既无法实现额定速度、也无法实现最大速度(600Hz)、  电流尖峰     以上述速度运行。

   但在第2级、我们能够以高达其最大频率运行电机  但只有在构建级别4中、我们才能实现高达260Hz 的频率、低于电机的额定速度。

  关于这个问题、我们已在更小的死区测试了电机、但仍然无法达到最大速度。

  我们一直在坚持  在构建2和4中具有相同的电机参数 ,但我们仍然无法达到最高速度。

  请告知如何识别问题、以便构建级别4能够以可实现的最快速度运行。

 谢谢你

 此致、

 Kirana H P

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

    在这里的通用电机代码中、我们将使用以下逻辑在运行电机之前生成50%的占空比。

    //将三相输出 PWM 设置为50%占空比
    obj->pwmData.Vabc_pu.value[0]= 0.0f;
    obj->pwmData.Vabc_pu.value[1]= 0.0f;
    obj->pwmData.Vabc_pu.value[2]= 0.0f;

    在这里、如果我们使用该逻辑、我们可以生成固定量的占空比、但它将为 HIG_SIDE 和低侧 MOSFET 生成。

    如上所述、我只需要为低侧 MOSFET 生成 PWM 即可实现再生制动。

    我能否将此逻辑用于我的应用? 如果是、请说明如何使用上述逻辑仅为 LOS 侧 MOSFET 生成 PWM。

    此致、

    Kirana H P

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

    有。 您需要通过禁用高侧和低侧之间的 DEA 时间来重新配置 PWM。 您可以参阅通用电机控制实验中的制动模式。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="578806" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1424244/tms320f2800157-48v-encoder-motor-sometimes-running-in-uncontrolled-maximum-speed---alignment-issues/5663909 #5663909"]如果是、请说明如何使用上述逻辑仅为 LOS 侧 MOSFET 生成 PWM。

    大多数书面理论指出、如果将所有 NFETS 置于高阻抗状态、电机会使电机会发生制动。 最近花费了时间重写 DRV8320RS 的命令驱动器(快速启动 isLAB_09)、也许可以将其添加到 UMCSDK (motor_common.c)中。

    DRV8353控制器内置了死区、无法禁用默认的100ns、只能降低至50ns。  

    当运行启动标志为真时、代码 snip 向 DRV83xx 发送 SPI 滑行命令、并在标志恢复后禁用。  

      

            //
            // run the speed controller
            // when speed control set true
            //
            if(EST_doSpeedCtrl(estHandle))
            {
                counterSpeed++;
    
                    if(counterSpeed >= userParams.numCtrlTicksPerSpeedTick)
                    {
                        if(motorVars.flagEnableSpeedCtrl == true)
                        {
                            counterSpeed = 0;
                        }
    
                        #ifdef _DRV8320_SPI
    
                        // Enable Coasting, all NFETS high Z state
                        if(motorVars.flagStateFlyingStart == true)
                        {
                            HAL_Obj  *obj;
                            // Bit bang register SPIB INT6.3/4 IRQ
                            // assumes coast control bit 0x0h
                            while(drvSPI8320Vars.Ctrl_Reg_02.COAST != true)
                            {
                                // Set control REG2 bit 2 state
                                drvSPI8320Vars.Ctrl_Reg_02.COAST = 1;
                                // Write enable
                                drvSPI8320Vars.writeCmd = 1;
                                // write register_02 data
                                DRV8320_writeSPI(obj->drv8320Handle,
                                                         DRV8320_ADDRESS_CONTROL_2,
                                                             drvSPI8320Vars.Ctrl_Reg_02.COAST);
                                /* Delay 100ns */
                                SysCtl_delay(10);
                                // Read enable
                                drvSPI8320Vars.readCmd = 1;
                                // Mask the SPI control register_02 read data
                                drvSPI8320Vars.Ctrl_Reg_02.COAST &
                                      DRV8320_readSPI(obj->drv8320Handle, DRV8320_ADDRESS_CONTROL_2);
                            }
                        }
                        // Disable Coasting all NFETS NOT high Z state
                        else if(motorVars.flagStateFlyingStart == false)
                        {
                            HAL_Obj  *obj;
                            // Bit bang register SPIB INT6.3/4 IRQ
                            // assumes coast control bit 0x1h
                            while(drvSPI8320Vars.Ctrl_Reg_02.COAST != false)
                            {
                                // Set control REG2 bit 2 state
                                drvSPI8320Vars.Ctrl_Reg_02.COAST = 0;
                                // Write enable
                                drvSPI8320Vars.writeCmd = 1;
                                DRV8320_writeSPI(obj->drv8320Handle,
                                                         DRV8320_ADDRESS_CONTROL_2,
                                                             drvSPI8320Vars.Ctrl_Reg_02.COAST);
                                /* Delay 100ns */
                                SysCtl_delay(10);
                                // Read enable
                                drvSPI8320Vars.readCmd = 1;
                                // Mask the SPI control register_02 read data
                                drvSPI8320Vars.Ctrl_Reg_02.COAST &
                                      DRV8320_readSPI(obj->drv8320Handle, DRV8320_ADDRESS_CONTROL_2);
                            }
                        }
    
                        // Disable HAL_SPI read/write bool flags
                        drvSPI8320Vars.writeCmd = 0;
                        drvSPI8320Vars.readCmd = 0;
    
                #endif
    
                        PI_run_series(piHandle_spd,
                                      estInputData.speed_ref_Hz,
                                      estOutputData.fm_lp_rps * MATH_ONE_OVER_TWO_PI,
                                      0.0,(float32_t *)(&(Idq_ref_A.value[1])));
                    }
         }

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

    尊敬的 Yanming Luo 和 Genatco:

    感谢您的答复。

    目前、我能够在所有低侧 MOSFET 和微控制器侧以固定占空比生成 PWM。

    但现在问题是,在这段时间,我得到了一些 所有高侧 MOSFET 上的斜坡脉冲、如下所述 "我是你的 没有得到 两端的交流电压 微控制器引脚侧 . 在微控制器引脚上、我将获得适当的脉冲(所有高侧 MOSFET 引脚均处于关闭状态)。

    如果我在 UMC 中使用如下所述的默认逻辑、我不会遇到此问题(高侧 MOSFET 上的斜坡脉冲生成)、但问题是、使用此逻辑、我无法生成具有固定占空比的 PWM、如上述文章中所述。

    下面我附加了用于再生和 AS 的逻辑 Yanming Luo 建议重新配置所有 PWM 引脚。

    在这种情况下、只有低 PWM 频率下、我才能获得正确的占空比。

    请检查逻辑、如果有任何问题、请回答正确。

    在这里、开关模式可以在微控制器侧正常工作、但我面临的问题仅在 MOSFET 侧。

    请告诉我、原因是这样 在栅极驱动器 IC 侧发出我需要检查的任何东西。

    谢谢!

    此致、

    Kirana H P

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

    下面我连接了用于再生制动的逻辑、请检查并告知我是否有问题。

    静态内联 void HAL_enableBrakePWM (HAL_MTR_Handle handle)

    HAL_MTR_Obj * obj =(HAL_MTR_Obj*)句柄;
    uint16_t cnt;
    //
    ePWM_SignalParams pwmSignal =
    {900、0.5f、0.5f、true、DEVICE_SYSCLK_FREQ、
    epwm_counter_mode_up_down、epwm_clock_divider_1、
    EPWM_HSCLOCK_DIVIDER_1};

    board_init();

    ////针对所需的频率和占空比配置 ePWM 模块

    EPWM_configureSignal (myEPWM1_BASE、&pwmSignal);
    ePWM_configureSignal (myEPWM2_BASE、&pwmSignal);
    ePWM_configureSignal (myEPWM3_BASE、&pwmSignal);

    EPWM_enableSyncOutPulseSource (myEPWM1_BASE、
    EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);

    INTERRUPT_ENABLE (INT_EPWM1);

    适用于(cnt = 0;cnt < 3;cnt++)

    //设置动作限定符连续软件强制寄存器(AQCSFRC)
    EPWM_setActionQualifierContSWForceAction (obj->pwmHandle[cnt]、
    EPWM_AQ_OUTPUT_A、
    EPWM_AQ_SW_OUTPUT_LOW);

    //设置死区发生器控制寄存器(DBCTL)
    EPWM_setDeadBandDelayMode (obj->pwmHandle[cnt]、EPWM_DB_RED、false);
    EPWM_setDeadBandDelayMode (obj->pwmHandle[cnt]、EPWM_DB_FED、false);
    }
    #endif //!HVMTRPFC_REV1P1 & BSXL3PHGAN_REVA

    obj->flagEnablePWM = false;

    返回;
    }// HAL_enableBrakePWM ()函数结束

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

    为什么不首先研究再生制动(EPWM-A/B)输出动作限定器通过制动功能设置为高阻抗? 注释掉死区控制无关紧要、高阻抗再生制动 SPM 电机将反馈到 SMP 中(注意!)。

    或者、添加 B+二极管以阻断发电机电机进入 SMP 的反向电流。 是由锂电池供电的吗? 监控用户设置的稳压切断点的 ADC 总线电压。 针对高阻抗状态修改 UMCSDK 制动功能、测试 ADC 周期 ePWM A/B 驱动器的开/关、这与滑行 MCSDK isLAB_09非常相似。  

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

    您好、Genatco、

    您能否说明一下、该滑行功能如何在 DRV EVM 中运行。

    此处、我们不会为上述代码中的低侧 MOSFET 生成任何 PWM。

    我能否在 DRV8353 EVM 中使用这个逻辑、因为我知道、在通用电机代码中、没有这个逻辑。

    如上所述、在逻辑中、我能够生成具有固定占空比的 PWM、但在高侧 MOSFET 上、我会收到斜坡脉冲、但在微控制器引脚侧、我不会收到这些脉冲。

    对于任何与 DRV IC 相关的变量、我们需要注意这个问题。

    因为我能够生成只有低频值(900至1600Hz)的固定占空比 PWM。

    这是否正确、或者我需要检查更高的频率吗?

    谢谢!

    此致、

    Kirana H P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="578806" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1424244/tms320f2800157-48v-encoder-motor-sometimes-running-in-uncontrolled-maximum-speed---alignment-issues/5670230 #5670230"]我能否在 DRV8353 EVM 中使用此逻辑、因为我知道、在通用电机代码中、此逻辑并不存在。

    也许在制动功能中添加 SPI 寄存器控制代码、在上述 SPI 调用中将 DRV8320RS 更改为 DRV8353xx。 将飞标志测试更改为制动标志控制。 确保检查 UMCSDK 内部更新的制动和再生功能的标称总线电压。 如果您能想象这种设计、就能成为现实(:-)  

    任何 DRV IC 相关变量、我们都需要注意此问题。

    栅极驱动器旨在直接处理此问题、但您可以在另一篇博文中询问论坛有关任何其他寄存器的信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="578806" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1424244/tms320f2800157-48v-encoder-motor-sometimes-running-in-uncontrolled-maximum-speed---alignment-issues/5670230 #5670230"]正如我在上文所提到的、在我的逻辑中、我能够生成具有固定占空比的 PWM、但在高侧 MOSFET 上我将获得斜坡脉冲、但在微控制器引脚上我没有获得此脉冲。

    无论 DRV8353栅极驱动器何时处于高阻抗状态、栅极都不做任何事情、NFET 续流体二极管可处理交流/直流整流。 您还可以在同一个函数调用中将两个 ePWM 操作限定符设置为高阻抗。 当 bool 制动标志更改状态时更改操作限定符、再生制动不需要注释(//) ePWM 周期更改。  

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

    您好、Genatco、

    你能否简单地解释一下你上面提到的第一点、因为我没有得到你所说的。

    是否建议我只需打开低侧 MOSFET 和关断高侧 MOSFET、就使用默认的 UMC 逻辑? 而不生成具有固定占空比的 PWM。

    此致、

    Kirana H P

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

    实际上、您的一位 TI 同事仅推荐了再生制动回收纸。 我在上面已经提到过。

    我目前在引用同一文档、因为我需要控制再生能量。

    正确、如果我答错了、只需打开/关闭 MOSFET、就无法控制电机产生的再生能量。

    如上所述、在我们的应用中、用户应选择占空比或再生百分比。 在本文档中、他们还解释了相同的内容。

    如果您对该算法有任何建议、请告诉我。

    我的目标是进行再生制动、用户应选择再生制动百分比。

    您能说明如何在通用电机代码中使用该算法吗?

    如果您有基于我们要求的算法或逻辑、请向我提供相同建议。

    只需打开/关闭 MOSFET、我们就可以控制再生能量、如上所述?

    谢谢!

    此致、

    Kirana H P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否说明如何在通用电机代码中使用此算法?

    制动启用禁用状态控制通过 motor1_drive.c 调用定位(hal.h)。 制动相电流延迟周期通过 user_mtr1.h 进行设置 UMCSDK 未根据代码外观设置为再生制动。 它支持使用施加相电流的时间段进行受控硬制动。 hal.h 的两个制动状态控制均从 motor_common.c 中调用 做你似乎说的是有点复杂。 两种制动控制都需要大量修改代码顺序、以便在主 ISR 循环内的时间受控状态机中在每种模式之间切换。 在切换模式期间、当相电流突然反向时、必须应对 BEMF。 代码可能需要缓慢增大硬制动电流、而不仅仅是施加硬1A。  

    为了更好地了解逆变器电机发电机如何产生直流电压、例如为锂电池充电。 更好地进行对基本代码进行微小更改的实验、将这些更改应用于更难处理的控制算法中。 上述 SPI 命令设置了两种模式、但简化该操作可能对您有利。

    重点是逆变器无法同时产生两种制动模式!  仅在设置冷却延迟期间(user_mtr1.h)和使用对总线电压的限制来监控相电流期间、才可能将看似 SPI 定向再生制动调用(coast = 1)交错到硬制动模式(coast = 0)。 这两种模式的交错将需要一些时间来开发和实验。

    #ifdef BRAKE_ENABLE
        obj->brakingCurrent_A = USER_MOTOR1_BRAKE_CURRENT_A;
    //
        obj->brakingTimeDelay = USER_MOTOR1_BRAKE_TIME_DELAY;
    //
        obj->flagEnableBraking = false;
        obj->brakingMode = HARDSWITCH_BRAKE_MODE;
    #endif // BRAKE_ENABLE
    
    // Sets up control parameters for stopping motor
    void stopMotorControl(MOTOR_Handle handle)
    {
        MOTOR_Vars_t *obj = (MOTOR_Vars_t *)handle;
    
        obj->speed_int_Hz = 0.0f;
    
        obj->flagRunIdentAndOnLine = false;
    
    #ifdef BRAKE_ENABLE
    if(obj->motorState == MOTOR_BRAKE_STOP)
    {
        if(obj->brakingMode == HARDSWITCH_BRAKE_MODE)
    {
    // Exit braking PWM mode
    HAL_exitBrakeResetPWM(obj->halMtrHandle);
    }
        obj->motorState = MOTOR_STOP_IDLE;
        obj->mctrlState = MCTRL_BRAKE_STOP;
        obj->flagEnableBraking = false;
    
        obj->IsRef_A = 0.0f;
        PI_setUi(obj->piHandle_spd, 0.0f);
        PI_setRefValue(obj->piHandle_spd, 0.0f);
    }
    #endif // BRAKE_ENABLE
    
    //
    //! \brief Enumeration for the braking Mode
    //
    typedef enum
    {
        FREE_STOP_MODE = 0, //!< Free stop mode without braking
        HARDSWITCH_BRAKE_MODE = 1, //!< Hard switch braking mode
        FORCESTOP_BRAKE_MODE = 2, //!< Force alignment braking mode
        DYNAMIC_BRAKE_MODE = 3, //!< N/A, Dynamic braking mode
        REGENERATION_BRAKE_MODE = 4 //!< N/A, Regeneration braking mode
    } BRAKE_Mode_e;

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

    您好、Genatco、

    感谢您的支持。

    目前、我正在测试负载设置中的再生制动情况。

    我们有背靠背电机设置、在这里、我将使用我们的定制板运行测试电机、并且负载电机与另外一个控制器连接。

    我以同一方向运行两个电机、然后施加再生制动、因为此电机停止。 相反方向的负载电机以相同的 RPM 运行、我在这里尝试复制车辆级的再生制动情况。

    这种方法是否正确、或者我们需要以不同的方式进行测试、请提供您的建议。

    在上述再生制动条件下、我收到下面视频剪辑中所述的总线电压。

    在这里、我已经将探头连接在控制器电池端子上。  

    您能告诉我、这里的电压电平是否合适吗? 因为我对这方面有一些困惑。

    e2e.ti.com/.../VID_2D00_20250227_2D00_WA0007.mp4

    谢谢!

    此致、

    Kirana H P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="578806" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1424244/tms320f2800157-48v-encoder-motor-sometimes-running-in-uncontrolled-maximum-speed---alignment-issues/5683758 #5683758"]

    您能告诉我、这里的电压电平是否合适吗? 因为我对这方面有一些困惑。

    [报价]

    不知道视频是什么,水平时基太深看到单波形式。  您可以简单地使用添加2个低电阻高功率电阻器的负载电机。 也许从(25 -50Ω 25W 拧下铝板)将电阻器放置在负载电机3相之间。 在制动实验过程中应产生足够的功率负载、而不会使直流逆变器过载。