ADXL摇晃检测
0赞
发表于 3/8/2012 10:06:43 AM
阅读(3492)
检测晃动与检测旋转十分类似,也是检测某一轴的加速度变化,继而判断晃动方向,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();
}
