ADXL345快速使用指南.docx
- 文档编号:25107400
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:11
- 大小:40.58KB
ADXL345快速使用指南.docx
《ADXL345快速使用指南.docx》由会员分享,可在线阅读,更多相关《ADXL345快速使用指南.docx(11页珍藏版)》请在冰豆网上搜索。
ADXL345快速使用指南
ADXL345快速运用指南
作者zagGard2011年1月10日
描述:
ADXL345是一款体型小而轻薄的超低功耗3轴加速度计,分辨率高13位,测量范围±16g。
数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。
ADXL345非常适合应用于移动设备。
它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
其高分辨率为4mg/LSB,能够测量不到1.0°的倾斜角度变化。
该器件提供多种特殊检测功能。
活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。
敲击检测功能可以检测任意方向的单振和双振动作。
自由落体检测功能可以检测器件是否正在掉落。
这些功能可以独立映射到两个中断输出引脚中的一个。
正在申请专利的集成式存储器管理系统采用一个32级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。
低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。
特征:
2.0-3.6V直流供电
超低功耗:
测量模式时40uA,待机时0.1uA@2.5V
单振/双振检测
自由落体检测
SPI和I2C数字接口
数据传输:
这部分的指南说明了如何把ArduinoADXL345连接到面包板。
下面是一个描述Arduino引脚应该连接到的加速度计引脚的表:
Arduino引脚
ADXL345引脚
10
CS
11
SDA
12
SDO
13
SCL
3V3
VCC
Gnd
GND
初学者的示例代码:
让我们看一个获得ADXL345和Arduino运行的示例。
你可以在这里下载完整的代码。
下面我们将检查该代码的不同部分。
//Add the SPI library so we can communicate with the ADXL345 sensor
#include
//Assign the Chip Select signal to pin 10.
intCS=10;
//This is a list of some of the registers available on the ADXL345.
//To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
charPOWER_CTL=0x2D;//PowerControlRegister
charDATA_FORMAT=0x31;
charDATAX0=0x32;//X-AxisData0
charDATAX1=0x33;//X-AxisData1
charDATAY0=0x34;//Y-AxisData0
charDATAY1=0x35;//Y-AxisData1
charDATAZ0=0x36;//Z-AxisData0
charDATAZ1=0x37;//Z-AxisData1
//This buffer will hold values read from the ADXL345 registers.
charvalues[10];
//These variables will be used to hold the x,y and z axis accelerometer values.
intx,y,z;
这是代码的初始化部分,这真的非常基本,这里是正在发生的。
SPI.h库被添加到程序。
SPI是Arduino使用于传达给ADLX345的通信协议,一个名为CS的变量存储片选信号的针数,是为ADXL345寄存器创建的变量,这些变量存储的指示的寄存器的地址和用于从加速计设置和检索的值。
数据表显示所有可用的ADXL345及其地址寄存器。
创建变量,将存储已检索到的加速度信息。
1.voidsetup(){
2. //InitiateanSPIcommunicationinstance.
3. SPI.begin();
4. //ConfiguretheSPIconnectionfortheADXL345.
5. SPI.setDataMode(SPI_MODE3);
6. //Createaserialconnectiontodisplaythedataontheterminal.
7. Serial.begin(9600);
8.
9. //SetuptheChipSelectpintobeanoutputfromtheArduino.
10. pinMode(CS,OUTPUT);
11. //Beforecommunicationstarts,theChipSelectpinneedstobesethigh.
12. digitalWrite(CS,HIGH);
13.
14. //PuttheADXL345into+/-4Grangebywritingthevalue0x01totheDATA_FORMATregister.
15. writeRegister(DATA_FORMAT, 0x01);
16. //PuttheADXL345intoMeasurementModebywriting0x08tothePOWER_CTLregister.
17. writeRegister(POWER_CTL, 0x08); //Measurementmode
18.}
19.
20.voidloop(){
21. //Reading6bytesofdatastartingatregisterDATAX0willretrievethex,yandzaccelerationvaluesfromtheADXL345.
22. //Theresultsofthereadoperationwillgetstoredtothevalues[]buffer.
23. readRegister(DATAX0, 6, values);
24.
25. //TheADXL345gives10-bitaccelerationvalues,buttheyarestoredasbytes(8-bits).Togetthefullvalue,twobytesmustbecombinedforeachaxis.
26. //TheXvalueisstoredinvalues[0]andvalues[1].
27. x = ((int)values[1]<<8)|(int)values[0];
28. //TheYvalueisstoredinvalues[2]andvalues[3].
29. y = ((int)values[3]<<8)|(int)values[2];
30. //TheZvalueisstoredinvalues[4]andvalues[5].
31. z = ((int)values[5]<<8)|(int)values[4];
32.
33. //Printtheresultstotheterminal.
34. Serial.print(x,DEC);
35. Serial.print(',');
36. Serial.print(y,DEC);
37. Serial.print(',');
38. Serial.println(z,DEC);
39. delay(10);
40.}
代码的主要部分分为两个部分:
初始化部分和循环部分。
初始化部分是用来配置Arduino与ADXL345沟通的不同方面。
在初始化部分的末尾两个功能用于将加速度计设为我们要使用的模式(+/-4G的检测,测量使能模式)。
这两个功能将在下一段程序讨论。
循环部分做程序的大部分工作。
这是循环部分:
Arduino使用读取寄存器命令从ADXL3456读取6个寄存器的值。
该命令从加速度计读取x,y和z加速度值,并将其存储在一个在初始化程序中创建的名为“values”的缓冲区。
来自加速度计的值被以字节被读取。
一个字节只有8位,但加速度计加速的报告多达10位!
为了看到正确的加速度值,我们必须将两个字节连接一起。
x,y和z的加速度值是通过来自缓冲器的字节的值来确定的。
加速度值被传送到串口终端。
程序在再次执行循环之前等待10毫秒,这将允许循环运行在大约100赫兹。
1.//This function will write a value to a register on the ADXL345.
2.//Parameters:
3.// char registerAddress - The register to write a value to
4.// char value - The value to be written to the specified register.
5.voidwriteRegister(charregisterAddress,charvalue){
6. //SetChipSelectpinlowtosignalthebeginningofanSPIpacket.
7. digitalWrite(CS,LOW);
8. //TransfertheregisteraddressoverSPI.
9. SPI.transfer(registerAddress);
10. //TransferthedesiredregistervalueoverSPI.
11. SPI.transfer(value);
12. //SettheChipSelectpinhightosignaltheendofanSPIpacket.
13. digitalWrite(CS,HIGH);
14.}
15.
16.//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
17.//Parameters:
18.// char registerAddress - The register addresse to start the read sequence from.
19.// int numBytes - The number of registers that should be read.
20.// char * values - A pointer to a buffer where the results of the operation should be stored.
21.voidreadRegister(charregisterAddress,intnumBytes,char*values){
22. //Sincewe'reperformingareadoperation,themostsignificantbitoftheregisteraddressshouldbeset.
23. charaddress=0x80|registerAddress;
24. //Ifwe'redoingamulti-byteread,bit6needstobesetaswell.
25. if(numBytes>1)address=address|0x40;
26.
27. //SettheChipselectpinlowtostartanSPIpacket.
28. digitalWrite(CS,LOW);
29. //Transferthestartingregisteraddressthatneedstoberead.
30. SPI.transfer(address);
31. //Continuetoreadregistersuntilwe'vereadthenumberspecified,storingtheresultstotheinputbuffer.
32. for(int SPI.transfer(0x00);
33. }
34. //SettheChipsSelectpinhightoendtheSPIpacket.
35. digitalWrite(CS,HIGH);
36.}
寄存器读取命令被用于读取ADXL345的值,当使用寄存器读取功能时必须使用三个变量:
被读取寄存器的地址,所读取序列中寄存器的数量,以及读取值所储存的缓冲区。
当从ADXL345读取一个寄存器时地址必须被修改,以使第8位被设置为高位。
如果要读取超过1个寄存器的话第7位也必须设置为高位。
这个功能在前两行完成此任务,之后,该功能非常类似于寄存器书写功能。
将CS引脚置为低电平来启动SPI序列,地址被转移。
之后,一个循环中读取的来自加速度计的寄存器的指定数量的值被存储在指定的缓冲区。
最后,CS引脚置高,结束SPI序列,功能完成。
人如果你看上了这个关于ADXL345使用Arduino作为处理器的使用指南,下载程序,在Arduino的IDE中打开程序后,只需将其加载到您的开发板并打开Arduino终端,你会看到的X,Y和Z加速度值开始在终端窗口滚动。
//Createaninterruptthatwilltriggerwhenatapisdetected.
attachInterrupt(0,tap,RISING);
//PuttheADXL345into+/-4Grangebywritingthevalue0x01totheDATA_FORMATregister.
writeRegister(DATA_FORMAT, 0x01);
//SendtheTapandDoubleTapInterruptstoINT1pin
writeRegister(INT_MAP, 0x9F);
//LookfortapsontheZaxisonly.
writeRegister(TAP_AXES, 0x01);
//SettheTapThresholdto3g
writeRegister(THRESH_TAP, 0x38);
//SettheTapDurationthatmustbereached
writeRegister(DURATION, 0x10);
//100msLatencybeforethesecondtapcanoccur.
writeRegister(LATENT, 0x50);
writeRegister(WINDOW, 0xFF);
//EnabletheSingleandDoubleTaps.
writeRegister(INT_ENABLE, 0xE0);
//PuttheADXL345intoMeasurementModebywriting0x08tothePOWER_CTLregister.
writeRegister(POWER_CTL, 0x08); //Measurementmode
readRegister(INT_SOURCE, 1, values); //CleartheinterruptsfromtheINT_SOURCEregister.
此代码已经被添加到程序的setup()部分。
这与ADXL345_Basic示例的setup()部分有点不同因为我们设置了ADXL345的单振/双振检测。
当加速度计检测到单振或双振我们让INT1引脚变为高电平,当事件被处理完毕后INT1引脚将回到低电平。
当INT1引脚在ADXL345上为高电平,我们希望到Arduino产生中断。
为了做到这一点,我们使用attachInterrupt()函数,我们设置个功能要当中断0(引脚D2)由低到高时发生中断,而我们希望Arduino执行单振功能时发生这种情况。
我们稍后来看看单振功能。
中断产生后,我们需要配置ADXL345识别单振,双振事件。
为了配置这个,我们必须改变以下寄存器的值:
INT_MAP,TAP_AXES,THRESH_TAP,DURATION,LATENTandWINDOW。
您可以阅读数据表中的“振动检测”部分,看到为什么这些值分配给相应寄存器。
基本上,虽然ADXL345已配置为如果检测一个单振或双振INT1端子会从低到高的,但是一旦中断处理的INT1引脚将回到低电平。
//ConverttheaccelerometervaluetoG's.
//With10bitsmeasuringovera+/-4grangewecanfindhowtoconvertbyusingtheequation:
//Gs=MeasurementValue*(G-range/(2^10))orGs=MeasurementValue*(8/1024)
xg = x * 0.0078;
yg = y * 0.0078;
zg = z * 0.0078;
在最后的部分,我们会想两种类型的输出。
如果一个单一的振动被检测到Arduino将输出原始加速度计值x,y和z,就像在ADXL345_Basic例子。
但是,如果ADXL345检测到一个双振,我们想要的Arduino计算出的X,Y和Z轴的实际G值。
为了从原始加速度计数据计算出的G值计算我们必须找到数模。
为了找到数模,我们需要知道两个数值:
用于表示原始值的位数和加速度值可以表示的范围。
该ADXL345设置为10位测量值。
我们设定的范围为±4g,或8g范围。
数模是通过将总的范围由可以在10位的数目中表示找到的。
一旦我们知道了数模,我们需要做的就是通过数模乘以加速度传感器的原始数据,以寻找GS的数量。
变量xg,yg和zg是浮动的变量,使他们能够用十进制数表示。
if(tapType>0)
{
if(tapType==1){
Serial.println("SINGLE");
Serial.print(x);
Serial.print(',');
Serial.print(y);
Serial.print(',');
Serial.println(z);
}
else{
Serial.println("DOUBLE");
Serial.print((float)xg,2);
Serial.print("g,");
Serial.print((float)yg,2);
Serial.print("g,");
Serial.print((float)zg,2);
Serial.println("g");
}
detachInterrupt(0);
delay(500);
attachInterrupt(0,tap,RISING);
intType=0;
}
当TAP()函数中断运行(我们将之后讨论这个)它分配一个值tagType变量。
如果检测到一个单振该变量赋值'1',如果检测到双振该变量赋值'2'。
如果检测到单振Arduino的会写单词“SINGLE”跟在x,y和z加速度值后送到终端。
如果检测到双振Arduino将输入单词“DOUBLE”跟在x,y和z加速度值后送到终端。
在显示了数值后,我们把中断关闭了一小会儿,这防止了Arduino从ADXL345再次检测到单振从而再次引发中断。
voidtap(void){
//CleartheinterruptsontheADXL345
readRegister(INT_SOURCE, 1, values);
if(values[0]&(1<<5))tapType=2;
elsetapType=1;;
}
因为当Arduino检测到引脚D2发生中断时attachInterrupt()函数也就是TAP()函数将被调用的方式。
这个功能是相当简单:
Arduino的读取ADXL345的INT_SOURCE寄存器的值并存储在'values'缓冲器。
该INT_SOURCE寄存器告诉我们,中断来自一个单振还是双振,取决于哪种我们在tapType变量分配的1或2。
下载程序和运行程序,需要在你把ADXL345连接到Arduino后,在ADXL345的INT1引脚上连一根导线到Arduino的D2上的,将程序下载到您的板子。
然后打开处理和运行ADXL345_Advanced窗口,您可能需要更改串口号,以反映该端口有Arduino插入。
如果一切都已经正确处理,当你轻点的ADXL345加速度计窗口将输出“SingleTap”,的原始值,同样的当你双击的ADXL345,窗口将输出“DoubleTap”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADXL345 快速 使用指南
![提示](https://static.bdocx.com/images/bang_tan.gif)