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.

[参考译文] DRV8899-Q1EVM:在使用具有 SPI 命令的外部 MCU 控制步进电机运行时出现问题

Guru**** 2473260 points
Other Parts Discussed in Thread: DRV8899-Q1EVM

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1253982/drv8899-q1evm-issue-while-controlling-the-stepper-motor-operation-using-an-external-mcu-with-spi-commands

器件型号:DRV8899-Q1EVM

您好、TI 团队:

我一直使用 DRV8899-Q1EVM 套件来驱动步进电机。 我曾尝试使用 TI 提供的 GUI 来操作步进电机、现在运转正常。 我能够通过向电机驱动器发送 SPI 命令来操作电机。 但主要的一点是、我想使用外部 MCU 操作该电机驱动器、因此我移除了所有板载电阻器(R3、4、6、7、9 11、12、14、15、16、 17)、它将电机驱动器与板载 TI MCU 连接。 现在、我已经连接了自己的 MCU 器件、并将以下引脚连接到了接头(3.3V、VREF=2.0V、nSCS、VSD=3.3V、SDO=MISO、 SDI= SI、SCK、DRVOFF 和 nSLEEP 及 GND)。

我的 MCU 充当 SPI 主器件、并向电机驱动器提供驱动步进电机的命令。

使用驱动程序执行 SPI 操作时应遵循的步骤:
DRVOFF 为高电平。 500ms 延迟。 nSLEEP 为高电平。 500ms 延迟。 nSLEEP 为低电平。 500ms 延迟。 nSLEEP 为高电平。 500ms 延迟。 DRVOFF 为低电平。 500ms 延迟。
2.使电机单步旋转(在此步进电机情况下为18度)。 我正在发送0x0A 和0xFA (用于 CTRL3寄存器)(一次发送1个字节、因为该 MCU 的 SPI 缓冲区为8位)。

现在的问题是、电机没有旋转、电机在5s 内被加热了很多。 电流消耗高达500mA。 但电机没有运动。 我只想使电机单步移动(18度)、因此针对 CTRL3 reg 的单个 SPI 命令并为 SPI_STEP 设置位6将使电机单步移动。

但无论如何、电机都无法旋转。

我们将始终跟踪传入的数据类型。 我每次都会得到0xC000。 板载故障 LED 从不点亮为高电平、这表示没有故障。SDO 值显示0xC0有故障和 SPI 错误。

为了参考 SPI 信号、我将从 MCU 传输的 SPI 信号连接到电机驱动器。



图片中不是 nSCS 引脚、但当 SCLK 变为高电平时、nSCS 引脚在 nSCS 引脚为低电平之前、并且当 nSCS 变为高电平时、SCLK 引脚为低电平。

请帮我解决这个问题。

