打印

有没有同志用过ADXL345和L3G4200D这两款芯片

[复制链接]
4056|10
手机看帖
扫描二维码
随时随地手机跟帖
沙发
zjgtan|  楼主 | 2013-3-8 11:23 | 只看该作者
上面第一张图是L3G4200D压电陀螺仪测得的数据,第二张图是ADXL345加速度计测得的数据,两组数据都有极大的噪声,请问这大概是什么原因

使用特权

评论回复
板凳
jjjyufan| | 2013-3-8 12:29 | 只看该作者
贴你的图来看看
345 哪个引脚上的数据啊?

使用特权

评论回复
地板
zjgtan|  楼主 | 2013-3-8 12:34 | 只看该作者
jjjyufan 发表于 2013-3-8 12:29
贴你的图来看看
345 哪个引脚上的数据啊?

前面三张图是L3G4200D的,后面三张图是ADXL345的

使用特权

评论回复
5
zjgtan|  楼主 | 2013-3-8 12:34 | 只看该作者
jjjyufan 发表于 2013-3-8 12:29
贴你的图来看看
345 哪个引脚上的数据啊?

直接通过I2C口读取的数据

使用特权

评论回复
6
少先队员| | 2013-3-8 12:41 | 只看该作者
这两个都用过,偶尔有噪声,不过没你这么严重啊,我简单做了个滤波就好了

使用特权

评论回复
7
少先队员| | 2013-3-8 12:41 | 只看该作者
你采集速度多少

使用特权

评论回复
8
zjgtan|  楼主 | 2013-3-8 13:05 | 只看该作者
少先队员 发表于 2013-3-8 12:41
你采集速度多少

100HZ

使用特权

评论回复
9
zjgtan|  楼主 | 2013-3-8 13:06 | 只看该作者
zjgtan 发表于 2013-3-8 13:05
100HZ

这个是ADXL345的初始化
   Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式
  // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
   Single_Write(ADXL345_Addr,0x2C,0x08);   //速率设定为100hz 参考pdf13页
   Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页
   Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
   Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页

使用特权

评论回复
10
少先队员| | 2013-3-8 14:22 | 只看该作者
#include "I2C.H"
#include "DEV_CONFIG.H"
#define  ADXL345_ADDR           0x3A

#define XL345_DEVID             0x00
#define XL345_THRESH_TAP        0x1d
#define XL345_OFSX              0x1e
#define XL345_OFSY              0x1f
#define XL345_OFSZ              0x20
#define XL345_DUR               0x21
#define XL345_LATENT            0x22
#define XL345_WINDOW            0x23
#define XL345_THRESH_ACT        0x24
#define XL345_THRESH_INACT      0x25
#define XL345_TIME_INACT        0x26
#define XL345_ACT_INACT_CTL     0x27
#define XL345_THRESH_FF         0x28
#define XL345_TIME_FF           0x29
#define XL345_TAP_AXES          0x2a
#define XL345_ACT_TAP_STATUS    0x2b
#define XL345_BW_RATE           0x2c
#define XL345_POWER_CTL         0x2d
#define XL345_INT_ENABLE        0x2e
#define XL345_INT_MAP           0x2f
#define XL345_INT_SOURCE        0x30
#define XL345_DATA_FORMAT       0x31
#define XL345_DATAX0            0x32
#define XL345_DATAX1            0x33
#define XL345_DATAY0            0x34
#define XL345_DATAY1            0x35
#define XL345_DATAZ0            0x36
#define XL345_DATAZ1            0x37
#define XL345_FIFO_CTL          0x38
#define XL345_FIFO_STATUS       0x39

unsigned char ADXL345_Data[6];
void ADXL345_Init()
{
    I2C_Write(ADXL345_ADDR, XL345_POWER_CTL, 0x00);                 //电源控制 待机初始化
    I2C_Write(ADXL345_ADDR, XL345_DATA_FORMAT, cfg_DATA_FORMAT);    //数据格式:全分辨率4mg/LSB,16g范围,右对齐,高电平INT
    I2C_Write(ADXL345_ADDR, XL345_BW_RATE,cfg_BW_RATE);             //输出速率 12.5Hz
    I2C_Write(ADXL345_ADDR, XL345_INT_ENABLE,0x80);                 //中断允许 DATA_RDY
    I2C_Write(ADXL345_ADDR, XL345_INT_MAP,0x7f);                    //数据中断发送到INT1
    I2C_Write(ADXL345_ADDR, XL345_TAP_AXES,cfg_TAP_AXES);           //敲击轴设定
    I2C_Write(ADXL345_ADDR, XL345_THRESH_TAP,cfg_THRESH_TAP);       //敲击阀值 62.5mg/LSB
    I2C_Write(ADXL345_ADDR, XL345_DUR,cfg_DUR);                     //高g持续最大时间 0.625ms/LSB
    I2C_Write(ADXL345_ADDR, XL345_LATENT,cfg_LATENT);               //延时时间为 1.25 ms/LSB
    I2C_Write(ADXL345_ADDR, XL345_WINDOW,cfg_WINDOW);               //捕捉窗口时间为 1.25 ms/LSB
    I2C_Write(ADXL345_ADDR, XL345_OFSX,cfg_OFSX);                   //X补偿
    I2C_Write(ADXL345_ADDR, XL345_OFSY,cfg_OFSY);                   //Y补偿
    I2C_Write(ADXL345_ADDR, XL345_OFSZ,cfg_OFSZ);                   //Z补偿
    I2C_Write(ADXL345_ADDR, XL345_POWER_CTL,0x08);                  //开始测量
}

void ADXL345_ReadData()
{
    unsigned char i;
    I2C_Start();                    //起始信号
    I2C_SendByte(ADXL345_ADDR);     //发送设备地址+写信号
    I2C_SendByte(XL345_DATAX0);     //发送存储单元地址
    I2C_Start();
    I2C_SendByte(ADXL345_ADDR+1);
    for (i=0; i<6; i++)
    {
        ADXL345_Data[i] = I2C_RecvByte();
        if (i == 5)
        {
            I2C_SendACK(1);         //最后一个数据需要会NAK
        }
        else
        {
            I2C_SendACK(0);         //回应ACK
        }
    }
    I2C_Stop();                     //停止信号
}

unsigned char Read_ADXL345_Byte(unsigned char addr)
{
    unsigned temp;
    temp = I2C_Read(ADXL345_ADDR, addr);
    return(temp);
}

使用特权

评论回复
11
lark100| | 2013-3-8 23:42 | 只看该作者
陀螺和加速度计最好装在固定的工装上,减小外界振动干扰;其次看看电源是不是噪声大;最后检查检查软件吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

92

帖子

0

粉丝