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.

[参考译文] DRV2667 -电压升压不工作

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/602022/drv2667---voltage-boost-does-not-work

主题中讨论的其他部件:DRV2667

大家好,

我已使用DRV2667和标准组件(接近DRV2667数据表中推荐的组件)构建了触觉驱动程序。 但是,尽管我可以写入和读取寄存器,但我看不到输出的任何增强(使用Fluke万用表测量输出Vrms和频率),我也看不到SW引脚的任何切换。 我认为寄存器编程是正确的,因为我总是打印与命令Isend匹配的寄存器内容。 我使用电源工作台电源(电流限制1A)以5V的电压为设备供电,而为了控制它,我使用Arduino Uno。 下面是我使用的代码:

#include <Wire.h> //包含I2C通信协议#define

device_address 0x59的库 //I2C通信的DRV2667地址
#define register00_address 0x00 //00控制寄存器地址
#define register01_address 0x01 //01控制寄存器地址
#define register02_address 0x02 //02控制寄存器地址
#define default_register00 0x02 //寄存器0x00的默认值
#define default_register01 0x38 //寄存器0x01的默认值
#define default_register02 0x40 //寄存器0x02

void setup()的默认值{

int bytes_return; //从读取操作

字节current_register01返回的字节数= default_register01; //这些变量存储设置程序
字节CURRENT_register02 = DEFAULT_register02;

字节波形序列发生器[2]之后的控制寄存器的值; //波形序列发生
器字节波形数据的波形标识符[11]; //要上载到RAM

Wire.begin();的波形数据 //开始I2C通信协议
Serial.begin(9600); //启动用于监控
Serial.println ("开始")的串行协议;

//重置设备,使寄存器达到默认值,并且设备处于低功耗模式
writeSingleByte (register02_address,default_register02 | 0x80); //在控制寄存器0x02中设置RST位(位7)

//配置增益,信号源(数字或模拟),超时期限,并在波形序列器
current_register02 = current_register02 &(~0x40)中上传波形标识符; //寄存器0x02 (待机位)
写入中的清除位6 SingleByte (register02_address,current_register02); //将设备设置为活动状态,准备接收信号

current_register01 = current_register01 | 0x01; //在寄存器0x01中设置位0 (增益位[1:0])
writeSingleByte (register01_address,current_register01); //选择了数字信号源(INPUT_MUX位2已清除),放大器增益设置为50V/100Vpp (增益位设置为01)

波段序列发生器[0]= 0x01; 波形序列发生器中的//#ID-1 (WAVEFORM1设置为1)
波段序列发生器[1]= 0x00; //终止回放序列(WAVEFORM1寄存器设置为0)
writeMultipleBytes (0x03,wavformSequencer,sizeof (wavformSequencer));//在波形序列中上载波形标识符,进行多次写入操作(从寄存器0x03开始)

//在RAM
formData[0]= 0x01中上载波形; //将RAM设置为第一页
波段Data[1]= 0x05; //标题大小值。 包含格式为Nx5 (N个已存储的效果数)
的波形标题大小。wavformData[2]=0x80; //起始地址高位字节。 模式设置为波形合成器(设置位7),RAM设置为页面1 (已清除PAGE_NUMBER[2:0])
波段数据[3]= 0x06; //起始地址下位。 RAM页面中的地址设置为0x06 (报头大小+报头(5字节)=6)
wavformData[4]=0x00; //停止地址高位字节。 RAM设置为第1页(已清除PAGE_NUMBER[2:0])
wavformData[5]= 0x09; //停止地址低位字节。 波形合成器只需要4个字节->(起始地址低位字节+4)-1 = 0x09
waveformData[6]= 0x00; //重复计数字节。 5次重复
的波段数据[7]= 0xCC; //振幅字节:峰值电压=(振幅字节/255)*全峰值电压(由增益位设置)。 此处设置为40V半峰
波段Data[8]= 0x0D; //频率字节:frequency (Hz)= 7.8125 * frequency_byte。 此处设置为ca 100Hz (101.6)
波段Data[9]= 0x01; //持续时间:duration (ms)=(1000xcycles_byte)(7.8125 * frequency_byte)。 此处设置为大约10毫秒(仅一个周期)
波段数据[10]= 0x00; //信封字节。 此处设置为无信封
写MultipleBytes (0xFF,wavformData,sizeof (wavformData)); //在具有多次写入操作的RAM中上传波形(从寄存器0xFF开始)



//播放
current_register02 = current_register02 | 0x01; //寄存器0x02中的设置位0 (执行位)
writeSingleByte (register02_address,current_register02); //执行

延迟(1万);
current_register02 = current_register02 &(~0x01); //清除寄存器0x02中的位0 (GO位)
writeSingleByte (register02_address,current_register02); //停止
current_register02 = current_register02 | 0x40; //在寄存器0x02 (待机位)
写入中设置位6 SingleByte (register02_address,current_register02); //将设备设置为低功耗模式状态



}

