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-F280049C:SDK 电机 ID 控制状态消息

Guru**** 654100 points
Other Parts Discussed in Thread: MOTORWARE, BOOSTXL-DRV8323RS, LAUNCHXL-F2800137, BOOSTXL-3PHGANINV, DRV8329AEVM, DRV8316REVM, TMDSCNCD280039C, TMDSCNCD280025C, TMDSCNCD2800137, TMDSADAP180TO100, C2000WARE-MOTORCONTROL-SDK, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1205992/launchxl-f280049c-sdk-motor-id-control-status-messages

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件:C2000WARE-MOTORCONTROL-SDKC2000WARE、MOTORWARE

您好!

需要通过 Java 脚本打印在调试表达式视图中看到的电机 ID 3 Tear 控制器状态消息。 奇怪的是、它们不是 Java 脚本的一部分、似乎调试仿真器可以将这些(结构枚举)状态消息直接移植到 Expressions View Pain。 是否有其他一些估算器状态消息正在分阶段的文件?

如果尝试通过 est.h/ctrl.h 内联调用将速度控制器电机 ID 消息打印到外部设备、则会给出"未定义句柄"、因为从未从 isLAB 导出。 控制器(结构枚举)状态消息不会链接到下面的代码 snip 所示的 motorVars。 电机 ID 开始时发送的状态消息仅为(k)、而预期为 Est_State_Online。

电机控制 SDK v4.02中的处理错误是否已修复、以及如何获取 ID 状态尚未成为 est.h 内联的一部分? SDK 是否打算在笔记本电脑的 CCS 调试中确定每个电机 ID? 假设在这种情况下、当温度低于冰点时、装配线工人使用 JTAG 或 CAN 加密狗、而不是轻型手持设备或应用集成式电机 ID。 我们不能期望 LQ/LD 电感将会接近在室温甚至沙漠热量条件下确定的值。 理想情况下、电机 ID 过程需要在不久的将来改进为高速运行时算法。 不过就目前而言,婴儿的脚步后来跳进火中,一些真正的弹药。  

 

    char EstCtrlState[30];
    char EstState[30];
    char TrajectState[30];

/* Synchronize current states */
EstCtrlState[0] = motorVars.ctrlState;
EstState[0] = motorVars.estState;
TrajectState[0] = motorVars.trajState;

EstCtrlState[0] = CTRL_getState(ctrlHandle); // Handle not defined error

