默れ

ADXL摇晃检测

0
阅读(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();
    }