![](https://s5-media.51cto.com/ost/pc/static/noavatar.gif)
回复
LIS3DH是ST公司生产的MEMS三轴加速度计芯片,实现运动传感的功能。主要特性有:
管脚定义
与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;若通过下拉电阻接地,功耗则会更大。
测试代码
/*
Measurement of acceleration values using motion sensor LIS3DH
*/
#include <Wire.h>
#define ADDRESS_LIS3DH 0x19
#define CTRL_REG1 0x20
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define STATUS_REG 0x27
#define OUT_X_L 0x28
byte buffer[6];
byte statusReg;
boolean ready = false;
int outX, outY, outZ;
int xVal, yVal, zVal;
void setup()
{
Wire.begin();
Serial.begin(9600);
delay(5); //5 ms boot procedure
// reboot memory content, to make a clean start
Wire.beginTransmission(ADDRESS_LIS3DH);
Wire.write(CTRL_REG5);
Wire.write(0x80);
Wire.endTransmission();
delay(5);
//set ODR = 1 Hz, normal mode, x/y/z axis enabled
Wire.beginTransmission(ADDRESS_LIS3DH);
Wire.write(CTRL_REG1);
Wire.write(0x17);
Wire.endTransmission();
//set BDU= 1, scale = +/-2g, high resolution enabled
Wire.beginTransmission(ADDRESS_LIS3DH);
Wire.write(CTRL_REG4);
Wire.write(0x80);
Wire.endTransmission();
}
void loop()
{
// read STATUS_REG
while(ready == false)
{
Wire.beginTransmission(ADDRESS_LIS3DH);
Wire.write(STATUS_REG);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_LIS3DH, 1);
if (Wire.available() >= 1)
{
statusReg = Wire.read();
}
if (bitRead(statusReg, 3) == 1) //new data available
{
ready = true;
}
delay(10);
}
if (bitRead(statusReg, 7) == 1)
{
Serial.println("Some data have been overwritten.");
}
//read the result
Wire.beginTransmission(ADDRESS_LIS3DH);
Wire.write(OUT_X_L | 0x80); //read multiple bytes
Wire.endTransmission();
Wire.requestFrom(ADDRESS_LIS3DH, 6);
if (Wire.available() >= 6)
{
for (int i = 0; i < 6; i++)
{
buffer[i] = Wire.read();
}
}
//calculation
outX = (buffer[1] << 8) | buffer[0];
outY = (buffer[3] << 8) | buffer[2];
outZ = (buffer[5] << 8) | buffer[4];
xVal = outX / 16;
yVal = outY / 16;
zVal = outZ / 16;
Serial.print("outX: "); Serial.print(xVal); Serial.print(" ");
Serial.print("outY: "); Serial.print(yVal); Serial.print(" ");
Serial.print("outZ: "); Serial.println(zVal);
ready = false;
}
ODR更新频率设置为1Hz,通过串口打印三轴加速度测量结果,单位mg。