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.

[参考译文] DRV8704:SPI代码示例

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/620828/drv8704-spi-code-sample

部件号:DRV8704
主题中讨论的其他部件: DRV8703-Q1MSP430F2617DRV8711MSP430G2553ENERGIA
您好,  
我们的团队打造了一辆电动汽车,以参加壳牌生态马拉松比赛。 作为法规的一部分,我们还需要设计自己的电机控制器。 我们决定使用DRV8704驱动程序。 我们设计了自己的PCB,现在必须  使用SPI控件对其操作进行编程。  
但是,我们通过Arduino连接到此控制器时遇到了许多错误。 我附上了我们目前使用的代码的.ino文件。 我们不能让芯片做出任何反应。 我们正在考虑切换到TI MSP430微处理器。 您知道我们如何对其进行编程吗? 您会推荐什么/  
您是否会有一个用于drv8704芯片的示例SPI代码供我们参考? 或者您可以帮助我们调试当前 代码。  
非常感谢,  
-Rice电动车队  

/*

*电机SPI接口
*
*此代码控制DRV8704电机驱动器。 DRV8704与SPI兼容,要发出命令,您需要发送
* 12个数据位和1个读/写位。
*
*电路
*- SCLK:至SCK (ICSP-3)或数字引脚13
*- SDATI:MOSI (ICSP-4)或数字针11
*-公务员事务局局长:10.
*- SDATO:Miso (ICSP-1)或数字引脚12
*
*由Irene Zhang于2017年3月31日创建
*/

//包括SPI库
#include <SPI.h>

//用于连接芯片的引脚
//其他引脚将由SPI库控制
//const int SS = 10;


//DRV8704的注册地址:
//const int CTRL = 0x00;
//const int扭矩= 0x01;
//const int off = 0x02;
//const int blank = 0x03;
//Const int R衰减= 0x04;
//const int drive = 0x06;
//const int status = 0x07;



//****配置电机驱动器的设置**///
void setup()
//将SS引脚设置为输出
pinMode (SS,输出);
SPI.begin();
}

void控件(int reg,int value){
DigitalWrite (SS,低);
SPI.transfer (reg);
SPI.transfer (值);
DigitalWrite (SS,高);
}


void ReadData (int reg){
内部值;
Val = digitalRead (12);
serial.println (val);
}

