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.

[参考译文] DRV8244S-Q1LEVM:使用 Arduino 进行 SPI 控制

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1296796/drv8244s-q1levm-spi-control-using-arduino

器件型号:DRV8244S-Q1LEVM

您好、我在设置电路板时需要支持。 我已经使用 Arduino 引脚连接了评估板。

GND - GND

引脚13 - SCLK

引脚12 - SDO

引脚11 - SDI

引脚10 - nSCS

寄存器映射如下所示:

您可以分享 Arduino 代码示例来驱动电机吗? 谢谢。

-安盖特

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

    嗨、Ankit、

    有关驱动器控制的基本步骤、请参阅器件数据表:  https://www.ti.com/lit/ds/symlink/drv8244-q1.pdf 、该工具应能帮助您旋转电机。

    很遗憾、除了 DRV824X_DRV814XQ1EVM 软件之外、我们没有任何此器件的示例代码。  我们还没有针对此部件的 Arduino 库、它是如此之新、我认为任何其他公司都没有为其构建库。  你可以看看是否有任何其他公司已经为它做了一个库,如 Pololu、Adafruit、SparkFun 等,或者建立你自己的库类似 另一个库.

    您可能希望改用此器件的硬件版本、请参阅 https://www.ti.com/tool/DRV8244H-Q1EVM。  

    此致!

    雅各布  

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

    您好 Jacob、感谢您分享数据表。 这有助于理解寄存器映射。 使用该信息、我尝试写入寄存器值、但失败了。

    我的代码如下所示

    没有故障、但寄存器的值为什么不变化? 谢谢。

    -安盖特

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

    嗨、Ankit、

    在您的 transfer16函数中,您需要将数字类型设置为二进制。  你编写它的方式是、尝试传输1,000,000、010,000个数字。  将 B 放在它前面、按照本教程将其更改为二进制: 如何在 Arduino 中写入二进制和十六进制数。   

    您是否可以使用 Saleae 逻辑分析仪 或示波器或任何其他方式来验证您的命令是否正确发送?

    我还认为 SPI_MODE 需要为 SPI_MODE1。  您应该在初始化后立即将 CS 引脚设置为高电平、以便对于事务、它将转至 LOW-TRANSACTION-HIGH、我在代码中看到它是不确定的事务-高电平。   

    此致!

    雅各布

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

    您好、Jacob:

    我已根据上述意见更新了脚本。 我的信号在示波器上看起来像这样、

    黄色- SCLK

    蓝色- SDI

    粉色- SDO

    绿色- SCS

    连接如下所示

    如果信号看起来良好、那么寄存器更新的顺序是什么? 我正在更新  

    1) 1)命令寄存器0x08写入值0x10 (用于启用 SPI)  

    延迟1毫秒

    2) 2) SPI 寄存器0x09到值0x06 (驱动正向)

    我们需要将值设置为任何其他寄存器还是将其余寄存器保留为默认值? 谢谢。

    -安盖特

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

    嗨、Ankit、

    请参阅以下/随附代码、我已经使用 DRV8244S-Q1EVM 对其进行了测试。   e2e.ti.com/.../DRV8244S_2D00_Q1_2D00_Arduino_2D00_SPI.ino

    我将所有引脚从 EVM 跳至 Arduino Uno、但 IPROPI 引脚除外。  确保使用 J4接头的右侧(驱动器侧)、因为左侧连接到 EVM 微控制器而不是驱动器。  

    #include <SPI.h>
    
    // SPI Protocol
    #define SPI_ADDRESS_MASK   0x3F00        // Mask for SPI register address bits
    #define SPI_ADDRESS_POS    8             // Position for SPI register address bits
    #define SPI_DATA_MASK      0x00FF        // Mask for SPI register data bits
    #define SPI_DATA_POS       0             // Position for SPI register data bits
    #define SPI_RW_BIT_MASK    0x4000        // Mask for SPI register read write indication bit
    
    // Arduino CLK = PIN 13
    // Arduino SDI (MISO) = PIN 12
    // Arduino SDO (MOSI) = PIN 11
    #define CS_PIN 10
    #define NSLEEP_PIN 9
    #define NFAULT_PIN 8
    #define IN2_PIN 6                     
    #define IN1_PIN 7
    #define DRVOFF_PIN 5
    
    // Brushed DC Motor Connected between OUT1 and OUT2 on DRV8244S-Q1EVM
    // All jumpers on J4 removed except IPROPI
    
    void setup() {
      pinMode(NSLEEP_PIN, OUTPUT);  digitalWrite(NSLEEP_PIN,  1);
      pinMode(CS_PIN, OUTPUT);      digitalWrite(CS_PIN, 1);
      pinMode(IN2_PIN, OUTPUT);     digitalWrite(IN2_PIN, 0);
      pinMode(IN1_PIN, OUTPUT);     digitalWrite(IN1_PIN, 0);
      pinMode(NFAULT_PIN, OUTPUT);  digitalWrite(NFAULT_PIN, 0);
      pinMode(DRVOFF_PIN, OUTPUT);  digitalWrite(DRVOFF_PIN, 0);
    
      delay(5);
    
      SPI.begin();         // initialize the SPI library
      SPI.setDataMode(SPI_MODE1);
    
      write8(0x08, 0b10000000); // Send CLR_FLT command
      delay(5);
    
      // Enter PWM Mode
      write8(0x0C, 0b01000011); // set S_MODE = 0b11 for PWM mode
      digitalWrite(DRVOFF_PIN, 0);
    
    }
    
    void loop() {
    
      // Accelerate
      for (int i = 0; i < 255; i++)
      {
        analogWrite(IN2_PIN, i);
        delay(2);
      }
      delay(1000);
    
      // Decelerate
      for (int i = 255; i >0; i--)
      {
        analogWrite(IN2_PIN, i);
        delay(2);
      }
      delay(500);
    
    }
    
    void write8(uint8_t reg, uint8_t value) {
    
      // This SPI function is used to write the set device configurations and operating
      // parameters of the device.
      // Register format |R/W|A5|A4|A3|A2|A1|A0|*|D7|D6|D5|D4|D3|D2|D1|D0|
      // Ax is address bit, Dx is data bits and R/W is read write bit.
      // For write R/W bit should 0.
    
      volatile uint16_t reg_value = 0; // Variable for the combined register and data info
      reg_value |= ((reg << SPI_ADDRESS_POS) & SPI_ADDRESS_MASK);         // Adding register address value
      reg_value |= ((value << SPI_DATA_POS) & SPI_DATA_MASK);             // Adding data value
    
      digitalWrite(CS_PIN, LOW);
    
      SPI.transfer((uint8_t)((reg_value>>8) & 0xFF));
      SPI.transfer((uint8_t)(reg_value & 0xFF));
    
      digitalWrite(CS_PIN, HIGH);
    }
    

    我的代码使用这行 PWM 控制模式:

    此致!

    雅各布

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

    您好、Jacob:  

    感谢您的分享。 "我现在就知道了。" 我连接了接头错误一侧的引脚。 它可能值得在用户指南中进行说明。 我有几个跟进问题。

    1)在使用 SPI 时我们可以使用 GUI 来监视寄存器吗? 我在艰难地将电路板连接到云 GUI。 是否应该遵循某些步骤? (例如连接几个0欧姆的寄存器以便 USB 连接工作?)  
    2)我看到您使用数字引脚传递 IN1和 IN2信号,我们可以使用 SPI 和寄存器映射控制它们吗? 这样我们就不需要2个额外的导线连接。

    3)如何读取电桥电流?

    此致、
    -安盖特

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

    嘿、Ankit、好一点、我要努力使它更新!  

    1)我们可以在使用 SPI 时使用 GUI 来监视寄存器吗? 我在艰难地将电路板连接到云 GUI。 是否应该遵循某些步骤? (例如连接几个0欧姆的寄存器以便 USB 连接工作?)  [/报价]

    通常不需要、只要从器件读取 GUI、您就必须将 Arduino 侧引脚设置为高阻抗(Hi-Z)(将它们设置为输入)、并且必须将 SPI 跳线放置回 EVM 上。  用于连接器件的 EVM 代码的一部分将读取一些 SPI 寄存器、因此、如果未连接 SPI 引脚的 EVM 跳线、将无法连接到 GUI。

    我过去使用的一种权变措施是使 EVM 达到您需要使用 GUI 的状态、然后从"Register Map"页面保存/写下寄存器地址+值。  使用 Arduino 代码只需将所有这些值写入器件。  例如、 将地址和值直接写入 Arduino。  

    2)我看到您使用数字引脚传递 IN1和 IN2信号,我们可以使用 SPI 和寄存器映射来控制它们吗? 这样我们就不需要2个额外的线连接。

    是的、情况就是这样。  唯一的限制是很难使用 SPI 控制来实现 PWM -您可以这样做、但您的频率将受到发送 SPI 命令以切换该位的速度和一致性的限制。  

    3)如何读取电桥电流?

    将 IPROPI 引脚连接到微控制器上的模拟输入引脚。  请注意、您需要仍然连接 R_IPROPI 电阻器、因此我建议保留 J4上用于 IPROPI 的分流跳线、只需将一根导线连接到跳线上来检测它。   

    此致!

    雅各布

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

    您好

    我们可以通过 SPI 获得桥接电流吗? 想法是在2个板之间仅建立 SPI 连接。  DRV8244S-Q1EVM 是否能够做到这一点? 我在任何寄存器位上都看不到 IPROPI。

    此致、  

    安盖特

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

    嗨、Ankit、

    很遗憾、并非如此、此器件的 SPI 寄存器中没有 IPROPI。   

    此致!

    雅各布

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

    您好、Jacob:

    IPROPI 引脚的映射是什么? 如何根据模拟电压知道电桥电流? 谢谢。

    此致、  

    V·安基特

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

    嗨、Ankit、

    请参阅 器件数据表中的8.3.3.2 IPROPI:

    AIPROPI 为4570或4750、具体取决于封装:

    因此、如果驱动器以1A (I_hs + I_LS = 1A)的速度运行、则 IPROPI = 1A/4750A/A = (1/4750) A。

    然后使用您在 EVM 上选择的 IPROPI 电阻器-假设它位于1kΩ。  IPROPI*(1/4750) A = 1000Ω 引脚上的0.210V V =。  

    此致!

    雅各布