搜索
bottom↓
回复: 20

ADXL345加速度传感器,Z轴值不对,XY轴正确,估计是IC坏...

[复制链接]

出0入0汤圆

发表于 2012-12-21 09:35:31 | 显示全部楼层 |阅读模式
理论正确值:
ADXL345水平正面放置,正常的值应该是: X:0 , Y:0,  Z:1g (即1000mg);
对于13bit模式,+/-16g ,一个LSB对应3.9mg;
静止放置时,Z轴1000mg, 对应的寄存器值应该是 255左右, 1000mg / 393mg = 255 ;


实际读出的值:
我现在读出的值是 X:0 , Y:0,  Z: 1220;
静止时Z轴的值怎么会那么大,这不是误差,误差这么大哪敢用?
移动ADXL345, XYZ值都会就,且XY都是对的,Z会变,但读数不正确;

上网查过,有的人说Z轴容易坏,有这种说法没??

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-12-21 14:26:48 | 显示全部楼层
你的DATAZ0,DATAZ1寄存器输出是左对齐还是右对齐?

出0入0汤圆

 楼主| 发表于 2012-12-21 15:20:01 | 显示全部楼层
初始化,读出的ID都是正确的,X和Y轴都是正确的,不同方向寄存器值范围:0到320左右;

但Z轴不对,不同方向寄存器值范围:700到1220左右;  
水平放置时Z轴寄存器值是1220, 反方向放置是700; (正确应该是: 255 ,0)

u8 ADXL345_Init(void)
{                                  
        IIC_Init();

        if(ADXL345_RD_Reg(DEVICE_ID)==0XE5)        //读取器件ID
        {  
                ADXL345_WR_Reg(DATA_FORMAT,0X2B);  //13位全分辨率,输出数据右对齐,16g量程
                ADXL345_WR_Reg(BW_RATE,0x0A);           //数据输出速度为100Hz
                ADXL345_WR_Reg(POWER_CTL,0x28);           //链接使能,测量模式
                ADXL345_WR_Reg(INT_ENABLE,0x00);   //不使用中断                 
                 ADXL345_WR_Reg(OFSX,0x00);
                ADXL345_WR_Reg(OFSY,0x00);
                ADXL345_WR_Reg(OFSZ,0x00);       
               
                return 0;
        }
                               
        return 1;                                                                             
}

//x,y,z:读取到的数据
void ADXL345_RD_XYZ(short *x,short *y,short *z)
{
        u8 buf[6];
        u8 i;
       
        IIC_Start();                                   
        IIC_Send_Byte(ADXL_WRITE);        //发送写器件指令         
        IIC_Wait_Ack();          
  IIC_Send_Byte(0x32);                   //发送寄存器地址(数据缓存的起始地址为0X32)
        IIC_Wait_Ack();                                                                                                              

        IIC_Start();                                      //重新启动
        IIC_Send_Byte(ADXL_READ);        //发送读器件指令
        IIC_Wait_Ack();
       
        for(i=0;i<6;i++)
        {
                if(i==5)        buf[i]=IIC_Read_Byte(0);        //读取一个字节,不继续再读,发送NACK  
                else                         buf[i]=IIC_Read_Byte(1);        //读取一个字节,继续读,发送ACK
        }       
                          
        IIC_Stop();                                        //产生一个停止条件
   
        *x=(short)((((u16)buf[1]<<8)+buf[0]));
        *y=(short)((((u16)buf[3]<<8)+buf[2]));             
        *z=(short)((((u16)buf[5]<<8)+buf[4]));   
}

出0入0汤圆

 楼主| 发表于 2012-12-22 09:26:16 | 显示全部楼层
输出数据右对齐,16g量程,13位全分辨率,

出0入0汤圆

发表于 2012-12-22 10:35:41 来自手机 | 显示全部楼层
本帖最后由 valley 于 2012-12-22 12:51 编辑

*x=(short)((((u16)buf[1]<<8)+buf[0]))
----->
这里buf[0]、buf[2]、buf[4]被扩展成s16了?用“|”操作。

