ADXL345是ADI公司生產的三軸數字加速度計芯片,與ST的LIS3DH功能接近。主要特性有:
- 工作電壓:2.0 ~ 3.6V
- 功耗:待機功耗0.1μA;工作時與數據輸出頻率(ODR)有關,如ODR<10 Hz時30μA
- 接口:I2C;三線/四線制SPI
- 分辨率:可選擇,最大13-bit
- 內置FIFO
- single tap/double tap檢測
- 自由落體檢測
- 兩個可編程中斷輸出腳
- 封裝:3 x 5 x 1 mm LGA
管腳定義
與Arduino的連接
用工作於3.3V/8MHz版本的Arduino Pro Mini進行調試。管腳定義、連接方法與調試LIS3DH時類似。采用I2C接口進行通訊,未利用FIFO和INT1、INT2中斷引腳。
ADXL345 Pro Mini (3.3V)
VDD <------> 3.3V
GND <------> GND
SCL <------> A5 (SCL)
SDA <------> A4 (SDA)
功能調試
1. 操作方法亦和LIS3DH類似。但ADXL345似乎沒有與LIS3DH的STATUS_REG寄存器,而是設定DATA_READY中斷,然后利用INT_SOURCE寄存器判斷是否有中斷事件發生,從而判斷是否有新的測量值。
2. 留意設置的ODR頻率不要超出I2C總線的數據讀取速率。如Arduino的I2C總線時鍾頻率為100kHz,則可設置的最大ODR為200Hz。
測試代碼

1 /* 2 Measurement of acceleration values using motion sensor ADXL345 3 */ 4 #include <Wire.h> 5 6 #define ADDRESS_ADXL345 0x53 7 #define DATA_FORMAT 0x31 8 #define BW_RATE 0x2C 9 #define POWER_CTL 0x2D 10 #define INT_ENABLE 0x2E 11 #define INT_SOURCE 0x30 12 #define DATAX0 0x32 13 14 byte buffer[6]; 15 byte intSource; 16 17 boolean ready = false; 18 19 int outX, outY, outZ; 20 float xVal, yVal, zVal; 21 22 void setup() 23 { 24 Wire.begin(); 25 Serial.begin(9600); 26 27 delay(2); 28 29 // set scale = +/- 2g, 13-bit mode 30 Wire.beginTransmission(ADDRESS_ADXL345); 31 Wire.write(DATA_FORMAT); 32 Wire.write(0x08); 33 Wire.endTransmission(); 34 // set ODR = 1.56 Hz 35 Wire.beginTransmission(ADDRESS_ADXL345); 36 Wire.write(BW_RATE); 37 Wire.write(0x04); 38 Wire.endTransmission(); 39 40 // start measurement 41 Wire.beginTransmission(ADDRESS_ADXL345); 42 Wire.write(POWER_CTL); 43 Wire.write(0x08); 44 Wire.endTransmission(); 45 46 // enable DATA_READY interrupt 47 Wire.beginTransmission(ADDRESS_ADXL345); 48 Wire.write(INT_ENABLE); 49 Wire.write(0x80); 50 Wire.endTransmission(); 51 } 52 53 void loop() 54 { 55 // check data ready 56 while(ready == false) 57 { 58 Wire.beginTransmission(ADDRESS_ADXL345); 59 Wire.write(INT_SOURCE); 60 Wire.endTransmission(); 61 Wire.requestFrom(ADDRESS_ADXL345, 1); 62 if (Wire.available() >= 1) 63 { 64 intSource = Wire.read(); 65 } 66 if (bitRead(intSource, 7) == 1) //new data available 67 { 68 ready = true; 69 } 70 } 71 if (bitRead(intSource, 0) == 1) 72 { 73 Serial.println("Some data have been overwritten."); 74 } 75 76 //read the result 77 Wire.beginTransmission(ADDRESS_ADXL345); 78 Wire.write(DATAX0); //read multiple bytes 79 Wire.endTransmission(); 80 Wire.requestFrom(ADDRESS_ADXL345, 6); 81 if (Wire.available() >= 6) 82 { 83 for (int i = 0; i < 6; i++) 84 { 85 buffer[i] = Wire.read(); 86 } 87 } 88 89 //calculation 90 outX = (buffer[1] << 8) | buffer[0]; 91 outY = (buffer[3] << 8) | buffer[2]; 92 outZ = (buffer[5] << 8) | buffer[4]; 93 xVal = outX *3.9; 94 yVal = outY *3.9; 95 zVal = outZ *3.9; 96 97 Serial.print("outX: "); Serial.print(xVal); Serial.print(" "); 98 Serial.print("outY: "); Serial.print(yVal); Serial.print(" "); 99 Serial.print("outZ: "); Serial.println(zVal); 100 101 ready = false; 102 }
ODR設定為1.56Hz,通過串口打印三個維度的加速度值,單位為mg。