ADXL摇晃检测
0赞
发表于 3/8/2012 10:06:43 AM
阅读(2368)
检测晃动与检测旋转十分类似,也是检测某一轴的加速度变化,继而判断晃动方向,y轴检测加速度变化,当芯片向左摇动时,检测到y轴加速度为正,输出显示“left”,加速度为负时,输出显示为“right”。
寄存器设置与检测旋转类似,设置寄存器ACT_INACT_CTL为0xA0,使能y轴,只检测y轴方向的加速度变化。这个只有照片,还是视频看起来效果比较好,但是很可惜没有保存。
一开始晃动检测非常不准确,调节为低精度就时常无法检测到晃动,或者检测错误,经常要用大力摇晃;精度太高连微小震动也能检测到,因为人不是机器,始终会有震动和摇晃。后来我们设置了一个延迟时间,当检测到晃动后延迟检测,比如人把它向左晃动,晃到左边并不会立即停下,而是会有向右的回缩和摇动,设置延迟时间就是把有效晃动之后一段时间内的震动都屏蔽掉,再提高精度,这样效果比之前好很多,但仍然不是非常理想。
下面把修改前后的中断程序发出来,大家可以看一下有什么区别(一眼就能看出来的)。
修改前:
while(1) { if(fifo_flag==1) { SPI_ADXL345_READ(XL345_INT_SOURCE); SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00); mean_x = 0; mean_y = 0; mean_z = 0; for(i=0; i<1; i++) { ADuC7026_once(); long_r_data[6+i] = long_r_data[0]; long_r_data[7+i] = long_r_data[1]; long_r_data[8+i] = long_r_data[2]; mean_x+=long_r_data[0]; mean_y+=long_r_data[1]; mean_z+=long_r_data[2]; } mean_x/=1; mean_y/=1; mean_z/=1; mean_x-=static_x; mean_y-=static_y; mean_z-=static_z; fifo_flag=0; long_delay(500000); ADuC7026_once_2(); SPI_ADXL345_READ(XL345_INT_SOURCE); SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00); if(mean_y>0) { clear_screen(0x00); disp_str(0,0,"right "); } else { clear_screen(0x00); disp_str(0,0,"left "); } long_delay(50000); ADuC7026_static_rotate(); }
修改后:
while(1) { if(fifo_flag==1) { SPI_ADXL345_READ(XL345_INT_SOURCE); SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00); mean_x = 0; mean_y = 0; mean_z = 0; for(i=0; i<1; i++) { ADuC7026_once(); long_r_data[6+i] = long_r_data[0]; long_r_data[7+i] = long_r_data[1]; long_r_data[8+i] = long_r_data[2]; mean_x+=long_r_data[0]; mean_y+=long_r_data[1]; mean_z+=long_r_data[2]; } mean_x/=1; mean_y/=1; mean_z/=1; mean_x-=static_x; mean_y-=static_y; mean_z-=static_z; fifo_flag=0; long_delay(500000); ADuC7026_once_2(); if(mean_y>0) disp_str(0,0,"right "); else disp_str(0,0,"left "); long_delay(50000); ADuC7026_static_rotate(); }