void loop()
{
}//I2C

单字节写入(包括监控)
void writeSingleByte (字节_register,字节_value){
Serial.print("sent command:");
Serial.println(_value, bin);
Wire.beginTransmission(device_address);
Wire.write(_register);
wire.write(_value);
int _status = Wire.endTransmission (); //如果
(_status ==0)为{,则表示成功通信的状态(0=成功,1,2,3,4=失败)
serial.println("successed");
}其它{
serial.println (“失败”);
}//Monitor


Wire.beginTransmission(device_address);
Wire.write(_register);
Wire.endTransmission (false);
Wire.requestFrom (device_address, 1);
while (Wire.Available ()){
byte _control = Wire.read();
serial.print ("Register 0x");
serial.print (_register,hex);
serial.print("设置为");
serial.println(_control, bin);
serial.println(");
}//I2C


多字节写入(包括监控)
void writeMultipleBytes (字节_registerStart,字节_value[],int _bytesNumber){
Wire.beginTransmission(device_address);
Wire.write(_registerStart);
用于(int i =0;i <_bytesNumber;i+){
wire.write(_value[i]);
}
int _status = Wire.endTransition(); //如果
(_status ==0)为{,则表示成功通信的状态(0=成功,1,2,3,4=失败)
serial.println("successed");
}其它{
serial.println("failed");
}

//监视器
int j =0;
字节_control[_BytesNumber+1];
Wire.beginTransmission(device_address);
Wire.write (_registerStart);
Wire.endTransmission (false);
int _BytesReturned = Wire.requestFrom (device_address,_BytesNumber);
while (Wire.Available ()){
_control[j]= Wire.read();
j++;
}
用于(int i=0;i<_bytesNumber;i++){
serial.print ("register 0x"的命令);
serial.print (_registerStart+I,hex);
serial.print("为");
serial.println (_value[i],bin);
serial.print ("Register 0x");
serial.print (_registerStart+I,hex);
serial.print("设置为");
serial.println (_control[i],bin);
serial.println(");}

}


非常感谢你们的帮助:D

文斯

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

    欢迎来到E2E,感谢您对我们产品的关注。
    我的一位同事将很快回复,提供更多信息。

    此致
    Jos é Luis Figueroa
    应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Vincenzo,

    如果您确定设备已退出待机模式,则不会出现代码/编程问题。 您写0x01注册0x02似乎是为了处理待机位。
    FB针脚上的电压是多少?
    您能否发布您的示意图和布局以供查看? 如果您希望通过电子邮件将其发送给我,我可以通过电子邮件与您联系。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的帮助。 我测量了FB引脚与GND的对比,只读60 mV。 请在下面找到主板的示意图

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

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

    SDA和SCL引脚是否已切换? 当我看到COM时,它在左边显示SDA,但它连接到SCL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我已经意识到了这一点。 我切换了引脚并对drv2667进行了编程。 您是否在原理图中看到任何其他问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我花了一分钟时间才找到这个问题,但是电源板是否连接到印刷电路板上的接地/散热垫? 根据数据表的10.1 部分,电源垫下方是否有通电孔?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我检查了代码,似乎有一些误解,请参考我修改的代码。

    #include <Wire.h>                                  //包含I2C通信协议库

    #define device_address 0x59                        //DRV2667 address for I2C communication
    #define register00_address 0x00                    //00控制寄存器地址
    #define register01_address 0x01                    //01控制寄存器地址
    #define register02_address 0x02                    //02控制寄存器地址                      
    #define default_register00 0x02                    //寄存器0x00的默认值
    #define default_register01 0x38                    //寄存器0x01的默认值
    #define default_register02 0x40                    //寄存器0x02的默认值

    void setup(){

     int bytes_return;                                //从读取操作返回的字节数

     byte current_register01 = default_register01;    //这些变量在设置过程后存储控制寄存器的值
     byte current_register02 = default_register02;

     字节波形序列发生器[2];                       //波形序列发生器的波形标识符
     字节波形数据[11];                           //要上载到RAM中的波形数据

     Wire.begin();                                    //start I2C通信协议
     Serial.begin(9600);                              //start用于监视的串行协议
     serial.println ("开始");

     //重置设备,使寄存器处于默认值,并且设备处于低功耗模式
     writeSingleByte (register02_address, 0x80);//重置设备
     msDelay (5)//延迟5 ms
     
     //配置增益,信号源(数字或模拟),超时时段并在波形序列发生器中上传波形标识符
     current_register02 = current_register02 &(~0x40);                       //清除寄存器0x02中的位6 (待机位)
     writeSingleByte (register02_address,current_register02);                //将设备设置为活动状态,准备接收信号
     mdelay(1); //延迟1ms
     
     current_register01 = current_register01 | 0x01;                          //在寄存器0x01中设置位0 (增益位[1:0])
     writeSingleByte (register01_address,current_register01);                //选定数字信号源(INPUT_MUX位2已清除),放大器增益设置为50V/100Vpp (增益位设置为01)

     波                                             形序列发生器[0]= 0x01;//#ID-1 (WAVEFORM1设置为1)
     波段序列发生器[1]= 0x00;                                            //终止播放序列(WAVEFORM1寄存器设置为0)
     writeMultipleBytes (0x03,波段序列发生器,sizeof (波段序列发生器)); //使用多写操作在波形序列发生器中上载波形标识符(从寄存器0x03开始)

      WriteSingleByte (0xFF,0x01);
     WaveformData[0]= 0x05; //header size-1
     WaveformData[1]= 0x00;
     WaveformData[2]= 0x86;
     WaveformData[3]= 0x00;
     WaveformData[4]=0x09;
     WaveformData[5]= 0x05;
     WaveformData[6]= 0xcc;
     WaveformData[7]= 0x0d;
     WaveformData[8]= 0x01;
     WaveformData[9]= 0x00;
     writeMultipleBytes (0x00,wavformData,10);  
     
     //播放
     current_register02 = current_register02 | 0x01;                          //在寄存器0x02中设置位0 (Go位)
     writeSingleByte (register02_address,current_register02);                //go

     迟延(1万);
     current_register02 = current_register02 &(~0x01);                       //清除寄存器0x02中的位0 (GO位)
     writeSingleByte (register02_address,current_register02);                //停止
     current_register02 = current_register02 | 0x40;                          //在寄存器0x02中设置位6 (待机位)
     writeSingleByte (register02_address,current_register02);                //将设备设置为低功耗模式状态
     
    }

    void循环()

    }

    //I2C单字节写入(包括监控)
    void writeSingleByte (byte _register,byte _value){
     serial.print("sent command:");
     serial.println (_value,bin);
     Wire.beginTransmission(device_address);
     wire.write(_register);
     wire.write(_value);
     INT _STATUS = Wire.endTransmission ();            //成功通信的状态(0=成功,1,2,3,4=失败)
     如果(_status ==0){
       serial.println ("成功");
     }其他{
       serial.println ("失败");
     }

     //监视器
     Wire.beginTransmission(device_address);
     wire.write(_register);
     wire.endTransmission (假);
     wire.requestFrom (device_address,1);
     而(Wire.Available ()){
       byte _control = Wire.read();
       serial.print ("Register 0x");
       serial.print (_register,hex);
       serial.print("设置为");
       serial.println(_control, bin);
       serial.println("");
     }
    }

    //I2C多字节写入(包括监控)
    void writeMultipleBytes (byte _registerStart,byte _value[],int _bytesNumber){
     Wire.beginTransmission(device_address);
     wire.write (_registerStart);
     对于(int i = 0;i <_bytesNumber;I++){
       wire.write(_value[i]);
     }
     INT _STATUS = Wire.endTransmission ();            //成功通信的状态(0=成功,1,2,3,4=失败)
     如果(_status ==0){
       serial.println ("成功");
     }其他{
       serial.println ("失败");
     }
     
     //监视器
     int j =0;
     byte _control[_bytesNumber+1];
     Wire.beginTransmission(device_address);
     wire.write (_registerStart);
     wire.endTransmission (假);
     int _bytesReturned = Wire.requestFrom (device_address,_BytesNumber);
     而(Wire.Available ()){
       _control[j]= Wire.read();
       J++;
     }
     对于(int i=0;i<_bytesNumber;i++){
       serial.print ("register 0x"的命令);
       serial.print (_registerStart+I,hex);
       serial.print("为");
       serial.println (_value[i],bin);
       serial.print ("Register 0x");
       serial.print (_registerStart+I,hex);
       serial.print("设置为");
       serial.println (_control[i],bin);
       serial.println("");
     }
    }

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

    您好,Kelly,

    其实我没有热垫,暴露出来的热垫是浮动的。 您认为这可能会导致问题吗? 我可能忽略了数据表中的特定部分。 暴露的垫必须连接至GND?

    谢谢

    文斯

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

    Peter Li的代码是否有帮助? 我正在与设计师确认如果不将该垫接地会有什么后果。
    我的建议是尽量将一根细线滑入芯片下面并将电极片接地。 但是,您可能仍然存在过热问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kelly,

    我尝试实施Peter建议的代码,但没有多少运气(对于原始代码,只添加了几个延迟)。 我尝试将散热垫接地,看看我得到了什么。

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

    我与设计师进行了确认,当焊盘未接地时,零件仍应通电。 驱动负载时,您可能仍会遇到过热问题。 此时,我将尝试更换IC。 您是否有多个可以测试的主板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Vince:

    这不仅仅是一些延迟。

    对于如何对芯片内RAM进行编程存在一些误解。

    我也修改了这一部分。

    请查看该更改并参考DRV2667数据表中的类似内容。

    谢谢。