尊敬的 TI:
在下一个命令开始并移动到下一个位置之前、我如何确保达到该位置并保持足够稳定。 这两条命令之间没有延迟、一旦到达位置、它将移动到下一个新位置、等等。
我尝试使用 SpinTAC.PosMoveStatus 来等待、直到它获得 ST_MOVE_IDLE、然后接收新命令并移动到新位置。 但它不起作用、电机将在完全达到最后一个目标之前移动到下一个位置。
我如何确保位置在移动到下一个新位置之前达到并保持足够稳定?
我可以使用任何 SPINTAC 标志还是其他方法?
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.
尊敬的 TI:
在下一个命令开始并移动到下一个位置之前、我如何确保达到该位置并保持足够稳定。 这两条命令之间没有延迟、一旦到达位置、它将移动到下一个新位置、等等。
我尝试使用 SpinTAC.PosMoveStatus 来等待、直到它获得 ST_MOVE_IDLE、然后接收新命令并移动到新位置。 但它不起作用、电机将在完全达到最后一个目标之前移动到下一个位置。
我如何确保位置在移动到下一个新位置之前达到并保持足够稳定?
我可以使用任何 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 还提供了一些实验、讨论如何加快启动速度。
查看有关配置 SpinTAC 位置移动的实验指南。 具体请查看实验13b。
系统配置的时间长度将取决于曲线类型以及系统配置发生器解释限制的方式。 默认的 ST-Curve 将始终慢于 S-Curve 和梯形轮廓。 此外、SpinTAC 位置移动基于约束、并且将始终使用比配置的实际最大速度、加速度和急动更慢的速度。
为了缩短稳定时间、您需要调整位置控制器(请参阅实验13a)。 您可能还需要调整系统配置设置(请参阅实验13b)
[引用用户="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 之前的反馈
}
我有点困惑、我应该在哪里提供速度和准确度都可以的反馈?
[引用 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、为什么它不溢出中断?
尊敬的 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)时,没有速度增量。