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.

[参考译文] TMS320F280039C:电机控制 SDK 通用中的霍尔校准

Guru**** 2481465 points
Other Parts Discussed in Thread: BOOSTXL-3PHGANINV

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1452560/tms320f280039c-hall-calibration-in-motor-control-sdk-universal

器件型号:TMS320F280039C
主题中讨论的其他器件:BOOSTXL-3PHGANINV

工具与软件:

我将 F280039C 微控制器与 BOOSTXL-3PHGANINV 驱动程序配合使用、并打开了 Universal_motorcontrol_lab_f28003x

我已将其中一个电机的霍尔传感器连接到 BOOSTXL-3PHGANINV (如数据表中所述)、并且我需要进行校准。

在通用电机控制实验室中找不到有关此过程的任何信息、仅此文章和此注释:

// Enable MOTOR1_HALL_CAL pre-defined symbols, run the motor with FAST for angle calibration
// Copy hall_M1.thetaCalBuf[] to hallAngleBuf[]
// 1->1, 2->2, 3->3, 4->4, 5->5, 6->6, 6->0
// Disable MOTOR1_HALL_CAL pre-defined symbols after calibration for normal operation
                                    // 6           1              2
                                    // 3           4              5
                                    // 6

1) 我不明白在校准期间是否必须同时激活预定义的符号 HALL_CAL 和 MOTOR1_HALL .. 或者我只需要激活  HALL_CAL。

2) 我应该在哪里写入校准所需的代码? motor1_drive.c 文件中的注释正下方? 占空比是多少?

3) 正确、如果我错了、这是需要编写的代码吗?

       float32_t hallAngleBuf[7] = { 0, 0, 0, 0, 0 , 0, 0 };
       hallAngleBuf[0] = hall_M1.thetaCalBuff[0];
       hallAngleBuf[1] = hall_M1.thetaCalBuff[1];
       hallAngleBuf[2] = hall_M1.thetaCalBuff[2];
       hallAngleBuf[3] = hall_M1.thetaCalBuff[3];
       hallAngleBuf[4] = hall_M1.thetaCalBuff[4];
       hallAngleBuf[5] = hall_M1.thetaCalBuff[5];
       hallAngleBuf[6] = hall_M1.thetaCalBuff[6];
       hallAngleBuf[0] = hall_M1.thetaCalBuff[6];

在 main 中写入上述代码后、我将  HALL_M1.thetaCalBuff 放入 表达式中(调试时)、但一切都保持为0。

研究一个位后、我注意到 HALL_calibrateIndexAngle 函数(我认为是校准)没有变化...也就是说、仅当 motorVars_M1.flagEnableRunAndIdentify = 0但其中没有参数发生变化时才会重复调用它。 一切都是零!