谢谢。
卡纳·维韦克   

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

    您好!

    感谢您的提问。 我们的专家将在一两天内向您提供反馈。

    此致

    森田真也

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

    您好、Vivek、

    感谢您在此论坛中发帖。 您提到了"板载故障 LED 从未置于高电平"。 请参阅原理图中的以下片段。 3.3V_MCU 在您进行测试时是否可用? 该电源仅在连接 USB 时存在。 否则、即使出现故障、nFAULT LED 也不会亮起。 此外、对于该开漏引脚、还需要一个上拉电阻、EVM 上的该上拉电阻为 R18、如片段中所示。

    接下来、您提到"我已经连接了我自己的 MCU 器件、并将以下引脚连接到了接头(3.3V、VREF=2.0V、nSCS、VSD=3.3V、SDO=MISO、 SDI= SI、SCK、DRVOFF 和 nSLEEP 及 GND)。" 这是有效的设置。 VREF = 2V、假设 CTRL1寄存器中的 TRQ_DAC 为默认值、则输出 IFS (满量程电流)设置为2/2.2 = 0.909A。 当器件处于唤醒状态且启用 DRVOFF 时、两个绕组将以71%的 IFS 通电、请参阅表7-3 "电流值"行以了解45度。 这将是 A 相和 B 相上的645mA。 让步进器以此电流通电肯定会使步进绕组升温。 在此状态下、电机将具有保持扭矩、转子将是刚性转子。

    您说:

    "使用驱动程序执行 SPI 操作时遵循的步骤:
    DRVOFF 为高电平。 500ms 延迟。 nSLEEP 为高电平。 500ms 延迟。 nSLEEP 为低电平。 500ms 延迟。 nSLEEP 为高电平。 500ms 延迟。 DRVOFF 为低电平。 500ms 延迟"。

    你为什么必须执行该序列。 当 nSLEEP 为低电平时、器件将处于睡眠状态。 当 nSLEEP 为低电平时、DRVOFF 不会对输出产生任何影响。 第一步应该是唤醒器件。 因为此 nSLEEP 必须设置为高电平、并等待 tWAKE 时间(大约1ms -请参阅数据表规格)。 仅在唤醒后才能与器件进行 SPI 通信、否则器件将不会响应。 要启用输出、现在可以将 DRVOFF 驱动为逻辑低电平。 此时、使用默认寄存器值、电机将像前面所说的那样为两个绕组通电。

    " 使电机单步旋转(在该步进电机情况下为18度)。 我正在发送0x0A 和0xFA (用于 CTRL3寄存器)(一次发送1个字节、因为此 MCU 的 SPI 缓冲区为8位)。

    您可以一次发送一个字节、但在两个字节都已发送之前、nSCS 引脚不得变为高电平。 请参阅数据表的第40页。  

    0x0A 和0xFA 不是正确的顺序。 看起来您使用的是1/256 uSteps、这意味着步进电机不会移动1步、移动1/256步/要使用全步进模式进行单步移动。 CTRL3地址为0x05。 使用以下序列以一个完整步进移动电机:

    1.通过 nSLEEP =高电平唤醒器件。 等待1ms。 现在、该器件已为 SPI 通信做好准备。

    2.通过设置 DRVOFF = LOW 启用输出。  

    3. nSCS =相对于其默认高电平值的低电平。 发送两个字节0x05 (CTRL3)和0x30以将初始 STEP 和 DIR SPI 输入设置为低电平。 nSCS =高电平以完成寄存器设置。

    4. nSCS =相对于其默认高电平值的低电平。  然后发送两个字节 0x05 (CTRL3)和0x70以将 STEP SPI 输入设置为高电平并将 DIR SPI 输入设置为低电平。  nSCS =高电平以完成寄存器设置。

    3.然后再次发送序列#3。

    现在、电机应该已经移动了一个整步、您的电机应该移动了18度。 现在、您可以通过设置 DRVOFF = HIGH 来禁用输出。 否则、如果长时间保持通电、电机将变得很热。

    此致、Murugavel

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

    您好 Murugavel:

    非常感谢您提供此类信息。

    这实际上对我通过 SPI 接口进行的驱动程序通信有一些问题。

    但是、我们发送给电机驱动器以旋转电机的数据字节发生了细微变化。

    由于 CTRL3寄存器地址为0x05、所以我们不应该在下面的地址中发送0x0A。


    由于 A0=1、A1=0、A2=1、因此 A1字节的结果是0x0A 而不是0x05、因为 B8是0。

    但无论如何、我都使用了0x0A 和0x30、以及再次使用了0x0A 和0x70发送到电机驱动器来驱动电机。

    但是、为了微调电机、我想在微步进模式下驱动电机。 为此、我将 CTRL3寄存器的值更改为0x3A、发送 SPI=0低电平脉冲;0x7A、发送 SPI=1脉冲。 因此、在发送256个时间(即这些数据字节(0x0A、0x3A 和0x0A、0x7A)之后、电机确实平滑旋转到18度、这是电机的1步长、但在此之后、电机不旋转。 电机似乎失速了。

    您能否帮助配置该电机驱动器以在微步进模式下使用?

    您能帮助获取任何参考手册吗?获取我可以获取任何应用手册来针对微步进模式进行电机转速、扭矩等计算。

    谢谢。
    卡纳·维韦克

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

    您好、Vivek、

    我明白了。 您在电子邮件中编写了最终的汇编值。 因此、对于 W0 = 0的第一个字节、0x05地址写入将是0x0A (向左旋转一个位置)。 您是对的。 SPI 传输序列应该为0x0A、0x30和0x0A、0x70。

    "但是、为了微调电机、我想在微步进模式下驱动电机。 为此、我将 CTRL3寄存器的值更改为0x3A、发送 SPI=0低电平脉冲;0x7A、发送 SPI=1脉冲。 因此、在发送256个时间、即这些数据字节(0x0A、0x3A 和0x0A、0x7A)之后、电机确实平滑旋转到18度、这是电机的1步长。" 这是使用256 uSteps 运行的正确方法。

    但之后、电机不在旋转。 电机似乎失速了。"。 这不应该发生。 您能否通过设置 DRVOFF = LOW 来验证输出是否已启用。 如果提供连续步进脉冲、电机将在 DRVOFF = LOW 时间内持续旋转、同时 DIS_OUT 必须为零且器件处于唤醒状态。   

    "您能否帮助获取任何参考手册获取我可以获取任何应用手册以针对微步进模式进行电机转速、转矩等计算。" 电机转速与扭矩间的关系取决于电机的类型、通常由步进电机制造商提供。 一个全步进输入(微步进数 x 微步进输入)将使电机移动一步。 通常、步进电机规格是角度/步进。 在本例中、步进为18度。 因此、旋转一周360/18 = 20个全步进或阶跃输入端需要等效微步进脉冲。 假定您正在256 uSteps 下运行并且您希望每秒旋转一圈、那么步进输入频率应该为256 x 20个每秒脉冲或者5120个每秒脉冲= 5.12kHz。 我希望这有助于为所需的目标速度计算所需的输入步进频率。

    此致、Murugavel