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:使 FAST 估算器与 SpinTAC 节拍异步?

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596556/tms320f28069m-making-the-fast-estimator-asynchronous-with-the-spintac-tick

器件型号:TMS320F28069M

您好!

InstaSPIN 用户指南(SPRUHJ1G)介绍了抽取 FAST 估算器(和其他组件)以减少 CPU 总体使用率的技术。  

对于在10kHz 或20kHz 下使用 PWM 和 CTRL 进行原型设计、我希望避免 FAST 估算器在 SpinTAC 轨迹更新期间运行(示例中的 ISR_TICKS_PER_SPINTAC_TICK)。  例如、可通过将 USER_NUM_CTRL_TICKS_PER_EST_TICK 设置为2来完成此操作。

当这两个速率是异步的(速度更新处于关闭时间以实现快速)时、中断时序是完美的。  但是、根据 UC 启动状态、在轨迹更新时间同步运行时运行。  是否有建议的或基于 API 的方法来避免这种情况并强制两者异步?

谢谢、

--会的

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

    FAST 估算器在每个 ISR 周期中执行、因此您需要一个两倍的 PWM ISR 频率以实现快速执行频率、如下所示。
    在 user.h 中将 USER_NUM_PWM_TICKS_PER_ISR_TICK 和 USER_NUM_ISR_TICKS_PER_CTRL_TICK 设置为1、USER_NUM_CTRL_TICKS_PER_CURRENT_TICK 和 USER_NUM_CTRL_TICKS_PER_EST_TICK 设置为2
    2.添加标志变量以增加并在 ISR 中检查它、在标志为0时快速调用、在标志为1时调用 SpinTAC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 MotorWare17中、使用(1)中的配置、似乎已将估算器抽取到每隔一个周期、而不像(2)中那样添加一个标志。

    估算器似乎在内部保持状态。 具体而言、我可以看到 ISR 的控制部分在交替 ISR 之间取~13us (90MIPS 时)的差值。 作为参考、我将 lab13b 视为起点。 我缺少什么吗?

    我注意到、如果我在"正确"的时间拨打两个电话、在设置 est.h 计数时可能会很有用、但不知道使用哪一个电话、并希望得到确认:
    EST_resetCounter_Ctrl (EST_Handle handle);
    EST_resetCounter_state (EST_Handle handle);

    谢谢、

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

    您好、Yanming、

    以下代码似乎起作用;即在以下代码中(1 = stCnt)、FAST 估算器是异步的、而对于(0 = stCnt)、FAST 估算器是同步的。  Patch is vs proj_lab13b.c、bMakeFast估算 器异步初始化为 true。

    您能否确认这是一种合适的方法?  我更愿意更早地同步计数器、但在估算器稳定之前、我似乎遇到了问题。

    谢谢、

    --会的

    if (USER_MOTOR_TYPE = MOTOR_Type_Induction){

      //更新滑动模块的电角

      SLIT_setElectronicAngle (slipHandle、ENC_getElecAngle (encHandle));

      //计算转差量

      SLIT_RUN (滑板);

     

     

      //运行控制器

      CTRL_run (ctrlHandle、halHandle、&gAdcData、&gPwmData、slick_getMagnetiticAngle (slipHandle));

    否则

          if (bMakeFast估算 器异步&&(1= stCnt))

          {

              //控制器是否准备好同步?

              if (CTRL_getState (ctrlHandle)=CTRL_State_OnLine)

              {

               CTRL_Obj * obj =(CTRL_Obj *) ctrlHandle;

     

               //估算器是否准备好同步?

               if (EST_isOnLine (obj->estHandle))

               {

                      EST_resetCounter_Ctrl (obj->estHandle);

                      //EST_resetCounter_state (obj->estHandle);

                      bMakeFast估算 器异步= false;

               }

              }

          }

     

      //运行控制器

      CTRL_run (ctrlHandle、halHandle、&gAdcData、&gPwmData、ENC_getElecAngle (encHandle));

     

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

    William、

    您的示例代码似乎合理。

    我可能建议修改 CTRL_run 接口和代码、以便您控制从 mainISR 执行 FAST 的时间(即、如果 CTRL_run 也应该快速运行、则在 bool 中传递)。  这将使您能够准确地控制哪些 ISR 应该快速调用、并且可以轻松地对其进行管理、以便仅在调用估算器时调用 SpinTAC Suite。

    我认为您可以使用 stCnt % 2作为信号来控制是否应该调用 FAST、因为当 stCnt >= 10时(通常情况下)是调用 SpinTAC Suite 时。

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

    Adam、

    感谢您的回复、很抱歉耽误您的时间。

    EST_run()似乎保持其自身的状态计数器,我无法通过 API 访问该计数器,因此,简单地调用它的频率较低将不会获得所需的结果。 我可以在这里想到两种方法,但似乎都不是很令人满意。 我缺少什么吗?

    方法1.

    修改 CTRL_run 以调用 EST_run 每一次(stCnt % 2)两次。

    缺点:

    似乎 EST_run 即使在运行速度不快的情况下也会执行大量工作、我担心从"每个 CTRL ISR"周期中删除任何底层功能的影响。 我还担心在快速运行的"长"ISR 中添加2us 会产生什么影响。

    方法2.

    修改 CTRL_run 以每隔一次调用 EST_run (stCnt %2)、但设置 USER_NUM_CTRL_TICKS_PER_EST_TICK = 1。 确定需要修改的其它内容...

    缺点:

    EST 的初始化程序(CTRL_setEstParams)采用整个 gUserParams 结构、其中包含许多与上述常量相关的成员。 我不确定其他 EST_*呼叫将中断。  USER_setParams 中有许多值和检查依赖于需要调整的常量--我不确定哪些值和检查可以工作,因为它们仅在调用 EST_run 时使用,哪些需要更改。

    此外、我还必须在 ctrlQEP.h 中修补 CTRL_angleDelayComp

    提前感谢您的任何想法。

    --会的