我应该已经上传了一些图片、如果您看到这些图片、请告诉我

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

    您好!

    [报价 userid="629101" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1452560/tms320f280039c-hall-calibration-in-motor-control-sdk-universal "] 1) 我不明白在校准期间是否必须同时激活预定义的符号 HALL_CAL 和 MOTOR1_HALL .. 或者、如果我只需要激活  HALL_CAL。

    同时激活这两个功能以及快速预定义功能。 快速无传感器 algo 需要并行运行以执行校准过程。

    [报价 userid="629101" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1452560/tms320f280039c-hall-calibration-in-motor-control-sdk-universal "]

    2) 我应该在哪里写入校准所需的代码? motor1_drive.c 文件中的注释正下方? 占空比是多少?

    3) 正确、如果我错了、这是需要编写的代码吗?

    [报价]

    校准代码已经存在、您只需在运行校准例程一次后复制阵列定义之间的结果。

    此致!

    Kevin

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

    您好 、感谢您的答复。

    首先、在 CCS 的注释代码中、您谈到 "hall_m1.thetaCalBuf"、但它并不存在。 也许你意味着结构 HALL_M1内存在 HALL_M1.thetaCalBuff (还有一个额外的"f")

    进行调试时、我按"Run"按钮后、 数组"HALL_M1.thetaCalBuff"全部为 0、在我看到的表达式中:

    - EST_TYPE_FAST_HALL

    - motor_stop_idle

    - EST_State_idle  

    - HALL_IDLE

    -估算器模式快速

     启用 motorVars_M1.flagEnableRunAndIdentify = 1后、该阵列继续保持0、且表达式中存在:

    - EST_TYPE_FAST_HALL

    - motor_seke_pos

    - EST_State_Online.  

    - HALL_IDLE

    -估算器模式快速

    电机不旋转、也不会消耗电流

    如果没有霍尔效应(仅 FOC 无传感器)、电机将正常运行。

    我不明白问题是什么。

    在硬件级别、我已正确连接所有内容并切换了板上的小跳线(如您的 C200ware 通用实验 pdf 中建议的那样)。 霍尔传感器正常工作(我在试验电路板上使用逻辑分析仪和上拉电阻器对其进行了测试)

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

    您好!

    配置听起来正确、但需要使用 EST_TYPE_FAST_HALL 和 Estimator_MODE_FAST 配置使电机旋转。 这将使用快速算法进行闭环控制、但霍尔传感器算法仍将在后台运行以完成校准。

    [报价 userid="629101" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1452560/tms320f280039c-hall-calibration-in-motor-control-sdk-universal/5576941 #5576941"]

     启用 motorVars_M1.flagEnableRunAndIdentify = 1后、该阵列继续保持0、且表达式中存在:

    - EST_TYPE_FAST_HALL

    - motor_seke_pos

    - EST_State_Online.  

    - HALL_IDLE

    -估算器模式快速

    [报价]

    我不确定为什么它不起作用。 您使用的是哪个 SDK 版本? 也许较新的版本有一些错误修复。

    此致!

    Kevin

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

    我使 EST_TYPE_FAST_HALL 和 Estimator_MODE_FAST 均处于活动状态。 不管用。

    我不知道您是否深入了解此级别的详细信息、但我在这里附加了一个 链接 、您可以在这里下载项目并检查出错的地方。 考虑到代码的某些部分被(我)更改了以适应我的硬件、从而只使用 FAST (例如 user_mtr1.h)运行电机。 我没有再添加任何东西。 我甚至将项目从零重新导入到了另一个工作区、但遇到了同样的问题。

    (如果无法访问链接、请告诉我、我已重新加载)

    Motor SDK I 已在11月下载、所以我认为这是一个相当新的版本。

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

    我注意到、只有当快速启动...时、MOTOR_SEEK_POS 才会激活、这会强制关闭速度控制。

    我禁用了快速启动功能、现在状态为 MOTOR_ALIGNMENT。

    是 这样吗?

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

    另一方面、"__interrupt void motor1CtrlISR (void)"中包含的 motorVars_M1.ISRCount 没有变化。 它会立即在1872处停止

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

    您好!

    另一件事、"__interrupt void motor1CtrlISR (void)"中包含的 motorVars_M1.isrCount 没有变化。 我一调试它就会在1872[/报价]停止

    是否发生了禁用 ePWM 的跳闸?

    我可以自行尝试 SDK 示例项目、以便在有时间时验证它是否正常工作。

    此致!

    Kevin

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

    PWM 频率为45kHz。

    现在我把它更改为30kHz,代码正确找到 thetaCalBuff ...这是怎么可能的? 为什么使用45kHz 不会实现?

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

    简而言之、我只需将类似这样的值复制到"motor1_drive.c"中并禁用 HALL_CAL:

    #if (USER_MOTOR1 == Teknic_M2310PLN04K)
    const float32_t hallAngleBuf[7] = { 2.60931063f,  -0.45987016f, -2.57219672f, \
                                        -1.50797582f, 1.59862518f , 0.580176473f,
                                        2.60931063f };
    
    #elif (USER_MOTOR1 == Anaheim_BLY172S_24V)
    const float32_t hallAngleBuf[7] = { -1.41421735f,  1.75656128f, -2.48391223f, \
                                        2.76515913f,  -0.460148782f, 0.606459916f,
                                        -1.41421735f };
    #elif (USER_MOTOR1 == Anaheim_BLWS235D)
    const float32_t hallAngleBuf[7] = { 1.64448488f,  -1.54361129f,  0.548367858f, \
                                       -0.390248626f,  2.67842388f, -2.52673817f,
                                        1.64448488f };
    #elif (USER_MOTOR1 == Tool_Makita_GFD01)
    const float32_t hallAngleBuf[7] = { -2.71645141f,  0.399317622f, 2.47442961f,  \
                                        1.47019732f, -1.67825437f, -0.643157125f, \
                                        -2.71645141f };
    // ---------------THIS ONE IS MY MOTOR------------------
    #elif (USER_MOTOR1 == my_pm_motor_1)
    const float32_t hallAngleBuf[7] = { -2.01914597f,  2.15623236f, 2.71764278f,  \
                                        0.133888945f, -1.24430346f, 0.692704678f, \
                                        -2.01914597f };

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

    此外、如果我将 USER_M1_PWM_FREQ_kHz 设置为大于47、则电机(快速无传感器配置)不会旋转。

    www.dropbox.com/.../ACffQGwc16NQM6l1VMoHuCA

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

    您好!

    现在我把它更改为30kHz、代码正确地找到了 thetaCalBuff……这怎么可能呢? 为什么45kHz 不会运行?

    ISR/代码执行可能需要太长的时间才能使45KHz 正常工作。

    [报价 userid="629101" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1452560/tms320f280039c-hall-calibration-in-motor-control-sdk-universal/5596808 #5596808"]因此、概括来说、我只需将类似这样的值复制到"motor1_drive.c"中并禁用 HALL_CAL:

    校准值应该会稳定下来、并在一段时间后不会发生太大变化。 它只需要运行一次。

    此致!

    Kevin