void loop(){
控制(0,1);
控制(9,1);
控制(8,1);
控制(11,0);
控制(10,0);
}

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

    您是否尝试读取具有已知默认值的寄存器(例如0x02,默认值为0x130)?
    您是否将SPI事务与数据表中的图16和17进行了比较?
    您确定SCS是正确的吗? 代码显示SS在交易期间较低,但设备需要较高。

    MSP430F2617用于控制类似的器件DRV8711。 其他器件(如MSP430G2553)已用于控制DRV8703-Q1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不,我们没有做这些事情。 我们将再次尝试使用TI MSP430微处理器,并进行您建议的更改。  

    您建议使用什么IDE? Energia会起作用吗? 是否有与之关联的SPI库?  

    谢谢!  

    -Manuel  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外:快速提问,门控驾驶员提到数据表中的几个应用,如ATM机器,办公室自动化机器,工厂自动化和机器人以及纺织机器。 但我们看不到在数据表中指定的汽车驾驶意义上的电机控制。

    这位门控是否仍能发挥我们控制汽车速度的功能? 是否可以将输入踏板信号传输到微控制器,并使用此驱动器控制电机的速度?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jose,

    我没有使用Energia,所以我不能评论。 应该有一个可用的库。 只需确保SCS极性和数据/时钟极性与数据表匹配即可。

    此外:快速提问,门控驾驶员提到数据表中的几个应用,如ATM机器,办公室自动化机器,工厂自动化和机器人以及纺织机器。 但我们看不到在数据表中指定的汽车驾驶意义上的电机控制。

    这位门控是否仍能发挥我们控制汽车速度的功能? 是否可以将输入踏板信号传输到微控制器,并使用此驱动器控制电机的速度?

    是的,此应用程序也可以工作。 DRV8704 EVM使用555计时器有效地完成了此操作。 使用ADC读取电压并将其转换为PWM占空比可以通过微实现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦,太棒了! drv8704栅极驱动器中包含555计时器,对吧? 这不是我们需要单独添加的内容?  

    非常感谢您的帮助! 我已经编写了一份守则草案。 一旦洪水消退 ,我可以回到学校,我将立即测试并向您通报最新情况。  

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

    555计时器不在DRV8704内;它在DRV8704EVM上。 如果您需要555计时器,则应单独添加。 您可以使用MCU的PWM而不是555计时器。

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

    嗨,Rick,  

    所以我们再次尝试了SPI控件。 我们尝试读取一个已知寄存器(OFF,0x02),但没有得到响应。 当我们尝试读取已知的默认地址时,我们始终只收到0作为输出。  

    我们使用Energia编程环境和MSP432微控制器。  

    那么我们使用MSB格式发送数据对吗? 不是LSB?  

    您知道我们的代码或SPI接口可能存在什么问题吗?  

    /*这是用于控制DRV8704栅极驱动器的SPI代码。
    */

    //包括SPI库:
    #include <SPI.h>;
    Const int ChipSelectPin = 40;//(连接时更新实际的芯片选择引脚)//WFP 2.7
    //注意:所有其他引脚(Miso,MOSI和CLK)都将由SPI引脚控制。
    //检查您的微控制器数据表以确保哪些数据表可以到达任何位置。

    //让我们编程一些注册地址! -详细指南可在DRV8704数据表的第20页中找到。 请查一下!
    Const int CTRL = B000;//启用/禁用电机,ISENSE放大器增益设置,停机时间设置
    锥入扭矩= B001;//为两个H形电桥设置满刻度输出电流
    const int off = B010;//设置固定关闭时间(PWM的衰减时间?) 如果您增加/减少此值会发生什么情况?
    Const int blank = B011;//设置当前断路消隐时间。 这是监控电流的时间量?
    保质衰减= B100;//混合衰减过渡时间和慢速/快速衰减配置。
    //0x05已保留
    const int drive = B110;//控制OCP阈值,OCP去毛刺时间,门-接收器时间门驱动源itime,峰值接收器和源电流
    Const int status = B111;//告诉您任何错误/问题-过热,过电流,驱动器前故障。

    void setup(){
    PinMode (ChipSelectPin,输出);//将SCS设置为输出。 因此,当我们想要访问此芯片时,我们将输出高电压。
    Serial.begin(9600);//开始串行通信,波特率为9600。 这将使我们能够打印并查看正在发生的情况。
    SPI.begin();//我想这只是开始SPI协议。
    SPI.setBitOrder(MSBFIRST);//setting与大多数SIG位的顺序。位优先。
    //问题:我们的MSB是第一?
    }
    void loop(){

    字节数据= ReadData (status);//从Off寄存器读取数据。 这应该将0x130输出为默认值。
    serial.println (数据,bin);
    延迟(100);

    }

    字节读取数据(字节注册){//输入寄存器,这将从该寄存器读取数据。
    SPI.setDataMode(SPI_MODE0);//时钟极性为0 (低时时钟处于空闲状态),时钟相位设置为0 (使用下降边缘移动数据)
    //问题:时钟极性是0还是1? 我不知道。
    DigitalWrite (ChipSelectPin,高);//将高电平写入芯片选择引脚以启用它
    //问题:哪一个优先? 是否启用时钟或选择针脚至高?
    Byte ReadData = SPI.transfer (B1000 + reg,bin);//我们需要传输地址的1后跟3位。 我们如何做到这一点?
    延迟(100);
    DigitalWrite (ChipSelectPin,低);//禁用PIN
    返回ReadData;
    }

    最佳,  

    -Manuel  

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

    请在范围内捕获交易,并将其与数据表进行比较。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,好主意。 装有SPI读数的高质量示波器的大楼目前被水淹没,直到下周二才关闭。  

    一旦打开,我们将尝试此操作。 但与此同时,我们已经订购了一个数字电位计,我们将尝试使用SPI控件进行编程以进行实践。  

    最佳,  

    -Manuel  

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

    你好。 我有同样的问题。 无miso信号,无论MOSI是什么。 例如,读取寄存器2:

    我使用DRV8704EVM。

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

    您是否对EVM进行了任何修改? 如果是,您做了什么?
    尝试读取miso时,睡眠模式下的DRV8704是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不,我们没有进行任何修改。 当我们尝试SPI协议时,通常会拔下连接到板的其余引脚。  

    将其从睡眠模式中取出是一个很好的主意! 我从未注意到这一点。  

    否则,如果我们向门驱动器的某些引脚发送PWM信号,我们是否可以控制电机的速度,而无需使用SPI接口配置任何设置? 如果可能,我们的团队希望在不担心SPI接口的情况下,立即开始测试电机。  

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

    "否则,如果我们将PWM信号发送到闸极驱动器的某些引脚,我们是否可以控制电机的速度,而无需使用SPI接口配置任何设置? 如果可能,我们的团队希望在不担心SPI接口的情况下,立即开始测试电机。 "

    是的,设备已启用,并将在nSLEEPn设置为逻辑高电平且复位设置为逻辑低电平时响应PWM输入。 您可能无法获得所需的电流,因为默认增益和扭矩设置可能不适合您的马达。

    建议为应用程序设置SPI寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    未对EVM进行修改。 EVM由11.1 V电池供电。 绿色状态LED亮起,红色故障LED熄灭。 我将4根电线连接到MSU (teensy 3.2):SCS,SCLK,SDATO作为Miso,SDATI作为MOSI,并将3.3V直接连接到nSLEEP。 由于电机工作正常,主板未处于休眠模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Priba,

    SPI事务是否仍存在问题?
    建议尝试读取具有已知数据的寄存器。
    MSU和EVM之间是否有通用GND?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道。 有一个共同的基础。 我尝试读取寄存器0,1和2,但没有任何miso活动。 我检查了时间限制,没有发现任何问题。 事实上,我最初开发了基于DRV8704的PCB,但不能使用SPI,因此我购买了一个EVM。 我想我做错了事,但找不到什么。 我可以向您发送板和连接的图片。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Priba,

    请发送照片。 谢谢。

    此外,请提供4个SPI信号的范围捕获。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Priba,

    此外,您能否提供SPI读写的函数定义。

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

    分析器:

    同一照射行程的范围:

    相同但不同的时间范围:

    Arduino代码:

    #include <SPI.h>
    #define SS_PIN 10.

    void setup()

    PinMode (SS_PIN,输出);
    Serial.begin(11.52万);

    SPI.begin();
    DigitalWrite (SS_PIN,低);

    字节数据[]={0b1010万,0b0万};

    SPI.beginTransaction(SPISettings(100万,MSBFIRST,SPI_MODE0);
    DigitalWrite (SS_PIN,高);
    SPI.transfer (数据,2);
    DigitalWrite (SS_PIN,低);
    SPI.endTransaction();

    serial.println ("读取:");
    serial.print (data[0],2);
    serial.print("");
    serial.println (data[1],2);

    SPI.End();
    }

    void loop(){}

    董事会:

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

    感谢您的图片和示波器捕获。 您能否确认J12-Pin1浮动? 它应连接至3.3V。

    将J12-Pin1连接到3.3V将提供SDO所需的电压。 作为漏极开路输出,需要外部上拉电阻器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确认。 是的,这就是问题所在! 现在我获得了正确的注册内容2:

    感谢你的帮助。 TI提供出色的产品文档和支持。

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