LIS3DH(3轴加速度计)使用

LIS3DH

LIS3DH 是属于 “nano” 系列的超低功耗高性能 3 轴线性加速度计,具有数字 I2C、 SPI 串行接口标准输出。器件具有超低功耗工作模式,可实现高级节能、智能睡眠唤醒以及恢复睡眠功能。LIS3DH 具有 ±2g/±4g/±8g/±16g 的动态用户可选满量程,并能通过 1 Hz 到 5 kHz 的输出数据速率测量加速度。

LIS3DH初始化

我使用的是模拟SPI接口,由于需要低功耗,不使用中断模式。

void Lis3dh_Init(void)
{
  whoami = read_dis3dh(LIS3DH_WHO_AM_I);
  write_dis3dh(LIS3DH_CTRL_REG0,0x90);//SDO禁止上拉  低功耗调试此处有漏电流
  write_dis3dh(LIS3DH_CTRL_REG1,0x27);//10hz  正常模式
  write_dis3dh(LIS3DH_CTRL_REG2,0);//绕过高通滤波器
//  write_dis3dh(LIS3DH_CTRL_REG3,0x00);//中断不被驱动到INT1
  write_dis3dh(LIS3DH_CTRL_REG4,0x80);//FS = 2g
//  write_dis3dh(LIS3DH_CTRL_REG5,0x00);//不锁存中断
  write_dis3dh(LIS3DH_INT1_DURATION, 0x00);//设置最小持续中断时间,ODR;
}

利用XY轴的加速度计算倾角

LIS3DH传感器是平置初始位置,我需要计算传感器与水平面的夹角:

//获取角度值 横滚角和俯仰角
uint8 get_Angle_value(void)
{
     short x,y,z;
     float value=0;
     uint8 analevalue = 0;
     if((read_dis3dh(LIS3DH_STATUS_REG)&0x08)==0x08)
     {
     regvalue[0] = read_dis3dh(LIS3DH_OUT_X_L);
     regvalue[1] = read_dis3dh(LIS3DH_OUT_X_H);
     regvalue[2] = read_dis3dh(LIS3DH_OUT_Y_L);
     regvalue[3] = read_dis3dh(LIS3DH_OUT_Y_H);
     regvalue[4] = read_dis3dh(LIS3DH_OUT_Z_L);
     regvalue[5] = read_dis3dh(LIS3DH_OUT_Z_H);     
     x = regvalue[1]*256 +regvalue[0];
     y = regvalue[3]*256 +regvalue[2];
     z = regvalue[5]*256 +regvalue[4];
     x=(short)((float)(x)/16);//换算为mg
     y=(short)((float)(y)/16);
     z=(short)((float)(z)/16);       
     value = atan((sqrt((float)x*(float)x+(float)y*(float)y))/(float)(-z))*57.29578;
     if(value==0 &&z>0)
     {
      value=180;
     }
     else if(value<0)
     {
       value = 180+value;
     }   
   }
   analevalue=(uint8)(abs(value));
   return analevalue;
}

最开始采用单轴加速度计算角度,所采用的计算公式为: 但是这种单轴计算法的灵敏度不是线性的,如下图所示,这样计算角度在某个角度会误差较大,而且抗干扰能力也不强。 所以我采用了三轴倾斜计算的方法。

实际应用也证明了三轴倾斜计算的结果优于单轴计算法。

经验分享 程序员 微信小程序 职场和发展