弘毅 发表于 2011-12-5 21:01:44

lw0616 发表于 2011-12-5 20:58 static/image/common/back.gif
你好,刚刚学习arduino,请问下面的代码中,向ADXL发送Register_X0、Register_X1,以及下面的if条件是什么意 ...

这个具体意思不明,是按照产品说明手册(datasheet)进行编写的,具体这几行命令对应的寄存器怎样的意义。还是需要翻看datasheet。

帖子附件就是datasheet

nomady 发表于 2011-12-14 11:24:33

弘毅 发表于 2011-8-28 17:02 static/image/common/back.gif
根据产品手册描述,256输出数值代表1g,500多的数值代表加速度为2g左右。

今天刚刚搞清楚这个问题,为什么是256

要把传感器的度数转化为标准的g需要知道当前传感器设置的量程和最小刻度(分辨率),试验中ADXL345应该是采用16g量程(最大测量正负16g加速度)13位分辨率,就是说输出范围是2的13次方(8192),那么单位输出对应的加速度大小应该为32/8192 = 1/256,所以要把传感器度数转换为g需要除以256

nomady 发表于 2011-12-14 11:28:35

freeplus 发表于 2011-11-21 02:17 static/image/common/back.gif
楼主有没有测试过读取一组加速度数值总共需要多少时间啊?
我用的是非Arduino系统,但是传感器用的是ADXL3 ...

我用arduino读取每秒钟可以读取1000组以上

プ汏坏疍 发表于 2011-12-16 10:56:02

弘老师,请教一下,我前两天买的一个ADXL345,板子上面只有三个电容和一个ADXL345。引脚跟你的电路图一模一样。手头只有一个LCD按键(LCD1602 KEYPAD V2.0模块)的板,电路板是买来的时候设置好的了,做不了弘老师的液晶部分,所以自己改了一下程序希望通过串口显示,代码如下:#include <Wire.h>//调用arduino自带的I2C库
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37

int ADXAddress = 0xA7>>1;//转换为7位地址
int reading = 0;
int val = 0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;

void setup()

{
Serial.begin(9600);
Wire.begin();//初始化I2C
delay(100);
Wire.beginTransmission(ADXAddress);
Wire.send(Register_2D);
Wire.send(8);
Wire.endTransmission();
}

void loop()

{
Wire.beginTransmission(ADXAddress);
Wire.send(Register_X0);
Wire.send(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
    X0 = Wire.receive();
    X1 = Wire.receive();
    X1 = X1<<8;
    X_out = X0+X1;
}

Wire.beginTransmission(ADXAddress);
Wire.send(Register_Y0);
Wire.send(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
    Y0 = Wire.receive();
    Y1 = Wire.receive();
    Y1 = Y1<<8;
    Y_out = Y0+Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.send(Register_Z0);
Wire.send(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
    Z0 = Wire.receive();
    Z1 = Wire.receive();
    Z1 = Z1<<8;
    Z_out = Z0+Z1;
}
Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
Yg = Y_out/256.00;
Zg = Z_out/256.00;
/*/////////////////////////////////////////
   显示X轴
   /////////////////////////////////////////*/
Serial.print("x=");
Serial.print(Xg,DEC);
Serial.print("g");
Serial.println();
/*///////////////////////////////////////
   显示Y轴
   /////////////////////////////////////////*/
Serial.print("y=");
Serial.print(Yg,DEC);
Serial.print("g");
Serial.println();
/*///////////////////////////////////////
   显示Z轴
   /////////////////////////////////////////*/
Serial.print("z=");
Serial.print(Zg,DEC);
Serial.print("g");
Serial.println();
delay(300);//延时0.3秒,刷新频率这里进行调整
}
但是显示的都是0.0000g,不知道怎么回事?我用了sparkfun上面的程序,用的是ISP通讯。但读到的数据也都是0,0,0.不知道是模块的问题还是程序问题。麻烦帮我看下上面修改后的程序是否可行?请弘老师或者各位高人指点下,谢谢!

hunduncn 发表于 2011-12-20 22:30:56

在arduino 1.0里 send方法 替换为 wirte ,receive方法 替换为 read

树·水·风 发表于 2011-12-26 10:25:55

lw0616 发表于 2011-12-5 20:58 static/image/common/back.gif
你好,刚刚学习arduino,请问下面的代码中,向ADXL发送Register_X0、Register_X1,以及下面的if条件是什么意 ...

Wire.send(Register_X0);
Wire.send(Register_X1);
是向ADXL设置起作用的寄存器地址,这里是Register_X0和Register_X1,这两个地址内的数值(每个8bit)合并后(16bit)即为X方向上加速度的值。设置好后,下面receive的就是存储在这两个寄存器内的值了。
if(Wire.available()<=2); Wire.available()<=2是说可读取的值即byte的个数。
我的理解正常情况下应该是两个,即Wire.available()<=2时执行大括号里的内容。但为什么弘老师把分号写在了大括号前面,就不理解了,希望弘老师能作答。

弘毅 发表于 2011-12-26 10:45:15

树·水·风 发表于 2011-12-26 10:25 static/image/common/back.gif
Wire.send(Register_X0);
Wire.send(Register_X1);
是向ADXL设置起作用的寄存器地址,这里是Register_X ...

:lol这些代码也不是我写的。。。是东找找。。西找找,找到能用的,然后写了下代码中文注释,就发上来了。@@看到寄存器我就头晕。。。。寄存器相关。。。大家自己研究研究,我是不太懂那东东。

黑马 发表于 2012-2-24 14:39:22

Wire.beginTransmission(ADXAddress);
这句没看懂什么意思:(

黑马 发表于 2012-2-24 14:59:50

ALT ADDRESS引脚处于高电平,器件的7位I2C地址是0x1D,随后为R/W位。这转化为0x3A写入,0x3B读取。通过ALT ADDRESS引脚(引脚12)接地,可以选择备用I2C地址0x53(随后为R/W位)。这转化为0xA6写入,0xA7读取。
以上是ADXL345说明书上的,真心没看懂……:'(

wonderfulsf 发表于 2012-2-27 22:39:48

新手正在试这个例子,刚连通1602,明天加上3.3V电源再试345了,作个记号.

wonderfulsf 发表于 2012-3-7 20:44:27



今天试验成功,用的MINI PRO,连了一堆线,作实验MINI还是不太方便啊.
这个三轴加速度在静态时能测量角度变化,动态计算估计就复杂了.
这个传感器使用还需要认真读手册了.

xlong23 发表于 2012-3-20 21:13:44

nomady 发表于 2011-12-14 11:24 static/image/common/back.gif
今天刚刚搞清楚这个问题,为什么是256

要把传感器的度数转化为标准的g需要知道当前传感器设置的量程和 ...

那如果我把测量范围设置成+-2g。。13位分辨率。。那么仍然256代表1g吗?

diamondliu 发表于 2012-4-5 22:15:26

我没有1602,只有12864,那叫一个麻烦,

diamondliu 发表于 2012-4-5 22:18:42

我是先吧Xg*100,再取余或模,得出三个位上的数字,哦,先还要把Xg弄成int有没有先进一点的方法

弘毅 发表于 2012-4-5 22:20:14

diamondliu 发表于 2012-4-5 22:18 static/image/common/back.gif
我是先吧Xg*100,再取余或模,得出三个位上的数字,哦,先还要把Xg弄成int有没有先进一点的方法

用串口输出数据到PC吧。。。
页: 1 [2] 3 4 5 6 7 8
查看完整版本: arduino学习笔记12 - ADXL345加速度传感器实验