
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 }
ODR更新頻率設置為1Hz,通過串口打印三軸加速度測量結果,單位mg。