//! \brief Gets the controller state
//! \param[in] handle The controller (CTRL) handle
//! \return The controller state
static inline CTRL_State_e CTRL_getState(CTRL_Handle handle)
{
CTRL_Obj *obj = (CTRL_Obj *)handle;

return(obj->state);
} // end of CTRL_getState() function

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

    我在跟踪您尝试执行的操作时遇到了一些问题。 您是说您正在尝试向 InstaSPIN 实验 js 文件之一(例如 is05_motor_id.js)添加一些变量、但该文件不起作用吗? CCS 是否允许您手动将相同的变量添加到"Expressions"窗口?

    惠特尼

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

    惠特尼、您好!

    CCS 未被用来显示这三个变量的状态结果。 我稍微能够通过 将3层结构枚举状态消息复制到输出函数中作为"text"来打印这些消息。 尽管 motorVars.xyz 未传递结构的更新枚举编号、但当实验轮询控制器或估算器全局更新函数时、会发生变化。

    调用内联估算器函数的对象句柄是符号列车残骸。 如果不会导致编译器符号未定义或缺少错误、则无法从任何其他函数调用它们。 即使我们将一些实验句柄作为外部项移至 ctrl.h 中、调用 lab #include 到 ctrl.h 也不会将句柄符号链接到枚举结构。 即使在清理工程之后、也要重建索引、关闭 CCS、重新打开 CCS 会重建索引实验模块#include"est.h"、"ctrl.h"是无用的。

    在 SDK 的 c:\ti 下向工程文件夹中添加包含路径对符号丢失错误没有帮助、而更改订单模块#Includes 不会对 CCS v12.2产生任何影响。 编译器无法找到这些对象句柄符号、因为它们已添加到实验的 C 文件中、而不是它们所属的单个源文件的头文件。 添加的包含应指示符号新位置在移动到 属于源文件的标头时不起作用。 大多数句柄似乎工作正常、但以下两个句柄无法正常工作、正如所提到的那样。

    CTRL_Handle ctrlHandle;//!<控制器的句柄
    CTRL_Obj ctrl;          //!<控制器对象

    CCS 是否允许您手动将相同的变量添加到"Expressions"窗口?

    这些命令(motorVars.xyz)已经包含在 Java 脚本中、并且会随枚举的结构消息一同显示、因为下拉框是它们不容易导出到 SCI、SPI、CAN 或任何其他外设的位置。 需要检查从 ROM 嵌入式估算器得出的电机识别状态消息的结构。

    这些是实验室全局更新、不会将枚举的结构状态消息或编号传递给另一个轮询函数中的外部变量。 它们不是指针(ui16EstCtrlState、 uin16EstState、Ui16TrajectState)是另一轮询函数的全局外部、因为 motorVars.xyz 在更改状态消息时无法传递枚举的支柱成员编号。 查看电机 ID 状态消息是如何生成的。 我们应该能够从 labs.c 或 isLAB 之外的任何其他项目函数调用以下估算器函数句柄、而不会发生符号丢失未定义的错误。  

    /*更新 HID */
    ui16EstCtrlState = CTRL_getState (ctrlHandle);

    静态内联空更新 GlobalVariables (EST_Handle estHandle)

    motorVars.estState = EST_getState (estHandle);
    /*更新 HID */
    ui16EstState = motorVars.estState;
    //
    motorVars.trajState = EST_getTrajState (estHandle);
    /*更新 HID */
    ui16TrajectState = motorVars.trajState;

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在跟踪您尝试执行的操作时遇到了一些问题。 [/报价]

    下面 是对 CCS 调试表达式窗口中显示的控制器消息枚举列表的调用。  内联调用中使用的枚举标记(CTRL_State_e)不会将生效消息的数量返回给列表的调用方。 似乎只是在 CCS 调试表达式窗口中出现返回、但不会返回到 内联的任何其他调用方。

    //! \brief Gets the controller state
    //! \param[in] handle The controller (CTRL) handle
    //! \return The controller state
    static inline CTRL_State_e CTRL_getState(CTRL_Handle handle)
    {
       CTRL_Obj *obj = (CTRL_Obj *)handle;
    
       return(obj->state);
    } // end of CTRL_getState() function
    
    typedef enum
    {
         CTRL_STATE_ERROR = 0, //!< the controller error state
         CTRL_STATE_IDLE = 1, //!< the controller idle state
         CTRL_STATE_OFFLINE = 2, //!< the controller offline state
         CTRL_STATE_ONLINE = 3, //!< the controller online state
         CTRL_NUMSTATES = 4 //!< the number of controller states
       // CTRL_RESERVED = 0x10000 //!< reserved to force 32 bit data
    } CTRL_State_e;
    #endif

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

    感谢您提供更多详细信息。 我可以添加一个调用 CTRL_getState 来更新 GlobalVariables(),方法是将 ctrlHandle 的 extern 添加到 labs.h 文件,就像 estHandle 一样。

    您的 ui16EstCtrlState、 uin16EstState、ui16TrajectState 变量是否包含预期的值? 您是否能够在表达式窗口中显示它们? 它们是否在键入 uint16_t 而不是枚举类型?  如果您发现它们的值与 motorVars 的对应值不同,可能与优化相关-您是否将它们声明为 volatile 或使用 retain 属性?

    它们(motorVars.xyz)已经在 Java 脚本中,且包含枚举的结构消息,其下拉框是它们无法轻松导出至 SCI、SPI、CAN 或任何其他外设的点。 来自 ROM 嵌入式估算器的电机识别状态消息的结构需要检查。

    您是否希望能够发送一个表示枚举值名称而不是整数值(如"CTRL_State_ERROR"而不是"0")的字符串? 除了手动将字符串表声明到代码中并根据状态变量值索引到代码中外、我不知道有什么方法可以做到这一点。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的 ui16EstCtrlState、 uin16EstState、ui16TrajectState 变量是否包含预期值?

    不~、它们都通过枚举号3 (STATUS_μ s 在线)、并且在表达式状态发生变化时从不会更改。 因此、该 HID 也可以在线监视表达式视图、但并非必需的。 。

    您是否想发送一个表示枚举值名称而不是整数值的字符串(如"CTRL_State_error"而不是"0")? 除了手动将字符串表声明到代码中并根据状态变量值索引到代码之外,我不知道有什么方法可以做到这一点。

    transport 方法是串行字符串、认为枚举消息是符号、应链接到结构枚举成员的编号。 带有成员编号的 struct 枚举密钥标签应通过地址移植符号名称、但链接器不会使用 struct 密钥作为命名符号的指针来处理反向符号表达式。 因此需要进行大量复制粘贴并添加代码 WA、如下所示。

    编译器不允许结构枚举列表密钥标签上的关键字(extern)、并且枚举列表不能成为全局导出。 因此、链接器不知道应用 C 代码引用的是什么。 这是符号 C 代码、应能够像移植任何断开的枚举成员编号一样轻松移植枚举名称。

    请注意、我稍后添加了周期计数、因为串行数据速率(115200)可以淹没终端。 应用程序不使用 SCIprintf(),但与 HID 类似。  

    // Globals
    extern uint16_t ui16TrajectState;
    
    // Prototypes
    uint16_t ui16TrajectState;
    char* CchrTrajectState[4];
    
    static uint16_t ui8TickIntCount2 = 0;
        
        /* Check the states changed */
        if(ui8TickIntCount2 <= 10)
        {
            /* Clear count */
            //ui8TickIntCount2 = 0;
            /* Increment pass count */
            ui8TickIntCount2 ++;
    
            /* Trajectory Controler States */
            if(ui16TrajectState == motorVars.trajState)//motorVars.trajState
            {
                CchrTrajectState[ui16TrajectState] = "EST_TRAJ_STATE_ERROR";  //!< the trajectory generator error state
                CchrTrajectState[ui16TrajectState] = "EST_TRAJ_STATE_IDLE";   //!< the trajectory generator idle state
                CchrTrajectState[ui16TrajectState] = "EST_TRAJ_STATE_EST";    //!< the trajectory generator parameter estimation state
                CchrTrajectState[ui16TrajectState] = "EST_TRAJ_STATE_ONLINE"; //!< the trajectory generator online state
    
                /* Trajectory state text box strings */
               SCIprintf(">>TrajectState->%s \n", CchrTrajectState[ui16TrajectState]);
           
            }
            
                    /* Check count intervals */
            if(ui8TickIntCount2 >= 10)
            {
                /* Clear count */
                ui8TickIntCount2 = 0;
            }
        }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否,它们都通过枚举号3 (status_~online),且当 expressions status 改变时,永远不会改变。

    如果您禁用优化或使变量变为易失性、它会产生什么影响吗? 我想知道编译器是做了什么来删除更新、还是"get"函数实际上正在执行。

    传输方法是串行字符串,认为枚举的消息是符号,应链接到结构枚举成员的编号。 带有成员编号的 struct 枚举密钥标签应通过地址移植符号名称、但链接器不会使用 struct 密钥作为命名符号的指针来处理反向符号表达式。 因此、它可以进行大量复制粘贴并添加如下所示的代码 WA。

    你可以在 CCS/编译器 论坛上询问他们是否有任何想法。 可能有一些我不知道的编译器功能。 据我所知、CCS 可以在"Expressions"窗口中对其进行填充、因为它可以解析工程中使用的文件、并可以在 typedef 中查找变量类型。

    惠特尼

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

    惠特尼、您好!

    你到底看到了与 SciPrintf ()相同的奇怪行为吗?

    你可以把编译器人员循环到该线程中吗? CCS 调试仿真器似乎在内部获取结构枚举值。 然而、将数字从内联函数向上传递到全局外部函数是不起作用的、

    此外、还需要循环 SDK 大师来查看 FAST 估算器控制句柄(est.h)、(ctrl.h)在从用户添加的函数调用时会导致符号错误。 其中许多都是 ROM 调用,似乎这些句柄需要是实验室模块#include (另一个蠕虫罐)发现的全局外部。 有些句柄是有效的、有些则不依赖于用户模块在已添加项目文件夹中的位置、其中包含位于项目底部的项目文件夹路径。 因此、即使句柄尚未从实验练习中移出、链接器也没有理由导致 Symbol 未定义或缺少错误。  

    示例:  

    EST_setParams (estHandle、&userParams);编译时不会出现来自同一项目文件夹中的任何用户模块的错误。

    CTRL_setParams (ctrlHandle、&userParams);符号未定义、句柄不存在、或者在将其作为 extern 移入 ctrl.h 后、首先在 xyz 中定义。 将句柄放在实验练习的顶部、而不是在实验练习中使用#include 查找它们、这对链接器定位符号的能力会产生实际的影响。  

    如果您禁用优化或使变量变为 volatile,它是否有区别?

    添加 volatile 或精简优化都不会修复通过 SDK est.h 或 ctrl.h 的内联变量在 struct 枚举中#3之后传递的任何其他外部

    #pragma function_options (Motor_ID、"--opt_level=0 --opt_for_speed=1")

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能将编译器人员循环至此线程吗? CCS 调试仿真器似乎在内部获取结构枚举值。 但从内联函数向上传递数字到全局外部不起作用、[/引号]

    如果您已将全局状态变量声明为 uint16_t (我见上面代码中的"uint16_t ui16TrajectState")、CCS 将会将它们显示为整数。 您需要将它们声明为枚举类型以使 CCS 使用枚举值显示它们。

    在实验 main .c 文件中声明处理变量不应妨碍您在其他地方使用它们。 handle typedef 位于.h 文件中、因此您应该能够#include 这些类型、并根据需要为 handle 变量添加 extern。

    我们的 FAST 专家目前不在办公室。 我将不得不在下周与他核实,看看是否有任何限制,在哪里可以调用这些"get"函数来解释错误的值。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您已将全局状态变量声明为 uint16_t (我在上面的代码中看到"uint16_t ui16TrajectState")、CCS 将把它们显示为整数。 您需要将它们声明为枚举类型以使 CCS 使用枚举值显示它们。

    该函 数未传递 枚举整数、而是枚举了的符号名称、并且不需要外部变量。 当首次在没有 exern 变量的情况下尝试时、我们希望编译器将枚举名称更改为 CchrEstCtrlState[CTRL_State_Idle]内的文本、但事实并非如此。 编译器似乎使用了符号名称地址、而不是链接符号名称地址的枚举整数。

    在首次尝试时、在不知情的情况下、它实际上确实传递了枚举名称、但在将引号与枚举符号名称一起使用时、array.c 未解析名称文本和编译器错误。 一把双刃剑。 线索是在添加代码以清除同一函数中的枚举符号名称等于整数0时的编译器警告。 但仍然需要剪切粘贴每个结构枚举名称、并在同一行使用引号将每个名称声明为文本枚举名称。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们的 FAST 专家现已离开办公室。 我必须在下周与他确认一下,看看在哪里可以调用这些"get"函数来解释错误的值是否有任何限制。[/引号]

    另一个非常奇怪的电机 ID 问题: motorVars.flagMotorIdentified = EST_getFlag_motorIdentified (estHandle);

    在从 SCIB ISR 和其他内联 est.h 调用的 ID 过程中,切换 true 和 false 不按预期工作。 仅当从 say、(main.c)调用一次时、标志 bool 状态才会保持为 true 或 false、而不是在用于轮询状态更改 的 while 或 ISR 循环中(EST_State_MOTORIDENTIFIED)。

    除了 main.c 的 while 循环外、许多用于控制 ROM 状态的内联 est.h 调用无法按预期正常运行 因此、实验 is05监控 IA 触发器并不是在名为函数的 ISR 中轮询 ID 控制状态切换事件的最佳方法。 其中一个症状是当 ID 进程被定向到在已识别的状态处理程序内停止时,MAIN_ISR()的 LED 闪存速率变为超速。 这似乎是堆栈损坏或 ROM 估算器其他位置的 ID 控制器函数返回矢量。

    WA 必须 通过调用 设置(motorVars.flagEnableSys = false)和 位于(EST_TRAJ_STATUS_IDLE)状态之前的外部停止函数退出枚举状态、必须 在(EST_TRAJ_STATE_EST)或 MAIN_ISR ()上停止 ID 功能、然后以不受控制的高速度循环。 由于下面的 while 循环方法代码 snip 在名为函数 ID 进程的 ISR 内部不起作用、因此不会检测到状态(IA)更改。

    Lab-is05电机 ID 过程示例依赖于 IT 通过对 est、h 的内联调用轮询估算器状态更改 这似乎只是在较慢的 while 循环中处理 ROM 控制状态。 因此、ID 示例可以通过枚举的结构控制状态使用 Switch Case、以便 在 while 循环中纠正错误的矢量控制、以在除 CCS 调试表达式设置(motorVars.flagEnableSys = false)之外的任何 ISR 内部设置(motorVars.flagEnableSys = false)、此时必须使其保持启用(true)运行时应用程序。

    在电机已识别状态  EST_setParams (estHandle、&userParams)后、该内联不会更新通过 ISR 调用参数;但当从也未处于 while 循环中的非 ISR 函数调用时、它确实工作得很好。 用于执行内联的函数指令会正常工作、但不会来自用于执行的 ISR 一次性指令。  

    代码 snip isLAB5在 ISR 循环中失败、无法检测已识别的状态:

            	/* Feeds back whether or not the controller state has changed */
                motorVars.Id_target_A = EST_getIntValue_Id_A(estHandle);
    
                flagEstStateChanged = EST_updateState(estHandle,
                                                      motorVars.Id_target_A);
                                                      
                /* Estimator current state changed */
                if(flagEstStateChanged == true)
                {
                               if( (EST_isLockRotor(estHandle) == true) ||
                         ((EST_isMotorIdentified(estHandle)
                           && EST_isIdle(estHandle)) == true))
                    {
                        if(EST_isMotorIdentified(estHandle) == true)
                        {
                            motorVars.flagMotorIdentified = true;
    
                            //
                            // set up the PI control according to the identification
                            // motor parameters
                            //
                            userParams.motor_ratedFlux_Wb = motorVars.flux_VpHz / MATH_TWO_PI;
    
                            userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm;
                            userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm;
    
                            userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm;
                            userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm;
    
                            userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm;
                            userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm;
    
                            userParams.motor_Ls_d_H = motorVars.Ls_d_H;
                            userParams.motor_Ls_q_H = motorVars.Ls_q_H;
    
    
                            CTRL_setParams(ctrlHandle, &userParams);
                        }
                }

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

    您是否可以尝试禁用除电机控制中断外的所有其他中断? 看到发生了什么?

    为什么要将后台循环中的代码移至 ISR? 您使用的 ISR 频率是多少?

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

    您好、Yanming:

    您是否可以尝试禁用除电机控制中断外的所有其他中断?

    这不是用于通过多个电机确定电机 ID 的实际解决方案、例如 4个电机无人机。 每个电机都具有随天气变化的各种电感。 似乎整个电感概念都离不开 AI 通过其他方式解决的一些问题。

    为什么要将后台循环中的代码移至 ISR 中? 您使用的 ISR 频率是多少?

    HID 器件运行实验 IS07中的电机 ID、而不是 IS05或 CCS 调试。 通过控制器 ID 状态的服务 ISR 循环在 ID 开始后使用 SCIB TXFIFO 来监视控制状态。 许多(est.h)内联函数在 ISR 函数控制循环中不起作用。 不知道将编译器#pragma 或关键字(内联)添加到(est.h)模块是否有助于它们执行 ROM 代码。  

    最后、了解如何将 ID 控制循环退出到 Est_Idle 中、无需轮询估算器 IA 事件、只需轮询其执行或已经执行的 ID 状态。 注意 ID 代码调用函数在多个电机参数之间进行选择、最多四个电机可通过 uint16_t 识别 Rs 欧姆*(user.c)函数的参数替换了大量电机#define。 理想情况下、使用闪存 API 将更新参数存储到4个专用扇区块中、每个电机一个。

    /* Indicate motor ID's flag and allow multiple 
       times to check motor inductance for any
       user defined motors become user motor 4 */
    if(motorVars.estState == EST_STATE_MOTORIDENTIFIED)
    {
       /* Prime user motor4 parameters via
        * previous user motor, no cut paste */
       USER_MOTOR4((uint16_t *) &userParams);
    
       /* Copy motorVars into user parameters */
       userParams.motor_ratedFlux_Wb = motorVars.flux_VpHz / MATH_TWO_PI;
       userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm;
       userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm;
       userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm;
       userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm;
       userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm;
       userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm;
       userParams.motor_Ls_d_H = motorVars.Ls_d_H;
       userParams.motor_Ls_q_H = motorVars.Ls_q_H;
    
      userParams.flagMotorIdentified = true;
    
      USER_MOTOR4((uint16_t *)&userParams.flagMotorIdentified);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rr_d_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rr_q_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rs_a_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rs_b_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rs_d_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Rs_q_Ohm);
      USER_MOTOR4((uint16_t *)&userParams.motor_Ls_d_H);
      USER_MOTOR4((uint16_t *)&userParams.motor_Ls_q_H);
      USER_MOTOR4((uint16_t *)&userParams.motor_ratedFlux_Wb);
    
      /* Update the estimator new parameters */
      EST_setParams(estHandle, &userParams);
      EST_setParams(estHandle, &userParams);
    
      /* Set the motor offline not running */
      motorVars.flagRunIdentAndOnLine = false;
      /* Set bypass ID flag */
      userParams.flag_bypassMotorId = true;
    
    }
    
    /* Exit, estimator motor ID state ends. Must 
       put >0 WaitTime control flag ID state */
    if(motorVars.estState == EST_STATE_MOTORIDENTIFIED)
    {
        if(motorVars.trajState == EST_TRAJ_STATE_IDLE)
        {
            /* Clear enable state flag.
              Move it into call stops ID */
            motorVars.flagEnableSys = false;
    
        }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是用于确定带有多个电机的电机 ID 的实际解决方案,例如 4个电机无人机。 每个电机都具有随天气变化的各种电感。 看似整个电感概念都存在人工智能可以通过其他方式解决的问题。

    我不是完全理解你在这里的答案。 您应该知道正在运行哪个电机、并在项目中相应地设置正确的参数、即使多个电机是由一个控制器控制的。

    您可以参考当前 MCSDK 中的通用电机控制实验、该实验能够在同一实验中进行识别和运行电机、并根据需要在线更改电机参数。

    该实验可以支持一组适用于 BLDC/PMSM 驱动器的硬件套件和控制算法。 这些套件包括 LAUNCHXL-F280025CLAUNCHXL-F280039C、  带 BOOSTXL-DRV8323RS 的 LAUNCHXL-F2800137、 BOOSTXL-DRV8323RH、DRV8353Rx-EVM   用于低压电机的 BOOSTXL-3PHGANINV、DRV8316REVM 或 DRV8329AEVM 逆变器板(最大值:100Vdc)。   带 TMDSHVMTRINSPIN 逆变器板的 TMDSCNCD280025C、TMDSCNCD2800137或 TMDSCNCD280039C 和 用于高压电机的 TMDSADAP180TO100 (最大350Vdc)。 控制算法包括采用 FAST 的无传感器 InstaSPIN-FOC、采用 eSMO 的无传感器 FOC、采用增量编码器的含传感器 FOC、采用霍尔传感器的含传感器 FOC。

    C2000WARE-MOTORCONTROL-SDK: https://www.ti.com/tool/C2000WARE-MOTORCONTROL-SDK

    通用项目和实验室用户指南: https://www.ti.com/lit/spruj26

    文件夹下的示例实验项目:C:\ti\c2000\c2000Ware_MotorControl_SDK_ \solutions\universal_motorcontrol_lab\f28002x

    或                                                        C:\ti\cc2000\c2000Ware_MotorControl_SDK_ \solutions\universal_motorcontrol_lab\f28003x

    或                                                        C:\ti\cc2000\c2000Ware_MotorControl_SDK_ \solutions\universal_motorcontrol_lab\f280013x

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以参考当前 MCSDK 中的通用电机控制实验,该实验可以在同一个实验中执行识别和运行电机,并根据需要在线更改电机参数。

    SDK 4.01在(motorVars.motorVars.ls_d/q_H = 0.0)和(userParams.flagMotorIdentified = false)估算器在  我们设置(motorVars.flagRunIdentAndOnLine = true)后自动进入电机 ID 控制环路时也是如此

    我们未使用 MCSDK、有几百个小时的时间将 HID 添加到 SDK 项目中。 您的回答并不能解释 est.h (eabi.lib)内联调用无法执行 ISR 循环中调用的 ROM 函数的原因。 在可能使用 ISR 函数控制 FAST 估算器的改进项目中、没有人会使用 CCS debug 来运行或更改电机参数。 使用 while 循环 main.c 似乎是启用或禁用估算器的好方法、但不能从 SCI、SPI、CAN 或 HSI 连接的器件等外设运行电机 ID。 在 AI 监控代码演变到足以进行在线电机 ID 之前、必须使用可视反馈环路。 HID 在电机 ID 中添加了紧急停止功能、因为它可以使电机过流、用户需要快速停止电机 ID 过程。 似乎有充分的理由开发用于 电机 ID 的 IC、以便在给定直流逆变器电压下通过电机相位上的传感器逻辑反馈来实现用户参数自动化。

    当 CCS 调试未用于运行电机 ID 时、没有用户来自 typedef 枚举消息的反馈。 因此、我提出的要点还包括 MCSDK、并且必须从任何外设 ISR 执行相同的(est.h)内联 ROM 或快速库调用。  

    BTW:使用(fast_full_lib_eabi.lib) exclude (f28004x_fast_rom_symbols_fpu32_eabi.lib)会导致符号丢失错误 SDK 4.01。 因此、即使将 eSMO 与 MCSDK Params.h 一起添加到 SDK 工程中、也需要进行大量更改才能向后兼容。 也许 SDK4.01 LSRAM FAST 估算器库可以修复(est.h)无法在 ISR 函数上运行的内联调用、但 TI 工程师需要验证是否能实现向后兼容性。  

    在线根据需要更改电机参数

     UMCSDK 中没有控制对象、并且也有相同的#定义来指示用户电机参数。 如果第一个电机均为相同类型、则可能适用于第一个电机、但当存在两个以上的电机时、逻辑将出现故障。 上面的示例代码使用函数定义电机 参数、而不是#define、因为它们不能更改、甚至无法存储在闪存中。  更新 LSRAM 参数仅适用于1-2个电机、不适用于4个电机或 POR 事件之后。

    MCSDK 是否将更改后的电机参数保存到闪存?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的回答没有解释为什么 est.h (eabi.lib)内联调用无法执行 ISR 循环中调用的 ROM 函数。

    我不这么认为。 est.h 中有多个内联函数、在示例实验中的 ISR 循环中调用。

    没有人打算在可能使用 ISR 函数来控制 FAST 估算器的改进项目中使用 CCS 调试来运行或更改电机参数。 [/报价]

    UMC 可以支持识别、而无需重建项目并使用 CCS。 请查看显示的实验用户指南、以运行实验以进行识别。

    MCSDK 是否将更改的电机参数保存到闪存?

    否 您可以在电机控制实验中参阅有关使用闪存 API 添加此函数的应用手册。 C2000Ware 中有一些与此相关的示例。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不这么认为。 est.h 中有多个内联函数,在示例实验中的 ISR 循环中调用。

    但在 ADCC1 ISR 从 ePWM SOCA 触发源派生的上下文中、不是通过 SCI、SPI、HSI 中断调用函数。

    另一个非常奇怪的电机 ID 问题: motorVars.flagMotorIdentified = EST_getFlag_motorIdentified (estHandle);

    在从 SCIB ISR 和其他内联 est.h 调用的 ID 过程中,切换 true 和 false 不按预期工作。 仅当从 say、(main.c)调用一次时、标志 bool 状态才保持为 true 或 false、而不是在用于轮询状态更改 的 while 或 ISR 循环中(EST_State_MOTORIDENTIFIED)

    [/报价]

      在通过下面的枚举状态机名称更改电机 ID 电感后、通过 EST_setParams (estHandle、&userParams)更新新电机 ID 参数所需的内联调用不会更新 LSRAM #pragma 用户参数。 因此、估算器会指示新参数、但无法 在名为函数的 SCI ISR 内部更新。 这在 UMC 中是相同的 C 代码、因此对于 SCI ISR 中的状态机更改、它必须使用相同的 typedef 枚举名称。 奇怪的是、在从 SCI RXFIFO ISR 函数调用的函数中、更新 LSRAM 中#pragma 用户参数的相同内联调用确实起作用。 当估算器需要新参数来驱动不同的电机时、我将针对其他3种不同的电机配置执行该操作。

    此外、刚刚使用估计器轨迹状态机枚举名称进行 while 循环测试、它们在 while 循环中完全不起作用。 事实(EST_State_MOTORIDENTIFIED)会在函数进入 while 循环后立即发生。 因此、调用 SCI ISR 函数带来了额外的好处、即在 main.c 中执行的控制器等待时间跟随状态机名称 同样、这些内联调用(est.h)可以包含编译器 关键字来处理它们在项目中的链接方式。 尚未看到使用任何内联编译关键字或指令来确保链接器正确执行它们、尤其是在与 ADCC1 ISR 不处于同一上下文中的 ISR 事件期间。 想知道 CALLS pragma 指令在这个更新问题中是否有用?

    if(motorVars.estState == EST_STATE_MOTORIDENTIFIED)
    {
            /* Copy motorVars to user parameters */
            userParams.motor_ratedFlux_Wb = motorVars.flux_VpHz / MATH_TWO_PI;
            userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm;
            userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm;
            userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm;
            userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm;
            userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm;
            userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm;
            userParams.motor_Ls_d_H = motorVars.Ls_d_H;
            userParams.motor_Ls_q_H = motorVars.Ls_q_H
        
        EST_setParams(estHandle, &userParams)
        
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然而在上下文中,ADCC1 ISR 派生自 ePWM SOCA 触发源,而不是通过 SCI、SPI、HSI 中断调用函数。

    如果在其他 ISR 中调用了这些函数、请检查 ISR 中是否存在任何时间溢出、因为初始化函数需要很长的执行时间。  

    如上所述、您可以参考 具有您需要的功能的通用电机控制实验。 您也可以使用 f28004x_fast_rom_symbols_fpu32_eabi.lib 在 F28004x 上实现此方法。 或者、您只能 在 F28004x 上使用 fast_FULL_lib_eabi.lib。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如上所述,您可以参考 具有所需功能的通用电机控制实验室。

    但电机 ID 使用相同的估算器状态机切换等待时间、并且不想通过添加大量额外代码调用来修改实验。 因此、需要管理模块、只需将文件夹添加到工程集、即可进行包含和编译。 为了方便 TI 更新、只需将文件夹移至新版本即可。 SKD 似乎是一个控制对象的优点之一、它允许 MTPA 和速度块。 通过  FAST_FULL_lib_eabi.lib 下载 的 MCSDK 是否允许 MTPA 扭矩控制、或者仅允许 SDK?

    或者您只能 在 F28004x 上使用 fast_full_lib_eabi.lib。

    这是一个符号蠕虫的罐,因为将 ESMO 的 est 文件夹添加到 SDK401使用 est.h 和 parmas.h 已经 MAJORY 改变。 我可以再给它一次尝试,但它拒绝在许多包括层面上合作。 您是否曾尝试过执行该更新、或者认为它可以轻松完成?

    与 DRV8320RS 相比、1的 hal.c 有重大变化(BSXL8320RS_REVA)。 我使用了 SDK 4.01 hal.c、但 FAST 完整库定义了在移动和导入 MCSDK 文件夹链接后 SDK 4.01头中不包含的新符号。

    如果在其他 ISR 中调用函数,请检查 ISR 中是否存在任何时间溢出,因为初始化函数需要较长的执行时间

    这种情况表明仅使用电机 ID 标志无法实现、从而以 Ls 计算结束。 这已更改代码以切换每个 EST_WAIT 状态的外壳轮询、对于 SCI ISR (115200 BPS)似乎更有效。 按照状态步骤中断称为函数的 SCI ISR、无需计时器。 motorVars.ls_q/d_H 按预期被捕获、但 在 Id case 执行 EST_setParams (estHandle、&userParams)后、userParams.motor_Ls_d/q_H 被移至小数点的右侧。 EST_setParams  更新调用是 通过#pragma function_options (NewMotor_ID、"--opt_level=0 --opt_for_speed=1")进行的、但它的工作方式与非 ISR 函数不完全相同。

    因此、SDK 的全局编译优化可能会给调用 ROM 估算器函数的内联短函数(est.h)带来问题。

    TMS320C28x 优化 C/C++编译器 v22.6.0.LTS 47SPRU514Y–2001年8月–2022年6月修订第47页

    •使用内联关键字或等效的__inline 关键字。 如果设置了--opt_level=0或更大值、则使用内联关键字声明的函数可能会被编译器内联。 内联关键字是程序员对编译器提出的建议。 即使优化级别很高、内联对于编译器来说仍然是可选的。 编译器根据函数的长度、调用函数的次数、-opt_for_speed 设置以及函数中任何不允许函数内联的内容来决定是否内联函数(请参阅第2.11.2节)。 如果函数体在同一模块中可见、或者也使用了-pm 且函数在正在编译的模块之一中可见、则可以在-opt_level=0或更高级别内联函数。 如果包含定义的文件和调用点都使用了--opt_level=4进行编译、则可以在链接时内联函数。 同时定义为静态和内联的函数更有可能被内联。

    •当使用--opt_level=3或更高版本时、编译器可能会自动内联符合条件的函数、即使这些函数未声明为内联函数也是如此。 此过程会使用内联关键字显式定义的函数对应列出的相同决策因素列表。 有关自动函数内联的更多信息、请参阅第3.5节。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过  fast_full_lib_eabi.lib  的 MCSDK 是否允许 MTPA 扭矩控制或仅限 SDK?

    MPTA 与 FAST 库无关。 您可以在任何具有 FAST 库的 InstaSPIN-FOC 示例实验中添加 MTPA。 通用实验室已经包含了 MTPA 参考。

    您是否尝试过进行此更新或只是认为可以轻松完成?

    如上所述、   通用实验室包含 FAST 和 eSMO、并能够使用这两种算法同时运行电机。

     

    TMS320C28x 优化 C/C++编译器 v22.6.0.LTS 47SPRU514Y–2001年8月–2022年6月修订第47页

    你是对的。 您也可以查看  《C2000 C28x 优化指南》 。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否曾尝试过执行该更新、或者认为它可以轻松完成?

    如上所述、   通用实验室同时包含 FAST 和 eSMO,

    [/报价]

    这种声明是指使用新 FAST 库而不是 MCSDK 的 SDK4.01。  

    您是对的。 您可以查看

    发布了编译器信息、以通知 TI 工程师、他们发布的代码按照设计功能不正常。 如果嵌入代码为公司专有、则无需解决最终用户问题。  当被置为有效时、估算器控制代码必须在所有串行外设 ISR 函数中保持稳定。 为了使 SDK 或 MCSDK 在开发过程中更有用、需要由 TI 工程师进行更多测试。 一家数十亿美元的公司可以负担 eBay 上售价39.95美元的 LCD 显示屏、用于 在任何串行外设连接设备上测试代码功能。 当我把我的脖子上吹嘘到其他人是多么伟大的 SDK MCSDK 是为工业应用,所以..

    注意:在电机识别过程中、USER_MOTOR_FLUX_EXC_FREQ_Hz = 20 (user.h)正在(motorVars.speedRef_Hz=235)中的预设之间切换。 应以20Hz 的频率启动 ID、但在(EST_State_ROVERL:)断开的情况下跳至235Hz。 当在下一种情况下(EST_State_RS:)再次强制使用20Hz 时、电机 ID ISR 会每隔(中断)便备份到235Hz 以及 ID 过程每隔一步执行一次。 因此、从(est.h) ROM 调用中去除静态数据会导致布尔逻辑中的 ISR 问题被中断。 SDK manefest.pdf 中记录了该更改、以删除所有内联统计信息。 编译器关键字 static 与 volatile 不同、因为 static 会在 ISR 调用之间保留变量值、而 volatile 则不会。  

    设置{EST_setFlag_motorIdentified (estHandle、false);}时、不设置 motorVars.~布尔标志条件、通过 SCI RXFIFO ISR 内联调用。 Flag{EST_setFlaguserParams.flagMotorIdentified}仍然为 true。 MCSDK 和 SDK 中的示例代码都需要进行重大调试才能与 ePWM SOCA 触发的 ADC ISR 以外的 C2000外设一起运行。 通过内联估算器函数(est.h)切换布尔逻辑时、链接到 typedef 结构成员的估算器控制标志必须相关、显然并非如此。 编译器链接器只能执行其被指示执行的操作、但对于引用 typedef 结构体 motorVars 成员的内联调用、LSRAM control DATA pragma 中的布尔逻辑、可能存在一些问题。 TI 人都是 C2000专家、我们只是侦探报告这些奇怪的问题。  

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

    InstaSPIN-FOC 示例实验室仅侧重于  将电机作为启动参考来运行、用户想要的任何内容都很难囊括在内。 用户可以更改和添加自己所需的功能。 我们了解您的顾虑和问题、如果可以添加更常见的功能、我们会尝试进行思考。

    如上所述、当您添加其他中断并调用这些 ISR 中的 FAST 函数时、您可能会尝试检查是否存在溢出。

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

    请注意、较旧的 Motorware 控件 SDK 要求将所有内联都设置为静态。 删除静态 SDK 2.01对估算器的许多调用似乎在 ISR 上下文中不起作用、或者在宽松的值下不起作用。 但必须知道 est.h 是否被视为对 ROM 估算器的内联函数调用。 奇怪的是、C2000编译器不会在任何原型上允许外部静态关键字、但 ARM 编译器确实同时允许这两者。 而且它不允许 typedef 结构中的静态 bool 似乎会导致在 ISR 事件中丢失值。

    有任何想法为什么无法获取 motorVars.RoverL_rps = EST_getRoverL_rps (estHandle)以返回 SCI ISR 中的值[Case EST_State_ROVERL:]? 设置 Time Wait 2.5 s、但仍然返回0.0、并且不在 CCS 调试中、同时观察 HID 上的行为。

    SPRUIO7–2019年3月

    .4. 函数原型
    •所有函数都必须在模块的相应头文件中进行原型设计。
    •所有函数声明都必须包含 extern 关键字。 所有内联函数都必须是静态的。
    •原型必须包含 Doxygen 注释。 更多细节请见附录中的示例头文件。

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

    我能够在(USER_MOTOR_FLUX_EXC_FREQ_Hz = 20)的电机 ID 期间获得轨迹赫兹静态值、此值需要修改下面的 is07.c 轨迹调用以检查用户电机是否具有 ID。

    //
    //更新速度轨迹的参考
    //
    if (user_motor_identified == true)

      motorVars.speedRef_Hz = USER_MOTOR_SPEED_REF_Hz;

    TRAJ_setTargetValue (trajHandle_spd、motorVars.speedRef_Hz);
    }
    否则、如果(USER_MOTOR_IDENTED == false)

      motorVars.speedRef_Hz = USER_MOTOR_FLUX_EXC_FREQ_Hz;
    }

    此想法是允许 HID 通过 LCD 键盘手动调整某些 ID 值、因为它被发现是 通过最合理的输入 USER_MOTOR_RATED_FLUX_VpHz 来停止振动的有效方法。 Spock 在计算中使用了最好的猜测,以在太阳周围的射击,并回到26 世纪的 StarTrek 拯救鲸鱼  

     使用 LCD 进行电机 ID 的另一个良好理由;使用 motorVars.flagEnableSys 进行调试、在 ID 出现严重错误时、单击变量可快速设置0x0。 如果将值设置为高电平、则延迟熏蒸表达式除第一次0x0外不会导致小型电机烟雾线圈。

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

     在电机识别 过程中、motorVars.speedRef_Hz 不会设置速度。 它由 USER_MOTOR_RATED_FLUX_VpHz 设置、将设置为 UserParams.MOTOR_RATEFlux_WB。 您可能必须参考 lab05才能调用相关参数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     电机识别 过程中 motorVars.speedRef_Hz 不会设置速度

    奇怪的是、user.h 和电机 ID 斜升速度是通过  USER_MOTOR_FLUX_EXC_FREQ_Hz 设置的。 也许您的意思是电机 ID 为05后、即为在线运行速度设置电机 ID。 但在 IS07中情况并非如此、全局更新(labs.h)设置估算器 UserParams.motor_ratedFlux_WB。 无论如何、上述添加到 is07的函数可用于在所有枚举估算器控制状态期间保持 rampup 速度设置20Hz。 我必须添加另一个函数 is07、用于确定电机是否具有 ID 以运行电机 ID 设置控制器使能(在线)、在电机 ID 省略 is05后设置(空闲)。

    在控制器离线 IS05中、估算器 ID 状态甚至会如何变化? 这是 关于为什么 RoverL_rps 在 IS07中不工作的 Ureka 时刻。

    请注意、在 loop 和 motorVars.flagRunIdentAndOnLine = true 期间、将同一 ID 开关情况 ISR 函数移动到 is05中甚至不会更改 main.c 中的控制状态。 什么是用于启用电机 ID 的 ROM 函数? 除了 EST_enable (estHandle)、似乎没有直接布尔调用(est.h)。 该调用无法准确描述电机 ID 方框图 ROM 嵌入式估算器中显示的标志。 EST_setMotorID_EnableFlag (estHandle)在哪里?

      

    自设置 KI/KP 电流后再次询问、控制器已在线启用。 然而 RoverL_rps 不执行任何操作。 即使在添加开关情况控制等待状态后、也要使控制器联机并设置3个 ISR 周期。 即使设置估算器2 ISR 节拍、也不会从调用中返回任何值来获取上述 motorVars.RoverL_rps。 有什么想法阻止了估算器重新调整任何 R/L 值? 已识别的电机(user.h) is07具有 L/R (513.677734)、因此全局更新非常有效。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何使用控制器脱机 is05更改估算器 ID 状态? 这是一个 Ureka 的时刻,为什么 RoverL_rps 不工作在 IS07。[/报价]

    重新调用以下函数并设置 userParams.flag_bypoassMotorId = false 对于识别、设置 userParams.flag_bypoassMotorId = true 以使用已识别的电机参数或保存的电机参数运行电机。

      user_setParams (&userParams);

      CTRL_setParams (ctrlHandle、&userParams);

      EST_setParams (estHandle、&userParams);

    其中是 EST_setMotorID_EnableFlag (estHandle)?

    只需要执行如上所述的操作。

    。 但 RoverL_rps 不执行任何操作。

    它仅用于识别。

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    重新调用以下函数并设置 userParams.flag_bypoassMotorId = false 对于识别,设置 userParams.flag_bypoassMotorId = true 用于使用已识别的电机参数或保存的电机参数运行电机。

    这是一个修辞问题、因为在上面所示的估算器模块中、IS05中没有明显的逻辑来切换 ROM 控制状态或启用电机 ID bool 标志。 没有旁路参数标志 is07、我们只需清除 motorVars 参数、请参阅代码 snip 逻辑。  没有在 ROM 代码中启用电机 ID bool 标志的 est.h 调用? 当 HID 运行开关情况时、motorVars 出现在 CCS 调试中、并且在 (motorVars.flagRunIdentAndOnLine = true)之前、snip 中显示的 NULL 值存在于&userParams 中。  极点数量和所有其他需要的 user.h 电机参数都存在。 奇怪的是、  IS07中没有 USER_MOTOR_FREQ_LOW_Hz 或 USER_MOTOR_FREQ_HIGH_Hz 的代码、这是否会导致问题?

     在 IS07中通过 ISR 开关案例启动电机 ID 的唯一方法、 即设置(motorVars.flagRunIdentAndOnLine = true)。 看似为什么 RoverL_rps 正在启动、但未在电机 ID 的第1步返回值。 实验 IS05检查 IA 触发点是否似乎轮询识别标志集、但在 ISR 上下文中无法执行此操作。 因此、我在经过数小时调查后发现、必须考虑 ROM 估算器电机 ID 过程的每个情况。 似乎在我增加控制节拍后、Rs 电阻的值更准确、更接近实际值。

        /* Disable motor is ID flag */
    	USER_MOTOR_IDENTIFIED = false;
    
        /* set the userParam flags for ID */
        userParams.flag_bypassMotorId = false;
        motorVars.flagMotorIdentified = false;
        motorVars.flagEnableUserParams = false;
    
        userParams.motor_ratedFlux_Wb = (float)0.0;
        userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm = (float)0.0;
        userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm = (float)0.0;
        userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm = (float)0.0;
        userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm = (float)0.0;
        userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm = (float)0.0;
        userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm = (float)0.0;
        //userParams.motor_Ls_d_H = motorVars.Ls_d_H = (float)0.0;
        //userParams.motor_Ls_q_H = motorVars.Ls_q_H = (float)0.0;
        //motorVars.RoverL_rps = 0.0;
        //motorVars.flux_VpHz = 0.0;
    
        /* Update the estimator with new parameters */
        EST_setParams(estHandle, &userParams);
        
        //Run motor ID process?
        EST_setFlag_motorIdentified(estHandle, false);
        /* Set the enable flag */
        motorVars.flagEnableSys = true;
        
        // Enter SCI ISR switch case funtion 
        // Set all the enumerated cases to display on HID
        // Switch case logic HID user button enables 
        //  motorVars.flagRunIdentAndOnLine = true starts motor ID

    。 然而 RoverL_rps 不执行任何操作。

    它仅用于识别。

    [/报价]

    右侧、它不会通过用于监控控制器状态的开关外壳以电机 ID 运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有 est.h 调用可在 ROM 代码中启用电机 ID bool 标志?

    否 执行上述操作 AD 以重新调用相关的初始化函数。

    极数和所有其他需要的 user.h 电机参数都存在。 奇怪的是、没有 USER_MOTOR_FREQ_LOW_Hz 或 USER_MO
    的代码

    仅适用于带有 v/f 笔环控制的 lab03

    是的、您可以根据电机和要求更改相关变量以进行识别。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您可以根据电机和要求更改相关变量以进行识别。

    然而 RoverL_rps 将不会通过 IS07中的控制器设置代码在电机 ID 过程中生成值。  ROM 中进行的电机 ID 调用似乎大多在开关用例 ISR 中工作、但在控制器设置中有很大不同。 将大型零件控制器设置 is05复制到 is07中,静止电机 ID RoverL_rps 已损坏。 这似乎与 ROM 估算器块的简单电机 id bool 开关相反。  现在我感到迷路了、无法发现差异(is05/is07)、因为控制器设置允许电机 ID 位于 snip 下方的 is07中。 为了使 RoverL_rps 提供值 n 电机 ID、缺少接地上的什么?  

            //if(EST_isMotorIdentified(estHandle) == true)
    		if((motorVars.flagMotorIdentified == true) ||
    		        (userParams.flag_bypassMotorId == false))
            {
                if(motorVars.flagSetupController == true)
                {
                    //
                    // update the controller
                    // set custom current and speed controllers gains
                    //
                    updateControllers();
    
                }
                else
                {
                    //motorVars.flagMotorIdentified = true;
                    motorVars.flagSetupController = true;
    
    				// set up estimator conrollers
                    setupControllers();
    
                }
            }
            /* Update controller states */
            CTRL_updateState(ctrlHandle);

     

    仅适用于带有 v/f 笔环控制的 lab03

    检查实验 is05。它在电机 ID 中使用两个用户参数。 很抱歉、错误地说、手动搜索 IS07实际上在 while 循环(main.c)之前设置了两个用户参数、CCS 搜索文件未显示选项卡上搜索文件中的代码片段  

    //
    //配置速度基准轨迹(Hz)
    //
    TRAJ_setTargetValue (trajHandle_spd、0.0);
    TRAJ_setIntValue (trajHandle_spd、0.0);
    TRAJ_setMinValue (trajHandle_spd、-user_motor_FREQ_MAX_Hz);
    TRAJ_setMaxValue (trajHandle_spd、USER_MOTOR_FREQ_MAX_Hz);
    TRAJ_setMaxDelta (trajHandle_spd、USER_MAX_ACCEL_Hzps / USER_ISR_FREQ_Hz);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您可以根据电机和要求更改相关变量以进行识别。

    Yanming 枚举名称缺失奇怪地跳过 RsOnline、但当状态机不受约束地运行时、RR WAIT 似乎填满了空。 snip 下方的代码并未解释轨迹状态机与控制器状态机在某种自动模式下的行为、 is05和 is07中都存在下面的抽头、但估算器 ROM 方框图使人们似乎可以在任何实验中简单地启用 ROM bool 电机 ID 开关、并根据(user.h)中的少量电机参数进入 ID 模式。

    相应 SNIP 用于切换控制状态机、因此没有文档可用于说明 ROM 估算器中的作用。 因此、它不适用于工业、汽车或航空用途、因为电机 ID 在模块之间不可移植。 但要解释为什么 RoverL_rps 未在具有电机 ID 过程的 IS07中运行。 我们无法以相同的方式使用代码 snip、因为在任何其他模块中、handle 符号缺失且未定义。

            // No estimator error
            else
            {
                motorVars.Id_target_A = EST_getIntValue_Id_A(estHandle);
    
                flagEstStateChanged = EST_updateState(estHandle, 0.0);
    
                if(flagEstStateChanged == true)
                {
                    //
                    // configure the trajectory generator
                    //
                    EST_configureTraj(estHandle);
                }
            }

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

    如前所述、建议您可以参考通用实验或直接使用可以帮助您根据需要启动项目的实验。

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

    尊敬的 Yanmig:

    您回答了 我的问题、但没有回答它与未计算的 RoverL_rps 直接相关的方式。 新电机加载默认值后、我正在清除上面代码中的值。 另一个问题是、切换状态的方法在任何地方都没有详细说明、并且 ROM 源不可见。 同样、IS05未设置控制器在线状态标志、因此 CCS 调试会在它实际处于在线状态时显示为空闲。

    请将代码片段添加到 RDK4.01、这样它将在电机 ID 期间正确地在线显示控制器状态机。 这对于正确的程序流反馈非常重要。 可以在轨迹中添加其他状态标志、例如错误和估算器错误状态标志。

            //
            if((motorVars.flagRunIdentAndOnLine == true) &&
               (motorVars.flagEnableOffsetCalc == false))
            {
    			if(HAL_getPwmEnableStatus(halHandle) == false)
    			{
    				//
    				// enable the controller
    				//
    				CTRL_enable(ctrlHandle);
    				//
    	            motorVars.ctrlState = CTRL_STATE_ONLINE;
    				//
    				// enable the FAST estimator
    				//
    				EST_enable(estHandle);
    				
    	                //
                    // configure the controller
                    //
                    EST_configureCtrl(estHandle, ctrlHandle);
    
                    if( (EST_isLockRotor(estHandle) == true) ||
                         ((EST_isMotorIdentified(estHandle)
                           && EST_isIdle(estHandle)) == true))
                    {
                        if(EST_isMotorIdentified(estHandle) == true)
                        {
                            motorVars.flagMotorIdentified = true;
    
                            //
                            // set up the PI control according to the identification
                            // motor parameters
                            //
                            userParams.motor_ratedFlux_Wb = motorVars.flux_VpHz / MATH_TWO_PI;
    
                            userParams.motor_Rr_d_Ohm = motorVars.Rr_Ohm;
                            userParams.motor_Rr_q_Ohm = motorVars.Rr_Ohm;
    
                            userParams.motor_Rs_a_Ohm = motorVars.Rs_Ohm;
                            userParams.motor_Rs_b_Ohm = motorVars.Rs_Ohm;
    
                            userParams.motor_Rs_d_Ohm = motorVars.Rs_Ohm;
                            userParams.motor_Rs_q_Ohm = motorVars.Rs_Ohm;
    
                            userParams.motor_Ls_d_H = motorVars.Ls_d_H;
                            userParams.motor_Ls_q_H = motorVars.Ls_q_H;
    
                            CTRL_setParams(ctrlHandle, &userParams);
    
                        }
    
                        //
                        // clear the flag
                        //
                        motorVars.flagRunIdentAndOnLine = false;
    
                        //
                        // disable the controller
                        //
                        CTRL_disable(ctrlHandle);
                        //
                        motorVars.ctrlState = CTRL_STATE_IDLE;
                    }
                }
            }			

    必须存在默认值、RoverL_rps 才能生成返回值。

    userParams.RoverL_KP_SF = USER_R_OVER_L_KP_SF;
    userParams.RoverL_min_rps = MATH_TWO_PI *(float32_t) 5.0;
    userParams.RoverL_max_rps = MATH_TWO_PI *(float32_t) 5000.0;

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

    不要更改 user.c 中的默认设置时间、以便识别可能的设置。

    RoverL_rps 仅用于识别、您需要调用 EST_setParams  (estHandle、&userParams)来获取新的计算值。

    我们不会更新 F28004x 的 InstaSPIN 实验。  如果用户要在 C2000器件上实施 InstaSPIN、建议他们执行通用电机控制实验。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RoverL_rps 仅用于识别、您需要调用 EST_setParams  (estHandle、&userParams)来获取新的计算值。

    您认为我在问为什么 RoverL_rps 在电机 ID 期间不起作用时想问什么。 如果 PWM 使能 未正确清除故障标志、并且 PWMA 信号在 ID 期间处于高阻抗状态、则会发现故障。 我必须添加代码来修复 CMPSS 的 PWM 启用问题、并禁用以清除先前强制的 OST、DAC1和 DAC2事件1标志。 PWM 启用调用(hal.h)根本没有进行编码 、也没有执行任何操作来清除 TZFRC 单触发故障标志寄存器。 我假定是在工作、但 在标志清除事件期间清零 TZFRC 寄存器实际上会栅极 PWM 信号。

    在故障清除事件期间、以下代码停止从选通 PWM 清除故障标志。 TZFRC 故障标志仅用于设置故障条件标志、并且仅可通过 TZCLR 寄存器正确清除。 但它清除了故障、但在清除事件后将 PWM 置于高阻抗状态。 因此、在启用 PWM-A 变为高阻抗时 RoverL_rps 为空值、在清除 TZFRC 寄存器位后、它们返回设置值。 您可以看到、如果在清除启用事件期间实际监控 GPIO 驱动引脚、则会在示波器上发生这种情况。

     

    //! \brief      Enables the PWM devices
    //! \details    Turns on the outputs of the EPWM peripheral which will allow
    //!             the power switches to be controlled. Clears TzFlags and
    //!				CMPSS High/Low digital filter output latch/s
    //! \param[in]  handle  The hardware abstraction layer (HAL) handle
    static inline void HAL_enablePWM(HAL_Handle handle)
    {
    
        HAL_Obj *obj = (HAL_Obj *)handle;
    
        /* Enable the forced OSHT evnets   18.9.2 Fig.18-41 */
        EPWM_clearTripZoneFlag(obj->pwmHandle[0],
                (EPWM_TZ_FLAG_OST | EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCBEVT1));
        //
        EPWM_clearTripZoneFlag(obj->pwmHandle[1],
                (EPWM_TZ_FLAG_OST | EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCBEVT1));
        //
        EPWM_clearTripZoneFlag(obj->pwmHandle[2],
                (EPWM_TZ_FLAG_OST | EPWM_TZ_FLAG_DCAEVT1 | EPWM_TZ_FLAG_DCBEVT1));
    
        obj->flagEnablePWM = true;
    
        return;
    } // end of HAL_enablePWM() function
    
    //! \brief      Disables the PWM device
    //! \details    Turns off the outputs of the EPWM peripherals which will put
    //!             the power switches into a high impedance state.
    //! \param[in]  handle  The hardware abstraction layer (HAL) handle
    static inline void HAL_disablePWM(HAL_Handle handle)
    {
        HAL_Obj *obj = (HAL_Obj *)handle;
    
        /* Enable the forced OSHT evnets   18.9.2 Fig.18-41 */
        EPWM_forceTripZoneEvent(obj->pwmHandle[0],
    				(EPWM_TZ_FORCE_EVENT_OST | EPWM_TZ_FORCE_EVENT_DCAEVT1
    							             | EPWM_TZ_FORCE_EVENT_DCBEVT1));
        EPWM_forceTripZoneEvent(obj->pwmHandle[1],
    				(EPWM_TZ_FORCE_EVENT_OST | EPWM_TZ_FORCE_EVENT_DCAEVT1
    							             | EPWM_TZ_FORCE_EVENT_DCBEVT1));
        EPWM_forceTripZoneEvent(obj->pwmHandle[2],
    				(EPWM_TZ_FORCE_EVENT_OST | EPWM_TZ_FORCE_EVENT_DCAEVT1
    							             | EPWM_TZ_FORCE_EVENT_DCBEVT1));
    
        obj->flagEnablePWM = false;
    
    
        return;
    } // end of HAL_disablePWM() function

    SDK (user.c)设置标志(userParams.flag_bowassMotorId)开发人员无法跟踪为什么代码矢量在设置时与清除时不同。 必须在 CCS 或文本中透明地解决 ROM 和 FAST 库中的标志、而此标志并非如此、会导致巨大的问题来删除看似孤立的标志、并且不需要在 MCSDK 中进行(est.h)调用来启用电机 ID 至少可以说是一种麻烦。 该从惯性中删除的孤立标志设置 CPU IP 会使代码运行、从而清除 Ls_d/q_H = 0.0。 根据 CCS 跟踪、该标志是孤立的、只有#define user.h 没有相关的 C 代码、肯定不会与任何人可以查看或搜索的 ROM 库函数相关联。 此标志的解释不够详细、不足以说明它如何向量代码偏离设置控制器 WaitTimes 底部 user.c 需要在故障排除 InstaSpin PDF 中以块格式文本布局查看控制器对这些状态的使用。

    建议 用户在需要在 C2000设备上实施 InstaSPIN 时参考通用电机控制实验室。

    在帖子的上方、您说不需要调试电机 ID、但文本状态有所不同。 通过 REX 导入的工程将文件夹置于 SDK4.0以下、因此 driverlib 许多函数都不会在 CCS 索引器或代码分析中解析。 MCSK 仅支持2个 ADC、并且需要极大的努力才能使其与 x49c MCU 类配合使用。 20MHz XTAL 的设置在 x25上是完全不同的、为什么 PLL 倍频器30不是10?  CCS 甚至无法找到正在定义 Booster 头站点的位置(LPD_SITE_J1_J4)或(LPD_SITE_J5_J8)。

    MCSDK 用户指南搜索结果是空的、因为在哪里可以启用 Booster 头、哪个文件? 人们可能会假设(motor1_drive.h)甚至是(motor1_drive.c)尚未存在这样的#define、任何人希望从 SDK (user.h)电机逆变器设置移动。 TI 程序员无处不在、因为在代码设计实践中并不一定要保持一致(例如符号名称)、这使得工作起来更加耗时。   

    6.在 Expressions 窗口中将变量 motorVars_M1.flagEnableRunAndIdentify 设置为' 1、如图2-41所示、电机识别将执行、整个过程大约需要150个0。 motorVars_M1.flagEnableRunAndIdentify 等于0并且电机停止后、电机参数即被识别。 复制观察窗口中的变量值以替换 user_mtr1.h 中定义的电机参数、如下所示:

    •USER_MOTOR1_Rs_Ohm = motorSetVars_M1.Rs_Ohm 的值
    •USER_MOTOR1_Ls_d_H = motorSetVars_M1.Ls_d_H 的值
    •USER_MOTOR1_Ls_q_H = motorSetVars_M1.Ls_q_H 的值
    •USER_MOTOR1_RATED_FLUX_VpHz = motorSetVars_M1.flux_VpHz 的值