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.

[参考译文] TMS320F28054M:在下一个命令开始并移动到下一个位置之前、如何确保达到该位置并保持足够稳定

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/588380/tms320f28054m-how-can-i-make-sure-the-position-is-reached-and-stable-enough-before-the-next-command-kicks-in-and-move-to-next-position

器件型号:TMS320F28054M

尊敬的 TI:

在下一个命令开始并移动到下一个位置之前、我如何确保达到该位置并保持足够稳定。 这两条命令之间没有延迟、一旦到达位置、它将移动到下一个新位置、等等。

我尝试使用 SpinTAC.PosMoveStatus 来等待、直到它获得 ST_MOVE_IDLE、然后接收新命令并移动到新位置。 但它不起作用、电机将在完全达到最后一个目标之前移动到下一个位置。

我如何确保位置在移动到下一个新位置之前达到并保持足够稳定?

我可以使用任何 SPINTAC 标志还是其他方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正在使用我建议的标志。 可能值得做的一件事是运行单个运动、以评估电机在运动后的趋稳程度。 您甚至可以花费一些精力来修改运动设置或控制设置、从而使其更快地趋稳。 我认为您的下一个最佳选择是查看 SpinTAC 位置控制中的位置误差信息、并且在低于阈值之前不触发下一个移动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

     感谢你的答复。  我确实在 void ST_runPosMove (ST_Handle handle)中添加了一个标志、以确保在尝试转到下一个位置点之前完成移动。

     如果不 添加状态标志、所有位置都会因未完成的位置移动而变得混乱。 我还添加了到达新位置时的位置误差要求。

    我的代码如下所示:在  void ST_runPosMove (ST_Handle handle)中移动 ISR 后  

    STPOSMOVE_run (stObj->posscieHandle);
    
    if (STPOSMOVE_getStatus (stPOBj->posscieHandle)=ST_MOVE_IDLE)&&(gMotorVars.RunPositionProfile == false){
    
    if (Flag_MoveDONE =1 &= 1 & stPOLIDE0&dobj
    
    
    
    
    
    
    );toseMPOST_MOVmIdle = 0.5 (stPOLICDspr-0.5);tobj (gPOST_MOVmIdle = 0);tobtobj (gPOST_MOVmIdle = 0);tobj (gPOST_MOVmIdle)(gPOST_MOVmWTOPMOVmW0_MOVPOST_MOVPOST_MOVITL = 0);tionIdle = 0 (gPOST_MOVPOST_MOVPOST_MOVIT_MOVIT_MOVIT_MOVIT_MOVIT_MOVIT_MOVITL =
    //针对超出最大位置错误 Flag_MoveDone
    = 0发送返回6;
    }
    
    
    if (Flag_MoveDone = 1 && fabs (STPOSCTL_getPositionError_mrev (stObj->posCtlHandle))>_IQ (0.5)//&(STOBJ SMOVE_getPositionError_mrev (stObj->posCtlHandle)))>超出
    
    最大位置时钟的情况发送6;//将 STOBJ_MODE_MODEL (stHandle =
    6)
    
    

    问题1:我是否在上述代码上犯了任何明显的错误? 它可以正常工作、但我不确定。 我想确保在转至下一个位置之前它达到0.5 - 0.1 Mrev 位置误差范围内。

    Q2:正如您提到的、缩短稳定时间、您是否更具体、因为我不确定应该修改哪一部分代码。

    Q3:通常在 Lab13c 中、初始化 Rs 值并在启动时重新计算 Rs 值需要10秒。

    如果我想将启动时间缩短到2-3秒、并在长时间移动(电机可能会发热)期间保持高位置精度、我应该怎么做?  

    我的想法:在电机启动期间禁用 Rs 重校准并打开 RsOnline?

    感谢你的帮助!

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

    [引述用户="Qiang Guo]Q1:我是否在上述代码上犯了明显的错误? 它可以正常工作、但我不确定。 我想确保它在转至下一个位置之前达到0.5 - 0.1 Mrev 位置错误。

    您的代码看起来合理、但跳出来的一件事是您的位置差测试似乎允许出现非常大的误差(0.5机械旋转)。

    [引用用户="Qiang Guo]Q2:正如您提到的、缩短稳定时间、您是否更具体、因为我不确定应该修改哪一部分代码。

    您需要修改轨迹设置并调整控制器、以帮助缩短稳定时间。  它不是像系统配置那样的代码修改。

    [引用用户="Qiang Guo"]

    Q3:通常在 Lab13c 中、初始化 Rs 值并在启动时重新计算 Rs 值需要10秒。

    如果我想将启动时间缩短到2-3秒、并在长时间移动(电机可能会发热)期间保持高位置精度、我应该怎么做?  

    [/报价]

    在实验13c 中、我们使用 Rs 重校准来校准编码器和电机。  如果您在没有其他对齐编码器和电机的方法的情况下禁用此功能、则实验将不起作用。  您可以修改软件、以便减少 Rs 重校准例程中的时间。  TI 还提供了一些实验、讨论如何加快启动速度。

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

    我检查了 traj.c 和.h 文件、但没有看到要使用的任何变量。 我可能会误解您的解释。

    我与我的原始 PID 控制器和 FOC-MOTION 控制器进行了比较。

    在所有轴上的同一加速度和垂直度下。
    在 X、Y 和 Z 运动的组合中、我的旧 PID 控制器每秒能够实现13.4次接触
    FOC-运动控制器每秒只能实现11.5次接触

    X、Y 和 Z 的总速度比我们的旧 PID 控制器慢15%。
    我不确定原因、但我猜"稳定时间"在这里可以发挥非常重要的作用、因此我尝试缩短稳定时间、以提高整体速度。 你有什么建议吗?

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

    查看有关配置 SpinTAC 位置移动的实验指南。  具体请查看实验13b。

    系统配置的时间长度将取决于曲线类型以及系统配置发生器解释限制的方式。  默认的 ST-Curve 将始终慢于 S-Curve 和梯形轮廓。  此外、SpinTAC 位置移动基于约束、并且将始终使用比配置的实际最大速度、加速度和急动更慢的速度。

    为了缩短稳定时间、您需要调整位置控制器(请参阅实验13a)。  您可能还需要调整系统配置设置(请参阅实验13b)

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

    在实验13a 中、它主要讨论调优带宽、我将带宽设置为100、这是我可以为电机设置的最佳值、任何高于100的值都不会更好。 带宽= 100、可以将我的电机位置保持在足够小的零。

    在实验13b 中、我仅使用陷波曲线、这是最快的。

    因此、车削带宽和使用陷波曲线无助于提高总速度、从每秒11.5次触点(FOC-MOTION 控制器)提高到每秒13.4次触点(我的旧 PID 控制器)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Qiang Guo"]在实验13b 中,我只使用陷阱曲线,它是最快的。

    您还可以调整运动限制(速度、加速度和减速)、以尝试提高整体速度。  由于您使用的是陷波曲线急动、因此不适用。

    [引用用户="Qiang Guo"]将整体速度从每秒11.5次联系(FOC-MOTION 控制器)提高到每秒13.4次以上[/引用]

    我猜是运动系统配置不相同、您是否尝试过在 SpinTAC 控制器中使用旧的运动系统配置?

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

    尊敬的 Adam:

     我担心编码问题不是 FOC 本身、它速度较慢、我对以下移动函数的理解有问题

    void ST_runPosMove (ST_Handle handle)

    如果我将反馈放在 STPOSMOVE_run (stObj->posMoveHandle)之后;

    我可以获得非常准确的结果、但速度较慢(11.5次触点/秒)(我的旧 PID 控制器每秒13.5次触点)

    如下所示:

    void ST_runPosMove (ST_Handle handle)
    {
    ST_Obj * stObj =(ST_Obj *) handle;
    HAL_Obj * obj =(HAL_Obj *) halHandle;
    
    //运行 SpinTAC 位置配置文件生成器
    //如果我们没有运行配置文件,并且命令指示我们应该已修改
    if ((STPOSMOVE_getStatus (stopj->poseHandle)== ST_MOVE_IDLE)&&(gMotorVars.RunPositionProfile == true){
    //获取针对
    StopeTAC 的配置;stopsv_MoveMotorVars.steps=Steps=veSpintrads.stops=vstops=vstops=vstops=vstops.stops=vstopsstops=vstops=vstops=v_stopsvstops=vstops=trans.stops.stopsstopsstops&trans.stopsstops=tramp.stvstv_stopsstops=trans.
    
    STPOSMOVE_setVelocityLimit (stObj->posMoveHandle、_IQmpy (gMotorVars.MaxVel_KRPM、_IQ (ST_SPEED_pu_per_krpm)));
    STPOSMOVE_setAccelerationLimit (stObj->posMotorHandle、gMotorVars.Maxpmps);
    STPOSMOVE_setDecelerationLimitit (stObj->posMoveHandle、gMotorVars.MaxDecel_krpmps);
    STPOSMOVE_setJerkLimitit (stObj->PosMotorVars.MaxJrk_krpmp2);
    //启用 PosMoveHandle
    
    
    
    =/PoseVR0>StPOVR0_PoseMotorVars
    
    
    
    ;STOP0>PosMoveVR0_Position_Position_StPOR = SpinTAC;STOP0>VtoreVR_VR_VR0>StPOSMOVtoreM0_VR_VR_MOVtoreVR_POR = VR_POR = VR_MOVtoreMOVtoreVR_MOVtoreVR_MOVtoreMOVtoreVR_MOVtionS;
    
    // ISR 后的反馈
    
    if ((STPOSMOVE_getStatus (stPOSMOVE->posMoveHandle)=ST_MOVE_IDLE)&& Flag_DiffereDone =1){
    
    if (STPOSCTL_getPositionError_mrev (stObj->MovCtlHandle))<_Difference <_Difference (STPOSCTL
    
    
    
    
    
    
    = 0);{>0.095 (POST_POST_POR = 0);POR = 0 (POR = 0);POR = 1);POR = 0 (POR = 0);POR = 0 (POR = 0);POR = 0 (POR = 0);POR = 0 (POR = 0),POR = 0 (POR = 0),POR = 0 (POR = 0),POR = 0 (POR = 0),POR = 0 (POR = 1),POR (POR = 0),0
    
    
    
    
    
    

    但如果我将反馈放在 STPOSMOVE_run (stObj->posMoveHandle)之前;

    我可以获得更快的速度、每秒15.5次触点、但这也会导致精度问题。

    void ST_runPosMove (ST_Handle handle)
    {
    ST_Obj * stObj =(ST_Obj *) handle;
    HAL_Obj * obj =(HAL_Obj *) halHandle;
    
    //运行 SpinTAC 位置配置文件生成器
    //如果我们没有运行配置文件,并且命令指示我们应该已修改
    if ((STPOSMOVE_getStatus (stopj->poseHandle)== ST_MOVE_IDLE)&&(gMotorVars.RunPositionProfile == true){
    //获取针对
    StopeTAC 的配置;stopsv_MoveMotorVars.steps=Steps=veSpintrads.stops=vstops=vstops=vstops=vstops.stops=vstopsstops=vstops=vstops=v_stopsvstops=vstops=trans.stops.stopsstopsstops&trans.stopsstops=tramp.stvstv_stopsstops=trans.
    
    STPOSMOVE_setVelocityLimit (stObj->posMoveHandle、_IQmpy (gMotorVars.MaxVel_KRPM、_IQ (ST_SPEED_pu_per_krpm)));
    STPOSMOVE_setAccelerationLimit (stObj->posMotorHandle、gMotorVars.Maxpmps);
    STPOSMOVE_setDecelerationLimitit (stObj->posMoveHandle、gMotorVars.MaxDecel_krprev);
    STPOSMOVE_set0.0kLimit (stObj->fabeHandle、gMotorVars.MaxJrk_krpmp2);
    // Enable the Spintrabs-
    
    
    
    
    
    
    
    
    
    
    
    
    (stposeVR0=>StPOSTPOST_MOVTOP0=veStPOST_MOVTOS=veStPOST_POST_POST_MOVTOP0=veVRs=veVRs=veVR=&= gPOSTPOSTPOSTPOSTPOST_POST_POST_POST_MOVTOP=TOP0=TOP0=TOP0=TOP0=TOP0=TOS=veVRs.POST_POSTPOST_POST_MOVPOST_POST_MOVPOST_POSTPOST_POSTPOST_POST_POST_POST_POST_POST_POSTOPPE
    
    
    
    
    
    //if (gMotorVars.positionDifference >_IQ (0.095)){
    //SCI_putDataLocking (obj->sciHandle、6);
    //Flag_MoveDone = 0;
    //}
    
    }}STPOSMOVE_run
    
    (stObj->MovposeHandle);// ISR 之前的反馈 

    我有点困惑、我应该在哪里提供速度和准确度都可以的反馈?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    移动代码导致性能不同的唯一原因是、这可能是执行时间问题。

    在查看您的代码时、我不知道为什么您使用 fabs 而不是 abs、因为这些变量是整数。

    函数 SCI_putDataBlocking 是否还会等待数据传输、然后再继续?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Adam:

    位置误差是 IQ 变量而非整数、这就是我使用晶圆制造厂的原因
    一旦移动完成并且在误差范围内、SCI_putDataBlocking "0"以告知"F28055"达到目标位置。 然后、F28055将向 F28054M 发送一个新位置以移动到新位置。
    SCI_putDataBlocking 应等待直到达到目标位置
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Qiang Guo"]位置错误是 IQ 变量而不是整数,因此我使用了 fabs[/quot]

    IQ 变量是浮点数的整数表示。  在这种情况下、您应该使用 ABS。

    [引用用户="Qiang Guo]SCI_putDataLocking 应等待到达目标位置

    但是、处理器是否在 SCI_putDataBlocking 函数内等待、直到 SCI 资源可用于发送数据?  这是否会导致中断可能溢出?

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

    尊敬的 Adam:

     我认为您的位置对了、我检查 了 putDataBlocking 的功能、如下所示:

    void SCI_putDataBlocking (SCI_Handle sciHandle、uint16_t data)
    {
    SCI_Obj * sci =(SCI_Obj *) sciHandle;
    
    while (SCI_txReady (sciHandle)!= true)
    {
    }
    
    //写入数据
    sci->SCITXBUF = data;
    
    return;
    }//结束 SCI_putDataBhlock()函数 

    如果中断超限、如何解决这个问题?

    如果在移动 ISR 之前 putDataBlock、为什么它不溢出中断?

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

    [引用用户="Qiang Guo"]如果中断超时,如何解决这个问题?

    理想情况下、您的通信应在电机控制 ISR 之外进行处理。  也许可以在后台循环中调用 SCI 函数并从 ISR 中提供一个标志。

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

    尊敬的 Adam:
    它不起作用、我就像您在上面说的那样。 它具有相同的速度结果、每秒11.5次触点  这不是 SCI 的问题。
    我进行了其他测试、其中(STPOSMOVE_getStatus (stObj->posMoveHandle)=ST_MOVE_IDLE)&& STPOSCTL_getPositionError_mrev (stObj->posCtlHandle)<_IQ (0.195)延迟了大部分时间。 如果我将 Iq (0.195)降低到 Iq (0.005)、则会导致更多时间、并使最终速度降至每秒8.8次触点 但增大超过 IQ (0.195)时,没有速度增量。