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.

[参考译文] 快速状态

Guru**** 2747375 points

Other Parts Discussed in Thread: BOOSTXL-DRV8320RS, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/899627/fast-states

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件:BOOSTXL-DRV8320RSMOTORWARE

在 SDK (FOC)实验5电机 ID 中、对快速状态及其实施方式似乎存在一些困惑。 根据所有可用信息判断 、快速控制状态引擎的 SPRUHJ1H 与实验5电机 ID 的开发方式不完全一致。

未以与 user.c 等待时间匹配的方式检测电机 ID 状态、并且在各种状态变化时似乎会发生过运转。  SPRUHJ1H–2013年1月–2019年6月修订版中概述的某些状态变化会立即发生灾难性的、导致被强制进入不当模式、如果任何等待时间已延长或缩短、则会迅速崩溃。 奇怪的是、在为 Nidec 电机等待状态时间而停顿后、我能够识别更大的 SPM 电机 LC 磁通、仅有一次处于停滞状态、在线运行速度大于550Hz。 这是一个相当好的证据、表明 SDK (FOC)电机 ID 流程存在状态变化方面的主要问题。  

该 SDK 与 BoostXL-DRV8320rs 勉强兼容、通常无法确定正确或任何 LC 感应、在关键状态变化时停止电机并将电流驱动至不安全水平。 实验5中的状态引擎使用奇数未记录的方法来确定状态何时发生更改。

此代码如何符合更改电机 ID 状态所需的已记录控制对象? 如果指南未更新对 FAST 估算器所做的更改与记录的图示或控制对象不同、任何人如何能够对问题进行故障排除?

