Arduino I2C + 三軸加速度計LIS3DH


LIS3DH是ST公司生產的MEMS三軸加速度計芯片,實現運動傳感的功能。主要特性有:

  • 寬工作電壓范圍:1.71 ~ 3.6V
  • 功耗:低功耗模式2μA;正常工作模式、ODR = 50Hz時功耗11μA(要求SDO/SA0腳浮空或上拉)
  • 測量范圍:+/-2g ~ +/-16g
  • 接口:I2C、三線制/四線制SPI
  • 16 bit數據輸出
  • 兩個可編程中斷輸出腳,用於自由落體和動作檢測
  • 6D/4D方向檢測
  • 內置AD支持3路外部信號輸入
  • 內置溫度傳感器
  • 內置32-slot的10-bit FIFO存儲器
  • 自檢測功能
  • 封裝:3 x 3 x 1 mm LGA-16

管腳定義

  • VCC:電源
  • Vdd_IO:數字接口供電電源
  • GND:地
  • RES:連接到地
  • NC:不連接
  • CS:I2C接口選擇(CS=1);或SPI接口片選腳(CS=0)
  • SCL/SPC:I2C接口或SPI接口的時鍾線
  • SDA/SDI/SDO:I2C接口或SPI接口數據線
  • SDO/SA0:I2C地址選擇腳;或四線制SPI接口輸出腳。浮空時為1。
  • INT1:中斷信號輸出,觸發條件可中斷
  • INT2:同上
  • ADC1、ADC2、ADC3:數模轉換的模擬信號輸入腳

與Arduino的連接

用工作於3.3V/8MHz版本的Arduino Pro Mini進行調試,可避免用UNO時接口電平轉換的麻煩。采用I2C接口進行通訊。未利用INT1、INT2和FIFO的功能。

LIS3DH  Pro Mini 3.3V/8MHz

VDD <------> 3.3V

GND <------> GND

SCL <------>  A5 (SCL)

SDA <------> A4 (SDA)

功能調試

1. 根據應用手冊,LIS3DH用於傾斜檢測時,最好將測量范圍設置為+/-2g。

2. 設備上電后,需要約5ms的啟動時間,之后自動進入低功耗模式。之后不同的模式間切換也需要少許的時間,與ODR有關。

3. 存儲結果的寄存器的值為有符號數(二補碼)。應用筆記中“Example of acceleration data”中的示例表格,1g對應的高位寄存器值應為40h,資料應該是誤寫成了04h。

4. 手冊中的功耗數據只適用於SDO/SA0腳接電源、或者空接的情況。若該管腳接地,功耗會增加150μA;若通過下拉電阻接地,功耗則會更大。

測試代碼

 1 /*
 2     Measurement of acceleration values using motion sensor LIS3DH 
 3 */
 4 
 5 #include <Wire.h>
 6 
 7 #define ADDRESS_LIS3DH 0x19
 8 #define CTRL_REG1 0x20
 9 #define CTRL_REG4 0x23
10 #define CTRL_REG5 0x24
11 #define STATUS_REG 0x27
12 #define OUT_X_L 0x28
13 
14 byte buffer[6];
15 byte statusReg;
16 
17 boolean ready = false;
18 int outX, outY, outZ;
19 int xVal, yVal, zVal;
20 
21 void setup()
22 {
23     Wire.begin();
24     Serial.begin(9600);
25     delay(5); //5 ms boot procedure
26 
27     // reboot memory content, to make a clean start
28     Wire.beginTransmission(ADDRESS_LIS3DH);
29     Wire.write(CTRL_REG5); 
30     Wire.write(0x80);
31     Wire.endTransmission();
32 
33     delay(5);
34 
35     //set ODR = 1 Hz, normal mode, x/y/z axis enabled
36     Wire.beginTransmission(ADDRESS_LIS3DH);
37     Wire.write(CTRL_REG1); 
38     Wire.write(0x17);
39     Wire.endTransmission();
40 
41     //set BDU= 1, scale = +/-2g, high resolution enabled
42     Wire.beginTransmission(ADDRESS_LIS3DH);
43     Wire.write(CTRL_REG4); 
44     Wire.write(0x80);
45     Wire.endTransmission();
46 }
47 
48 void loop()
49 {
50     // read STATUS_REG
51     while(ready == false)
52     {
53         Wire.beginTransmission(ADDRESS_LIS3DH);
54         Wire.write(STATUS_REG); 
55         Wire.endTransmission();
56         Wire.requestFrom(ADDRESS_LIS3DH, 1);
57         if (Wire.available() >= 1)
58         {
59             statusReg = Wire.read();
60         }
61         if (bitRead(statusReg, 3) == 1) //new data available
62         {
63             ready = true;
64         }
65         delay(10);
66     }
67     
68     if (bitRead(statusReg, 7) == 1)
69     {
70         Serial.println("Some data have been overwritten.");
71     }
72 
73     //read the result
74     Wire.beginTransmission(ADDRESS_LIS3DH);
75     Wire.write(OUT_X_L | 0x80); //read multiple bytes
76     Wire.endTransmission();
77     Wire.requestFrom(ADDRESS_LIS3DH, 6);
78     if (Wire.available() >= 6)
79     {
80         for (int i = 0; i < 6; i++)
81         {
82             buffer[i] = Wire.read();
83         }
84     }
85 
86     //calculation
87     outX = (buffer[1] << 8) | buffer[0]; 
88     outY = (buffer[3] << 8) | buffer[2]; 
89     outZ = (buffer[5] << 8) | buffer[4]; 
90     xVal = outX / 16;
91     yVal = outY / 16;
92     zVal = outZ / 16;
93 
94     Serial.print("outX: "); Serial.print(xVal); Serial.print("  ");
95     Serial.print("outY: "); Serial.print(yVal); Serial.print("  ");
96     Serial.print("outZ: "); Serial.println(zVal);
97 
98     ready = false;
99 } 
View Code

ODR更新頻率設置為1Hz,通過串口打印三軸加速度測量結果,單位mg

 

參考資料

LIS3DH - STMicroelectronics


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM