Arduino I2C + 三軸加速度計ADXL345

來源:互聯網
上載者:User

標籤:

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 }
View Code

ODR設定為1.56Hz,通過串口列印三個維度加速度值,單位為mg

參考資料

ADXL345 - Analog Devices

Arduino I2C + 三軸加速度計ADXL345

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.