其他 //无估算器错误
{
motorVars.ID_TARGET_A = EST_getIntValue_ID_A (estHandle);

flagEstStateChanged = EST_updateState (estHandle、
motorVars.ID_TARGET_A);
/*估算器当前状态已更改*/
if (flagEstStateChanged == true)
{
//SCIprintf (">State_changed \n");
//
//配置轨迹发生器
//
EST_configureTraj (estHandle);

1.为什么这些控制对象不监测电机 ID 控制状态?

CTRL_updateState () bool CTRL_updateState (CTRL_Handle handle)反馈控制器状态是否已更改

CTRL_State_e state;//!<控制器的当前状态
CTRL_State_e fortState;//!<控制器的先前状态 

2.启用控制器对象与启用 FAST 估算器对象中显示的电机 ID 如何相同?

3.当电流斜升周期开始时,为什么强制角标志不被禁用? 图中仅显示了电机启动时强制的角度、而不是在任何其他状态下保持启用状态。 这似乎是因为未使用控制状态对象、因此无法知道何时禁用或启用标志。 在 R/L 期间启用奇怪的标志、但频率大于1Hz (USER_FORCE_ANGAL_FREQ_Hz)、并且保持启用状态、因此它不能自动禁用指令标志。

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

    请注意、如果我们在启用之前暂停 LAB5、则可以将其记录为状态 RatedFlux (8)而不是状态空闲(1)。 因此、状态控件似乎使用了错误的调用来确定何时更改状态。 奇怪的是、状态8的默认值正是我之前所说的- StateRatedFluxOL 等待超时、它会由于很好的理由而触发直流故障。  

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

    1.在 motorControlSDK 中、主循环控制在识别和运行时不使用控制器(CTRL)状态有一些变化、但 motorControlSDK 中的 FAST 估算器状态机与 motorWare 中的状态机相同。

    2.正如你对你发布的另一个主题的回复。 强制角标志将不会在识别过程中使用、即使该标志已启用、估算器也会根据状态启用/禁用强制角功能。  在调用 将启用电机识别的 EST_setParams (estHandle、&userParams)之前、将 userParams.flag_BypassMotorId 设置为 false。

    答案是问题2。

    正如我对您发布的许多线程所做的答复、请确保电流和电压信号在您自己的电路板上感应良好、并根据采样电路在 user.h 中设置正确的 ADC 缩放值。

    请发布您的 user.h 和电机规格、因为我们多次要求、我们可能会在我们的实验中找到类似的电机、以验证是否存在您提到的任何类似问题。 由于我们已经测试了 user.h 中列出的几乎所有电机、因此我们似乎没有满足您发布的问题。

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

    [引用用户="Yanming Lua"]识别过程中不会使用力角标志[/引用]

    然而、大多数问题意外的电流尖峰仍然与每个状态中的状态计数和 PWM 生成保持一致。 显然、文档与对 FAST 估算器 ROM 模块所做的设计更改不一致。 但在跑步过程中、状态计数似乎会阻塞、这可能是由于缺少下面所示的定义。 如果无法解决此 ID 过程阻塞问题、则无需在此路径上继续、因为 C2000显然不是用于电机控制的解决方案。

    [引用用户="Yanming Luo "]请发布您的 user.h 和电机的规格[/引用]

    它是一款定制的 SPM 36极电动机、功率大于12KW、具体取决于负载条件、重量为90磅+25磅链轮、现已拆除。 在斜升至60Hz 期间观察窗口中看到>250Nm 扭矩峰值的奇数。 SDK 未显示与使用 Delta 绕组预测的 FEM 相同的 ld/LQ 磁通、但如进一步说明所示似乎无关紧要。 FAST 必须对 RS 相位 L-L/3 (Δ/3)进行分频、但假定星形绕组(星形/2)? 昨天读取的 FAST 与定子绕组类型 Wye 或 Delta 不同、但在 user.h 中在何处设置定子类型、因此 SDK 考虑了 RS 值差异?  

    [引用用户="Yanming Lua"]我已经回答过您发布的许多线程、请确保电流和电压信号在您自己的电路板上感应良好、并根据采样电路在 user.h 中设置正确的 ADC 缩放值。

    更严重的问题是 SDK 没有通过指针 top user.c 将任何 user.h 电机参数传递到 labs.h -> typdef USER_Params、userParams。 请参阅通过 user.c 指针(pUserParams)加载的 user.h 用户值、但值在左侧的指针名称上丢失=符号。 因此 USER_SetParams (&userParms)从不会使用电感的起始值实例化 lab.h 值 setupControllers(),例如 motorVars.LS_d_H 或  motorVars.LS_q_H,并从知道在哪里(0.9999999e-7)的用户处加载奇值? 这种情况会发生(motorVars.flagEnableUserParams = true) 、并解释了我们为什么不能使用添加到 user.h 的 ID 值、 绕过电机 ID、并通过实际在线运行电机550Hz 的 ID 设置再次运行电机。 它仅在 ID 永远不会再次完成后在当前 CCS 调试会话中运行。 这是由于指针名称的不同、在设置控制器时不会链接。 如果确实发生这种情况、则说明为何会开始突然的电流尖峰状态 LC 测试。 也许指针参数稍后通过 FAST 进行设置、但这并不是很明显、并且不会解释稍后的 CCS 调试会话电机运行失败。

    请注意、计时器计数可能会溢出复合问题、从而通过快速运行电机 ID 正确识别电机。 当电机电流 user.h 设置为典型值但在中间某个位置强制更高_IA/Hz 速度 LC 测试故障时、会发生瞬时 OC 尖峰状态 LC。 由于较小的电机以极低的电流振动烧毁、因此 SDK 存在错误的软件问题。 TI 必须了解导致这些问题的原因以及用户参数丢失的原因。 由于指针未加载 pUserParams、状态 LC 未产生正确的电机电感、因此看起来电机振动状态在线过大。 我看不到在 SDK 3.0中调试报告问题的清单、下面这个似乎是破冰者。

    尚未 定义 INT_LEAST32_MAX 和 INT_LEAST16_MAX CCS 无法找到或可能是必须添加到项目中的符号?

    //! \brief 递增状态计数器
    //! \param[in]处理控制器(CTRL)处理
    静态内联 void CTRL_incrCounter_state (CTRL_Handle handle)
    {
    CTRL_Obj * obj =(CTRL_Obj *) handle;
    
    int_least32_t count = obj->counter_state;
    
    //递增计数
    count ++;
    
    //限制为0至 INT_LEAST32_MAX
    = INT_MAX (INT_MAX = 32)-INT_INT_MAX = INT_INT_INT_MAX = INT_INT_INT_INT_MAX = INT_INT_INT_MAX =
    {
    计数= 0;
    }
    
    //保存计数值
    obj->counter_state = count;
    
    return;
    }//结束 CTRL_incrCounter_state ()函数 
    //! \brief 递增速度计数器
    //! \param[in]处理控制器(CTRL)处理
    静态内联 void CTRL_incrCounter_speed (CTRL_Handle handle)
    {
    CTRL_Obj * obj =(CTRL_Obj *) handle;
    
    int_least16_t count = obj->counter_speed;
    
    //递增计数
    count ++;
    
    //限制为0至 INT_LEAST16_MAX
    = INT_LEAS16_INT 计数(INT_MAX = INT 1)
    {
    计数= 0;
    }
    
    //保存计数值
    obj->counter_speed = count;
    
    return;
    }//结束 CTRL_incrCounter_speed ()函数 

     

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

    pUserParms 中断的指针链接经常出现、不会产生 CCS 编译错误。 计算时、结构指针值似乎会丢失。   

    /*
    根据1999 C 标准中的脚注、"C++实现
    仅在
    之前定义了_STDC_LIMIT_MACRO 时才应定义这些宏 "。
    * 

    必须添加到工程中、以便状态计数不会过载、必须添加符号__STDC_LIMIT_MACRO

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

    [引用用户="Yanming Luo ]2. 已回复您发布的另一个主题。 即使启用了强制角标志、识别过程中也不会使用强制角标志、估算器将根据状态启用/禁用强制角功能。[/QUERP]

    与书面文本状态相矛盾的是、FAST 的低速观测器(<1Hz)需要它、可以检查最低速度 Hz、而 FAST 忽略慢速观测器在大于1Hz 的高速观测器期间保持启用状态。 在以下测试中、R/L 跳闸 FA 被禁用在 LOOP 或 mainINT()启动处理程序、R/L 设置150Hz 时启用任何点。

    我添加了最小速度限制定义(user.h)以控制强制角(FA)、但在斜升> 1Hz 后启用快速保留 FA、而不向启动处理程序添加代码 snip。 因此 FAST 不会像零速限值那样控制 FA、而是仅当在 R/L 150Hz 期间将跳过低于检查禁用 FA 时。 除非状态计数可能已过载、否则这是怎么可能的?

    因此、需要定义最小速度限值来禁用针对零 PI 速度的_IA 驱动电流、将 FAST 返回到低速观测器。 几篇论坛文章质疑 PI 零速加热电机和用手旋转轴为何开始滚到极高的扭矩下、请相信实验6电机控制套件。 零速限值最好添加到测试或其他代码区域下面、以便在任何时间零速发生时重新启用 FA。  

    //! \brief 定义 R/L 激励频率、Hz
    //!
    USER_R_OVER L_EXC_FREQ_Hz 150
    
    
    //! \brief 定义强制角频率、Hz
    //!
    #define USER_FORCE_ANGE_FREQ_Hz ((float32_t)(1.0))
    
    //! 简要说明如果磁通
    //! 频率降至零速阈值以下、1Hz
    #define USER_ZEROSPEEDLIMIT ((float32_t)(0.001 * USER_maximum_SCALE_FREQ_Hz)
    
    ) mainISR (void)
    
    {
    
    //~~~~~~~~~~~~~~~~ 启动处理程序
    
    //
    //运行空间矢量发生器(SVGEN)模块
    //
    SVGEN_run (svgenHandle、&VAB_OUT_V、&(pwmData.Vabc_pu));
    
    /*获取强制角标志状态*/
    //EST_getFlag_enableForceAngle (estHandle);
    
    /*检查转子速度>1Hz,禁用强制角*/
    if ((motorVars.speed_Hz > user_force_angle_FREQ_Hz)&&
    (motorVars.flagEnableForceAngle = true)
    {
    EST_setFlag_enableForceAngle (estHandle、false);
    //
    motorVars.flagEnableForceAngle = false;
    }
    
    } 

      

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

    我认为您添加的上述代码不有用,实际上 ,即使设置或未设置标志,EST_setFlag_enableForceAngle ()函数也将在识别过程中传递。 强制角将根据 FAST 估算器中的状态和运行速度自动启用和禁用、FAST 估算器中具有另一个用于执行此操作的内部标志。  

    抱歉、如果您未修改示例项目中的任何内容、我们几乎无法重复上述所有问题。 如果您仍有疑问、请提供有关示例实验中所做更改的更多详细信息。

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

    只是想检查一下您是否有任何更新,我在大约两周内没有听到您的声音,因此我假设您能够解决您的问题。 如果您有任何疑问、请告诉我。 如果没有任何其他问题、我们将关闭此主题。 谢谢。