转载注明出处:http:///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);//当检测到中断后,清除中断
因篇幅问题不能全部显示,请点此查看更多更全内容