LIS3DETR传感器驱动调试

转载注明出处:http://blog.csdn.net/mjli/article/details/44423307

目前使用了传感器的两个功能,一个是读取X,Y,Z轴的原数据,另一个是设定轴数据的差值,超过差值产生中断通知

1.读取X,Y,X的原数据,基本可以参考ST的参考代码实现

//Inizialize MEMS Sensor
//set ODR (turn ON device)
response = LIS3DH_SetODR(LIS3DH_ODR_100Hz);
if(response==0){
UART_PRINT("init_acceleration LIS3DH_SetODR failed\r\n");
}
//set PowerMode
response = LIS3DH_SetMode(LIS3DH_NORMAL);
if(response==0){
UART_PRINT("init_acceleration LIS3DH_SetMode failed\r\n");
}
//set Fullscale
response = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
if(response==0){
UART_PRINT("init_acceleration LIS3DH_SetFullScale failed\r\n");
}
//set axis Enable
response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);
if(response==0){
UART_PRINT("init_acceleration LIS3DH_SetAxis failed\r\n");
}

      response = LIS3DH_GetAccAxesRaw(&data);
if(response==1){
//print data values
//int test1,test2,test3;
//UART_PRINT("RAW DATA X=%3d Y=%3d Z=%3d \r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z);
*x = convert_acc_raw_data((unsigned char)data.AXIS_X);
*y = convert_acc_raw_data((unsigned char)data.AXIS_Y);
*z = convert_acc_raw_data((unsigned char)data.AXIS_Z);
UART_PRINT("real DATA X=%3d Y=%3d Z=%3d \r\n",*x,*y,*z);

}

//源数据采用2的补码表示,所以要先转换一下

int convert_acc_raw_data(unsigned char data)
{
int ret = 1;


if((data&0x80) == 0x80)
{
ret = -128;
if((data&0x40) == 0x40)
ret += 64;
if((data&0x20) == 0x20)
ret += 32;
if((data&0x10) == 0x10)
ret += 16;
if((data&0x08) == 0x08)
ret += 8;
if((data&0x04) == 0x04)
ret += 4;
if((data&0x02) == 0x02)
ret += 2;
if((data&0x01) == 0x01)
ret += 1;
}
else
{
ret = data&0x7f;
}


return ret;
}

2.设定轴数据的差值,超过差值产生中断通知.这部分参考了网络上一份代码,找不到出处了,表示谢意

LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x5f);//100Hz,低功耗模式,开启x,y,z轴检测
LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x09);//正常模式,数据从内部滤波器到输出寄存器,高通滤波器使能到中断1
LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x40);//IG1中断1使能
LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x00);//灵密度,+-2g
LIS3DH_WriteReg(LIS3DH_CTRL_REG5, 0x08);//中断锁存

LIS3DH_WriteReg(LIS3DH_INT1_THS, 0x10);//16*16mg  设置中断阈值
LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0x00);//中断持续时间设置为0,因为已经设置中断锁存,所以中断不会消失,直到手动清除中断


LIS3DH_ReadReg(LIS3DH_REFERENCE_REG, &val);//第一次虚读reference寄存器,强制将高通滤波器的值加载到当前加速度值,从这时开始比较了。


LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0x2a);//使能中断,中断模式是中断事件的‘OR’组合,这里只使能了x,y,z轴的高事件中断。开始时这个寄存器没理解清楚,把x,y,z轴的高低事件都使能了,导致一直有中断。因为不是高就是低,肯定有中断。

LIS3DH_ReadReg(LIS3DH_INT1_SRC, &val);//当检测到中断后,清除中断

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值