出0入0汤圆

发表于 2013-3-15 14:11:36 | 显示全部楼层
楼主问题找到了吗 我测试也是Z轴基本不变化。X Y正常

出0入0汤圆

发表于 2013-3-16 19:15:45 | 显示全部楼层
还有人遇到这问题吗?难道正是IC容易坏Z轴?

出0入0汤圆

发表于 2013-3-21 17:31:20 | 显示全部楼层
我也遇到类似的状况,想问一下大家,你们焊接的温度是多少?

出0入0汤圆

发表于 2013-3-21 17:36:26 | 显示全部楼层
楼主用的345呀  好用不  我用的是202  不运动的时候都没有东西输出的  不好用

出0入0汤圆

发表于 2013-3-21 17:39:11 | 显示全部楼层
本帖最后由 fnems 于 2013-3-21 17:49 编辑

关注一下。碰巧最近也在用。自己的正常

三轴抓到的大概是这样:
-13,6,223
-16,6,225
-12,5,227
-10,4,222
-10,4,223
-7,5,225
-8,4,223
-11,2,221
-13,1,222
-11,3,221
-11,4,223
-11,4,223
-11,3,222

我的初始化:
  1.   i2c_set_addr(IIC_ADXL345_ALTR);
  2.   /* Self-test off, SPI off, INT active high, full-res on, range=8g */
  3.   i2c_wr_reg(REG_ADXL345_DATAFMT, 0x0A);
  4.   /* Output rate: 50Hz
  5.   i2c_wr_reg(REG_ADXL345_BWRATE,  0x09); */
  6.   /* 200Hz */
  7.   i2c_wr_reg(REG_ADXL345_BWRATE,  0x0B);
  8.   
  9.   /* tap detect: threshold=1.6g, */
  10.   /* duration=10ms, latency=25ms, window=150ms */
  11.   i2c_wr_reg(REG_ADXL345_TAPTH,  72 );  /* 62.5 mg/LSB */
  12.   i2c_wr_reg(REG_ADXL345_TAPDUR, 15 );  /* 625  μs/LSB */
  13.   i2c_wr_reg(REG_ADXL345_TAPLAT, 40 );  /* 1.25 ms/LSB */
  14.   i2c_wr_reg(REG_ADXL345_TAPWND, 160);  /* 1.25 ms/LSB */
  15.   /* supres off, y axis */
  16.   i2c_wr_reg(REG_ADXL345_TAPAXE, 0x02);
  17.   
  18.   
  19.   /* Start measurement */
  20.   i2c_wr_reg(REG_ADXL345_PWRCTL,  0x08);

  21.   /* Interrupt enable */
  22.   /* i2c_wr_reg(REG_ADXL345_INTEN,   0x80); */
  23.   i2c_wr_reg(REG_ADXL345_INTEN, SETB(INTR_DATA_READY)
  24.                               | SETB(INTR_SINGLE_TAP)
  25.                               | SETB(INTR_DOUBLE_TAP));
复制代码
另外,建议LZ把读到的原始数据用UART发到电脑上,
这样调试起来应该能看出来是自己固件的数据处理上出问题还是芯片出问题。

我用的是网上买的模块,硬件问题就不用怎么考虑了。

还有,ADXL345有两个供电的,分别是数字电路和模拟电路的供电。LZ看看都接上了没。
读ID成功只能说明数字接口部分正常工作

出0入0汤圆

发表于 2013-5-23 17:23:40 | 显示全部楼层
有人解了没啊?同样问题中。。。。

出0入0汤圆

发表于 2013-5-24 11:03:22 | 显示全部楼层
To:fnems
想问一下你的芯片,详细的Part Number.
To:yy19900128
你看看你的Part Number是不是和我的类似?
我换了3片都存在同样的问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-9 15:46:00 | 显示全部楼层
有人解决了吗,也遇到同样的问题,X,Y轴数据正常,Z轴变化是对的,但是初始值不对,初始值是5g,应该是1g才对啊

出0入0汤圆

发表于 2013-8-16 08:33:28 | 显示全部楼层
我的也是119批次,同样存在这个问题。请问有人解决了吗?

