在地球上的物体都受到地球的引力,所以LIS3DH静止不动时,都会测量的重力加速度。使用LIS3DH内部的高通滤波器可以过滤掉重力,可以更好的检测重力外的其他力产生的加速度。
LIS3DH的高通滤波器的正常模式可以通过读取REFERENCE (26h)寄存,立即清除加速度的直流分量,实现重力加速度的过滤。如图1。

使用中断时,一定要打开中断,设置中断的阈值,设置打开对应轴的阈值中断。使用中断需要获取产生中的加速度值时,不要使用fifo。初始化程序如下。
void LIS3DHInit()
{
uint8_t flag;
IICInit();
ExtiInit(INT1_PORT,INT1_PIN,1,GpioIrqRising);
ExtiInit(INT2_PORT,INT2_PIN,1,GpioIrqRising);
LIS3DH_ReadReg(LIS3DH_WHO_AM_I,&flag);
printf("%x\r\n",flag);
LIS3DH_WriteReg(LIS3DH_CTRL_REG1,0x4f); //50HZ,低功耗模式
LIS3DH_WriteReg(LIS3DH_CTRL_REG2,0x09); //使用高通滤波器,过滤初始加速度
LIS3DH_WriteReg(LIS3DH_CTRL_REG3,0x40); //打开INT1中断
LIS3DH_WriteReg(LIS3DH_CTRL_REG4,0x00); //-2g~2g
LIS3DH_WriteReg(LIS3DH_CTRL_REG5,0x08); //锁存INT1_SRC,不使用fifo
LIS3DH_WriteReg(LIS3DH_CTRL_REG6,0x00); //中断引脚高电平有效
LIS3DH_WriteReg(LIS3DH_INT1_THS,31); //设置阈值,2g单位为16mg,4g单位为32mg,8g单位为62mg,16g单位为186mg
LIS3DH_WriteReg(LIS3DH_INT1_DURATION,0); //设置唤醒时间,不需要进入睡眠
LIS3DH_ReadReg(LIS3DH_REFERENCE_REG,&flag); //读取参考值寄存器,清除直流分量
LIS3DH_WriteReg(LIS3DH_INT1_CFG,0x2a); //当XYZ轴加速度高于阈值,产生中断
}
读取加速度时,可以在中断服务函数中读取,提高数据的实时性。程序如下。
void PORT2_IRQHandler(void)
{
uint8_t flag;
uint32_t irqSt = 0;
irqSt = M0P_GPIO->P2STAT;
M0P_GPIO->P2ICLR = 0; //清除外部中断
if(irqSt & (1<<INT1_PIN)){ //INT1产生中断
LIS3DH_GetInt1Src(&flag); //获取LIS3DH INT1标志
if(flag){ //INT1产生中断,直接读取加速度
LIS3DH_GetAccAxesRaw(&lis3dh.acc);
lis3dh.acc.AXIS_X >>= 4;
lis3dh.acc.AXIS_Y >>= 4;
lis3dh.acc.AXIS_Z >>= 4; //加速度值都是左对齐的,要右移4位
printf("%5d%6d%6d\r\n",lis3dh.acc.AXIS_X,lis3dh.acc.AXIS_Y,lis3dh.acc.AXIS_Z);
}
}
if(irqSt & (1<<INT2_PIN)){
lis3dh.intFlag |= INT2_FLAG;
LIS3DH_ReadReg(0x35,&flag);
}
}
给LIS3DH施加一定的力后,数据输出如下。本文中设置的阈值为31,所以加速度阈值为31*16mg=496mg。图中每次输出都至少有一个轴的值大于496,说明配置有效。
最后发一下程序的下载链接。