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.

[参考译文] TMS320F28069M-Q1:运动位置规划:以不同的速度修改计划似乎不符合要求

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003007/tms320f28069m-q1-motion-position-plan-modify-plan-with-different-speed-do-not-seem-to-comply

器件型号:TMS320F28069M-Q1

void RVP_setupPosPlan6Step_ModifyPlanVelocity(float Krpm)
{
    _iq   VelLim, AccLim, DecLim;
    _iq20   JrkLim;
    uint16_t FromState,ToState,AndOr,CondIdx1,CondIdx2;
    ST_Obj *stObj = (ST_Obj *) RVP_stHandle[5];
    STPOSPLAN_getCfgTran(stObj->posPlanHandle, 1, &FromState, &ToState, &AndOr, &CondIdx1, &CondIdx2, &VelLim, &AccLim, &DecLim, &JrkLim); // From StateB to StateC
    RVP_DisplayPosPlan(VelLim,AccLim,DecLim,JrkLim);
    VelLim = _IQ24(Krpm * ST_SPEED_PU_PER_KRPM);   // ST_SPEED_PU_PER_KRPM =0.1333
    STPOSPLAN_setCfgTran(stObj->posPlanHandle, 1, FromState, ToState, (ST_PlanCond_e) AndOr, CondIdx1, CondIdx2, VelLim, AccLim, DecLim, JrkLim);           // From StateB to StateC
    STPOSPLAN_getCfgTran(stObj->posPlanHandle, 1, &FromState, &ToState, &AndOr, &CondIdx1, &CondIdx2, &VelLim, &AccLim, &DecLim, &JrkLim);
    RVP_DisplayPosPlan(VelLim,AccLim,DecLim,JrkLim);
}

void RVP_DisplayPosPlan(_iq VelLim, _iq AccLim, _iq DecLim, _iq20 JrkLim)
{
    zprintf("Velim : %Q24\n",VelLim);
    zprintf("AccLim: %Q24\n",AccLim);
    zprintf("DecLim: %Q24\n",DecLim);
    zprintf("JrkLim: %Q20\n",JrkLim);
    zprintf("---------------------\n");
}

附加的代码、用于在启动前针对不同的速度参数修改 VeLim。 我尝试了不同的速度、但它不符合要求。 下面是终端快照,活动周期是完成计划所需的时间,应该有所不同(以及观察电机旋转情况).... 但它不在100rpm 到1000rpm 之间  

当我为每个调试闪存更改其中的 VelLim 并运行时、以下代码起作用。  

我已阅读《Instant Spin 用户指南》、但未找到原因。  

void RVP_setupPosPlan_Plan6_ValveZero(ST_Handle sthandle)
{
    _iq   velMax, accMax, jrkMax;                             // DWORD = 32 bit.
    _iq   velLim, accLim, decLim;
    _iq20 jrkLim;
    ST_Obj *stObj = (ST_Obj *)sthandle;
    memset(stPosPlanCfgArray_Plan6,0,sizeof(stPosPlanCfgArray_Plan6));
    // Pass the configuration array pointer into SpinTAC Position Plan
    STPOSPLAN_setCfgArray(stObj->posPlanHandle, &stPosPlanCfgArray_Plan6[0], sizeof(stPosPlanCfgArray_Plan6), 0, 0, 0, 4, 4);
    //----------------------------------------------------------------------------
    // Establish the Velocity, Acceleration, Deceleration, and Jerk Maximums
    //----------------------------------------------------------------------------
    velMax = _IQ24(2.5 * ST_SPEED_PU_PER_KRPM);  // 1000 RPM to PU number. = 0.333               // Limit:0.0 to +1.0
    accMax = _IQ24(17.0);                        // Max Accel, should this be 120, not 127?
    jrkMax = _IQ20(266.0);                       // Max Jerk
    //----------------------------------------------------------------------------
    velLim = _IQ24(0.05 * ST_SPEED_PU_PER_KRPM);   // ST_SPEED_PU_PER_KRPM =0.1333                                         // Limit:0.0 to 1.0
    accLim = _IQ24(17.0);                         //_IQ24(1.0 * ST_SPEED_PU_PER_KRPM);     17 is very max Accel for Q24   // Limit:0.001 to 120.0
    decLim = _IQ24(17.0);                         //_IQ24(1.0 * ST_SPEED_PU_PER_KRPM);                                    // Limit:0.001 to 120.0
    //----------------------------------------------------------------------------Jerk via ST_MOVE_CUR_STCRV
    jrkLim = _IQ20(266.0);                        // Max is 266 under ST_MOVE_CUR_STCRV only.                             // Limit:0.0005, 2000.0

    //gMotorVars.SpinTAC.PosMoveCurveType: See pobj->PosMoveCurveType[5] in RVP_MotorPlan.c
    STPOSPLAN_setCfg(stObj->posPlanHandle, _IQ(ST_SAMPLE_TIME), false);                       // Do not repeat Loop.
    STPOSPLAN_setCfgHaltState(stObj->posPlanHandle, 0, 0, velMax, accMax, jrkMax, 1000L);     // Configure halt state: PosStep[MRev], PosStepFrac[MRev], VelEnd, AccMax, JrkMax, Timer

    //Example: STPOSPLAN_addCfgState(handle,    PosStep[MRev], PosStepFrac[MRev], StateTimer[ticks]);
    STPOSPLAN_addCfgState(stObj->posPlanHandle, 0,              0,                  1L);   // StateIdx0: A
    STPOSPLAN_addCfgState(stObj->posPlanHandle, +6,             0,                  1L);   // StateIdx1: B      // This does nothing since it now controlled by STEP/FRAC code.
    STPOSPLAN_addCfgState(stObj->posPlanHandle, 0,              0,                  1L);   // StateIdx2: C

    //Example: STPOSPLAN_addCfgTran(handle,    FromState, ToState, CondOption, CondIdx1, CondiIdx2, VelLim[pups],            AccLim[pups2], DecLim[pups2], JrkLim[pups3]);
    // NOTE: The deceleration limit must be set between the following bounds [acceleration limit, 10*acceleration limit]

    STPOSPLAN_addCfgTran(stObj->posPlanHandle, 0,   1, ST_COND_NC, 0,        0,         velLim,      accLim,      decLim,      jrkLim);   // From StateA to StateB
    STPOSPLAN_addCfgTran(stObj->posPlanHandle, 1,   2, ST_COND_NC, 0,        0,         velLim,      accLim,      decLim,      jrkLim);   // From StateB to StateC
    STPOSPLAN_addCfgTran(stObj->posPlanHandle, 2,   0, ST_COND_NC, 0,        0,         velLim,      accLim,      decLim,      jrkLim);   // From StateD to StateA
}

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

    在哪里调用了两个函数? 应在启动期间或电机停止时设置运动计划。

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

    我找到了第三条路、但没有停止电机!/  

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

    如果有任何疑问、请随时了解。