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.

[参考译文] MSPM0G3507:SW 中的 MSPM0G3507 QEI 零索引检测

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1405638/mspm0g3507-mspm0g3507-qei-zero-index-detection-in-sw

器件型号:MSPM0G3507
主题中讨论的其他器件:SysConfig

工具与软件:

我需要知道何时会遇到 QEI 的 ABZ 输入的零(索引)脉冲。 我可以将 SysConfig 设置为在发生零事件时生成中断、但该中断可能在零脉冲或计数器计数为零时发生。  我需要知道我的伺服系统的绝对位置、一个伪零或不知道何时绝对确定零是一个显示停止。 我是否有方法可以将零脉冲与计数器=零条件隔离?

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

    当您进入中断时、您需要检查计数器是否为零。

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

    这并不能解决问题。 当中断发生时、计数器始终为零(或关闭、具体取决于为中断提供服务所需的时间)。 可能遇到也可能没有遇到零脉冲。 在我的原始帖子中记录中断的2个可能原因。

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

    为什么当计数器为零时出现零索引?

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

    你告诉我。 我看到的是、中断似乎在计时器计数器达到零时发生。 TRM 显示中断发生了归零事件。 它并未说明归零事件是零脉冲还是计数器值计数到零。 这似乎是两个。 不处于3线 QEI 模式时的归零事件是指计数器计数到零时。

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

    其目的是在旋钮上设置特定位置-知道"11"在吉他放大器上的位置-或者如果您确实将其用于索引、则使计数足够大、以便它永远不会自行环绕。 这样您就知道零计数就是零索引。

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

    尊敬的 Martin:

    在 QEI 3信号模式下、您可以拥有 IDX、它可以为计时器生成负载(设置为0或负载值)。 这将是零脉冲的第3个输入。 在初始状态下、您不知道您的位置位于 Keith 的点、使您的值始终与0交叉、除非通过零索引是有效的用例。

    此致、
    Luke

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

    可能我错过了该值、但我看到无法在启动时将计数器值预加载到某个值。 似乎从加载值或零开始、很难判断。 在这种情况下、加载值是计数器在递减到零时绕回或在递增到零时绕回的值。 因此、LOAD 值定义了位置测量中的位数。 如果我的表达式正确、那么最初无法使计数器的值远离零、因为加载值基本上为-1。 我通过将零脉冲绑定为高电平禁用了零脉冲、但仍然获得零事件中断、因此我关于在计数器经过零时获得中断的观察结果是正确的。

    注意: 在本例中、计数器为16位、并且我正在使用全部16位、因此不可能得到超出工作范围的值。 如果不能确定起始点、则无法保证在计数器由于无法检测到 SW 中的变化而不能足够接近零时会遇到零指数。 如果精确的绝对定位至关重要、那么即使是几位误差也可能很大。 因此我看不到该解决方案的 SW 解决方案。 当然、一旦遇到零脉冲、位置就正确、但不知道何时遇到零脉冲、系统就可能会锁定到错误的位置、认为它遇到了零指数。

    除了零索引输入之外、是否有办法"知道"零索引已经遇到并且没有将其连接到单独的 GPIO?

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

    您可以在初始化代码中始终执行如下操作:

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

    尊敬的 Martin:

    您可以写入计时器的 CCTR 寄存器并设置计数器值、然后启动计时器。 例如、如果您希望电机在全旋转中以3600增量递增、则可以将初始负载设置为7202、将计时器计数设置为3601。 这样、在您的初始条件下、在首次接收零脉冲之前、您不会意外进入负载或零。 然后、您可以使用影子加载来加载实际的3600加载值、并让零脉冲对计时器进行归零。

    其 driverlib 函数为 DL_Timer_setTimerCount (GPTIME_Regs * gptimer、uint32_t value);

    当然、这只是处理该问题的一种方法、您的特定系统可能需要进行不同的调整、或者您知道系统所需的更好限制。

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

    我要强调的一点是、我对16位计数器的完整范围进行计数。 我每转有65536个计数、因此没有未使用的值、因为它只是 TIMG 外设中的16位计数器。  

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

    我通过向 TIMG IDX 输入和一个 GPIO 提供索引脉冲来解决这个问题。 IDX 输入会清除计数器。 GPIO 产生中断、通知 SW 已遇到索引脉冲。 这将向 SW 发送信号、指示启动序列结束以强制位置超过零。

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

    很好的解决方案。 我同意,只是让索引脉冲重置计数器的作用是有限的,虽然有编码器在那里有它,*有人*必须使用它。