大家好,
我已使用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
文斯