出0入0汤圆

发表于 2013-8-20 12:18:12 | 显示全部楼层
我也碰到同样的问题,我用STM32 IO模拟I2C,ID和其他寄存器读写都正常,水平放置时读出来的数据感觉不对哦。
datax:-41
datay:2
dataz:1682
datax:-75
datay:6
dataz:1684
按我的程序13bit,+/-16g,dataz不应该这么大哦,是芯片坏了吗?
还有个问题请教:如何用这个芯片来检测某个物体没有运动啊?希望有详细的流程说明,,有知道请大侠指教.
程序如下:
void ADX345_IIC_Init(void)
{                       
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                             
        //配置PB6 PB7 为开漏输出  刷新频率为10Mhz
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          //应用配置到GPIOB
          GPIO_Init(GPIOB, &GPIO_InitStructure);

        ADX345_IICwriteByte(0xa6,0x31,0x0B);   //测量范围,正负16g,13位模式
    ADX345_IICwriteByte(0xa6,0x2C,0x08);   //速率设定为12.5 参考pdf13页
    ADX345_IICwriteByte(0xa6,0x2D,0x08);   //选择电源模式   参考pdf24页
    ADX345_IICwriteByte(0xa6,0x2E,0x80);   //使能 DATA_READY 中断
    ADX345_IICwriteByte(0xa6,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
    ADX345_IICwriteByte(0xa6,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
    ADX345_IICwriteByte(0xa6,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
    //ADX345_IICwriteByte(0xa6,0x38,0x9f);
}

void ADX345Read()
{
s16 datax,datay,dataz;
uint8_t outbuf[100]={0x01,0x3c,0,0,0,0,0,0x3d};
outbuf[0] = ADX345_I2C_ReadOneByte(0xa6,0x00);//读到的是0xE5
                outbuf[1] = ADX345_I2C_ReadOneByte(0xa6,0x31);//读到的是//0x0b
                ADX345_IICreadBytes(0xa6,0x32,0x06,outbuf+2);

        datax =  (outbuf[3]<<8) + outbuf[2];
        datay =  (outbuf[5]<<8) + outbuf[4];
        dataz =  (outbuf[7]<<8) + outbuf[6];
}

出0入0汤圆

发表于 2013-9-6 19:10:17 | 显示全部楼层
我的也是一样的情况,Z轴读出来1200多

出0入0汤圆

发表于 2013-9-6 19:18:19 | 显示全部楼层
正常,如果LZ是手工焊,这IC的Z轴就是容易坏,公司用这做产品连贴片回流焊温度高一点都不行,超级容易坏

出0入0汤圆

发表于 2013-9-6 20:12:23 | 显示全部楼层
car_software 发表于 2012-12-21 15:20
初始化,读出的ID都是正确的,X和Y轴都是正确的,不同方向寄存器值范围:0到320左右;

但Z轴不对,不同方 ...

朋友,ADXL345 Z轴问题解决了吗?我也碰到同样的问题,能帮忙指导一下吗?谢谢~

出0入0汤圆

发表于 2013-11-8 23:20:17 | 显示全部楼层
我也遇到类似的问题 STM8S003FP6+ADXL345+四线SPI  X轴读出来的数值不变 后来我从0x32开始连续读了8个数据,发现在读来X轴数据前多读了1到2字节的无效数据 改用模拟SPI后读取正常 得出结论 是 STM8S003FP6+四线SPI读取时序有问题 具体怎样改正还请大神研究 第一次回帖 以上纯属个人观点 希望能帮到其它有需要的人

出0入0汤圆

发表于 2014-1-9 22:34:02 | 显示全部楼层
我用adxl345感觉是正常的,但是绕z轴来回晃的时候,x和y的值变化的很剧烈,有时到100多,怀疑这玩意不行

出0入0汤圆

发表于 2014-7-11 07:45:14 | 显示全部楼层
我也遇到同样问题,温度还没到焊膏融化温度时,Z轴就是1000多?是否这个片子很多假的?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 15:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表