搜索
bottom↓
回复: 47

求助:L3G4200 静止时候 数据有跳变

[复制链接]

出0入0汤圆

发表于 2011-10-26 13:25:04 | 显示全部楼层 |阅读模式
RT,静止的时候,L3G4200D AD值有较频繁的跳变,比如:
第一次:
X_O_L:255
X_O_H:255
第二次:
X_O_L:0
X_O_H:255

第三次:
X_O_L:253
X_O_H:255
,XYZ都有这种情况,很奇怪的现象,我原先怀疑是输出数据的高低字节不是同一个采样周期,使能 BDU =1,依旧会有这种问题(我采样周期是480Hz,陀螺仪的ODR是800Hz),请教下各位,什么原因可能会导致的这种情况?谢谢。
附1-初始化配置:
Wt_L3G4200_Reg(CTRL_REG1,0xf8);
Wt_L3G4200_Reg(CTRL_REG3,0);
Wt_L3G4200_Reg(CTRL_REG4,(1<<7)|(3<<4));
Wt_L3G4200_Reg(CTRL_REG5,0);
附2-数据读取:
  Buf[0]=SENSOR_SIGN[0]*(int16_t)((Rd_L3G4200_Reg(OUT_X_H)<<8) | Rd_L3G4200_Reg(OUT_X_L));
  Buf[1]=SENSOR_SIGN[1]*(int16_t)((Rd_L3G4200_Reg(OUT_Y_H)<<8) | Rd_L3G4200_Reg(OUT_Y_L));
  Buf[2]=SENSOR_SIGN[2]*(int16_t)((Rd_L3G4200_Reg(OUT_Z_H)<<8) | Rd_L3G4200_Reg(OUT_Z_L));

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-10-26 13:27:44 | 显示全部楼层
回复【楼主位】laber_1911
-----------------------------------------------------------------------

自己顶下,呵呵。

出0入0汤圆

发表于 2011-10-29 16:00:41 | 显示全部楼层
楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)


L3G4200问题尖峰 (原文件名:L3G4200问题.jpg)

如果读数速度比器件更新速度快的时候就没有这个问题

出0入0汤圆

发表于 2011-10-29 16:06:19 | 显示全部楼层
看了看好像就是一样的问题不。。
第一次:
X_O_L:255
X_O_H:255
(也就是 -1)
第二次:
X_O_L:0
X_O_H:255
(-256?)
第三次:
X_O_L:253
X_O_H:255
(-2)
也是会出现这样的跳变尖峰。不知道是怎么回事。。

出0入0汤圆

发表于 2011-10-30 09:28:32 | 显示全部楼层
我的很正常啊。。更新速度是800hz 读取速度250hz 读出来没有跳变的。
Z轴基本都在+-30以内 ,x轴在+-70 ,y轴数据在+-90

我是一次性连续读取6个寄存器的数据的,LZ试试?单个读取的话可能会遇到数据更新的问题。这个传感器本身输出的数据就飘得很夸张。

我的很奇怪的一点就是 数据的offset 很夸张,但都是正或负1600左右,加上offset 后数据没有问题。

出0入0汤圆

发表于 2011-10-30 11:37:08 | 显示全部楼层
我也觉得很正常,我用的ITG3205基本上三个轴的跳动范围也和阿嘉说的一样,估计现有的技术水平就是这样.

至于OFFSET,我是用的测量100个初始数据,然后平均,得出OFFSET..

出0入0汤圆

发表于 2011-10-30 11:51:24 | 显示全部楼层
回复【4楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

这么高的offset是因为内部的滤波器设置有问题....

很多问题是因为滤波器的设置导致的...详情看Datasheet AN3393 TA0343....

跳动很小....图是陀螺积分出来的角度, 单位是0.01度...线不平是Offset不是整数的问题...程序全部是整型运算...


(原文件名:TM截图未命名.png)

出0入0汤圆

发表于 2011-10-30 14:49:39 | 显示全部楼层
是吗?那我试试换其它滤波看看.

出0入0汤圆

发表于 2011-10-30 15:48:47 | 显示全部楼层
看不到你的图,我换其它滤波跳变也差不多...

l3g4200能积到0.01度的精度???我还差得远,我的互补滤波做出来才0.2度左右的精度.

出0入0汤圆

发表于 2011-10-30 18:28:41 | 显示全部楼层
回复【7楼】oldbreadman  
-----------------------------------------------------------------------

是指L3G4200的滤波器设置....

这个是互补滤波后的结果...单位也是0.01度...当然了...只是达到这个分辨率而已...

(原文件名:TM截图未命名.png)

出0入0汤圆

发表于 2011-10-30 18:47:56 | 显示全部楼层
回复【4楼】majianjia  阿嘉^_^
我的很正常啊。。更新速度是800hz 读取速度250hz 读出来没有跳变的。
z轴基本都在+-30以内 ,x轴在+-70 ,y轴数据在+-90
我是一次性连续读取6个寄存器的数据的,lz试试?单个读取的话可能会遇到数据更新的问题。这个传感器本身输出的数据就飘得很夸张。
我的很奇怪的一点就是 数据的offset 很夸张,但都是正或负1600左右,加上offset 后数据没有问题。
-----------------------------------------------------------------------

不知道楼主的是怎么读的,但是我的就是一次性连续读6个寄存器的。
不知道阿嘉的初始化是怎么初始化的,能提供以下吗?
我们的是这样:
        //Write 0xCF = 11/00/1/111 to CTRL_REG1
        //Configure :
        //800Hz output data rate
        I2C_MyWriteReg(L3G4200_ADDR, 0x20, 0xCF);
        //No HPF
        I2C_MyWriteReg(L3G4200_ADDR, 0x21, 0x00);
        //Write        0x08 = 00/001/000 to CTRL_REG3
        //Connect Data Ready signal to DRY/INT2 pin
        I2C_MyWriteReg(L3G4200_ADDR, 0x22, 0x08);
        //Write        00/01/0000 to CTRL_REG4
        //Configure full scale 500 dps , determine 17.5 mdps/LSB                  
        I2C_MyWriteReg(L3G4200_ADDR, 0x23, 0x10);
        //Write 0/0/*/0/11/11 to CTRL_REG5
        //Enable LPF2,Disable HPF for output and interrupt
        I2C_MyWriteReg(L3G4200_ADDR, 0x24, 0x0F);
是不是设置有什么问题?
求教~~

出0入0汤圆

发表于 2011-10-30 18:53:22 | 显示全部楼层
另外,我们用的是淘宝上买的现成的L3G4200模块。
http://item.taobao.com/item.htm?id=12738948025
不知道哪位用过没,有什么经验或者问题,有遇到这种情况吗?
不过还是觉得是自己设置可能有问题……

出0入0汤圆

发表于 2011-10-30 19:11:44 | 显示全部楼层
L3G4200D是什么呀?不懂~~~~

出0入0汤圆

发表于 2011-10-31 16:08:50 | 显示全部楼层
我对它内部的高通低通无限怨念…
大家都是怎么设置这两个的呢??我很想知道!

出0入0汤圆

发表于 2011-10-31 16:10:39 | 显示全部楼层
回复【11楼】wang6830210  
-----------------------------------------------------------------------

我下午放学回去看看再贴出来。我的OFFSET那么大,按LSSSS说的,应该是高通低通设置错了。我的没什么参考价值。

出0入0汤圆

发表于 2011-10-31 16:55:46 | 显示全部楼层
回复【14楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

        CS_GYROSCOPE;
        SPISendnWait(0x8F);
        if(SPIRecenWait() != 0xD3)
        {
                return 1;
        }
        US_GYROSCOPE;
        CS_GYROSCOPE;
        SPISendnWait(0x60);//从0x20开始连续写数据
        SPISendnWait(0x00);//20 POWER-Down
        SPISendnWait(0x00);//21 高通滤波器
        SPISendnWait(0x08);//22 INT推拉 INT2:DRDY
        SPISendnWait(0x90);//23 BDU模式 小端 500dps;
        SPISendnWait(0x02);//24 FIFO禁用 低通滤波器能使 高通关闭
        US_GYROSCOPE;
        CS_GYROSCOPE;
        SPISendnWait(0x2E);
        SPISendnWait(0x00);//2E bypass
        US_GYROSCOPE;
        CS_GYROSCOPE;
        SPISendnWait(0x20);
        SPISendnWait(0xEE);//20 设置速率带宽 800Hz 带宽50 三轴使能
        US_GYROSCOPE;

这是我的初始化...仅供参考(注释有可能不是对应的)...我也走了不少弯路...希望对大家有帮助~

出0入0汤圆

发表于 2011-10-31 17:50:44 | 显示全部楼层
回复【15楼】racede  
-----------------------------------------------------------------------

SPISendnWait(0x20);
SPISendnWait(0xEE);//20 设置速率带宽 800Hz 带宽50 三轴使能


为什么是0xEE?
DR1 DR0 BW1 BW0 PD Zen Yen Xen
0xEE = 1 1 1 0 1 1 1 0 ?

出0入0汤圆

发表于 2011-10-31 17:57:27 | 显示全部楼层
回复【13楼】majianjia 阿嘉^_^
我对它内部的高通低通无限怨念…
大家都是怎么设置这两个的呢??我很想知道!
-----------------------------------------------------------------------

低通滤波器应该就按照大概的高频噪声频率设置吧。
话说,我没怎么理解里面的高通滤波器。里面的Reference和那几个图不懂...
求高手讲解。。

出0入0汤圆

发表于 2011-10-31 18:42:07 | 显示全部楼层
回复【16楼】wang6830210  
-----------------------------------------------------------------------

我也看了你的回复才发现这个问题这里应该是0xEF...不知道是什么时候改错的...

我是Bypass模式用中断来读数据的...貌似只要Xen, Yen, Zen其中一个不为0...三轴都可以读出正确的数据...应该是有什么东西遗漏了...

出0入0汤圆

发表于 2011-10-31 19:37:43 | 显示全部楼层
啊……我们用status_reg判断,I2C读数就不行。

可能得学你的用SPI和中断读才行。。

还有,racede你的模块是自己做的吗??

出0入0汤圆

发表于 2011-10-31 20:22:37 | 显示全部楼层
以前写的

  I2C_Write(gyro_address, 0x21, 0x06); //高通滤波器设置        ,1Hz  
  I2C_Write(gyro_address, 0x23, 0xD0); //BDU=1(推荐),        BLE=1,正负500dps量程
  I2C_Write(gyro_address, 0x24, 0x12); //滤波器使能,高低通都有
  I2C_Write(gyro_address, 0x20, 0xFF); //800Hz更新速率,110hz cut-off

------------------------------------------------------------------
if( gyro_status&0x08==0x08)
         {

         GYRO_Data[0] = I2C_Read(gyro_address, 0x28);//read OUT_X_L_A (MSB)
         //Delay(1);
         GYRO_Data[1] = I2C_Read(gyro_address, 0x29);//read OUT_X_H_A (LSB)
         //Delay(1);
         GYRO_Data[2] = I2C_Read(gyro_address, 0x2A);//read OUT_Y_L_A (MSB)
         //Delay(1);
         GYRO_Data[3] = I2C_Read(gyro_address, 0x2B);//read OUT_Y_H_A (LSB)
         //Delay(1);
         GYRO_Data[4] = I2C_Read(gyro_address, 0x2C);//read OUT_Z_L_A (MSB)
         //Delay(1);
         GYRO_Data[5] = I2C_Read(gyro_address, 0x2D);//read OUT_Z_H_A (LSB)
         //=======================================


         Gx = ((GYRO_Data[0] << 8) | GYRO_Data[1]);
         Gy = ((GYRO_Data[2] << 8) | GYRO_Data[3]);
         Gz = ((GYRO_Data[4] << 8) | GYRO_Data[5]);

         Gx-=4;//陀螺采样值偏移量修正,通过实验方法获得修正量,保证时漂最小化
         Gy+=5;
         Gz+=27;

         
         //if(Gx>10||Gx<-10)
         Gx_ave=(Gx_new+Gx)/2;
        // if(Gy>10||Gy<-10)
         Gy_ave=(Gy_new+Gy)/2;
        // if(Gz>10||Gz<-10)
         Gz_ave=(Gz_new+Gz)/2;
       
        /*
         Gx_ave=Gx_ave*3/4+Gx/4;
         Gy_ave=Gy_ave*3/4+Gy/4;
         Gz_ave=Gz_ave*3/4+Gz/4;
        */

         Gx_new=Gx;
         Gy_new=Gy;
         Gz_new=Gz;
         
         //if(Gy_ave>40||Gy_ave<-40)
         roll2_dt=(float)Gy_ave*17.5*0.95*2.5/1000.0;         //17.5是灵敏度,0.95是灵敏度修正系数(实验得到),2.5是采样时间间隔
         //if(Gx_ave>40||Gx_ave<-40)
         pitch2_dt=(float)Gx_ave*17.5*0.95*2.5/1000.0;
         //if(Gz_ave>40||Gz_ave<-40)
         yaw2_dt=(float)Gz_ave*17.5*2.5/1000.0;

         roll2+=roll2_dt/1000;
         pitch2+=pitch2_dt/1000;
         yaw2+=yaw2_dt/1000;

出0入0汤圆

发表于 2011-10-31 21:16:19 | 显示全部楼层
...都试过,没用...   
各位觉得出现上面图里面的情况是为什么呢?我看网上也有其他人碰到过,不过没有解决。

--------------------------------------------————-----
http://bbs.eeworld.com.cn/thread-254932-1-1.html

l3g4200的陀螺仪读数老出问题
请问有谁用过这个陀螺仪吗

我用i2c接口,读角速度值,高位经常读出255,低位没这个问题。
不知道为什么。

出0入0汤圆

发表于 2011-10-31 22:20:26 | 显示全部楼层
回复【19楼】wang6830210  
-----------------------------------------------------------------------

嗯....洞洞板上焊的...

出0入0汤圆

发表于 2011-11-1 16:09:24 | 显示全部楼层
拜...
那可能是模块设计的问题。。自己弄个试试

出0入0汤圆

 楼主| 发表于 2011-11-2 11:41:30 | 显示全部楼层
回复【2楼】wang6830210
楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)

<center>
l3g4200问题尖峰
-----------------------------------------------------------------------

我的就是这样,连续读6个数据寄存器之后,有所缓解,没有那么多跳变了,但是还是有跳变。

出0入0汤圆

 楼主| 发表于 2011-11-2 12:24:58 | 显示全部楼层
回复【20楼】zht9961020
-----------------------------------------------------------------------

谢谢,照此修改控制寄存器还是有跳变。

出0入0汤圆

发表于 2011-11-2 15:19:16 | 显示全部楼层
回复【25楼】laber_1911  
-----------------------------------------------------------------------

我的静止时的偏移在0.5度左右

出0入0汤圆

 楼主| 发表于 2011-11-2 15:27:41 | 显示全部楼层
回复【27楼】adispring
-----------------------------------------------------------------------

嗯,这个与选择传感器量程有关(对应的灵敏度不一样),最好看下AD值有没有跳变(255附近)。

出0入0汤圆

发表于 2011-11-2 17:14:16 | 显示全部楼层
回复【20楼】zht9961020  
以前写的

  i2c_write(gyro_address, 0x21, 0x06); //高通滤波器设置        ,1hz  
  i2c_write(gyro_address, 0x23, 0xd0); //bdu=1(推荐),        ble=1,正负500dps量程
  i2c_write(gyro_address, 0x24, 0x12); //滤波器使能,高低通都有
  i2c_write(gyro_address, 0x20, 0xff); //800hz更新速率,110hz cut-off
------------------------------------------------------------------
if( gyro_status&amp;0x08==0x08)
         {
         gyro_data[0] = i2c_read(gyro_address, 0x28);......
-----------------------------------------------------------------------


请教。如果我按你的设置后,OFFSET正常了,只有个位数,但是
转动一个角度,L3G4200的数据积分后会在5秒内自动衰减为0,。。。这是怎么回事?
而且积分好像跟转动的速度也有关,转动快得话,直接飙到几百度。

出0入0汤圆

发表于 2011-11-2 18:57:24 | 显示全部楼层
上代码看看吧,还有采样周期是多少?

出0入0汤圆

发表于 2011-11-2 23:32:20 | 显示全部楼层
回复【29楼】majianjia  阿嘉^_^
-----------------------------------------------------------------------

高通滤波禁用就好

出0入0汤圆

发表于 2011-11-5 09:56:28 | 显示全部楼层
回复【24楼】laber_1911  
回复【2楼】wang6830210
楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)

-----------------------------------------------------------------------

我读数的问题解决了。
用它的DRDY管脚来触发外部中断进行读数,不会出这样的问题。所以个人感觉读数错误可能和不同步有点关系。。。
但是同样用ST的LSM303DLH,却没有L3G4200这样的问题,无奈。

出0入0汤圆

 楼主| 发表于 2011-11-5 19:50:50 | 显示全部楼层
回复【32楼】wang6830210
-----------------------------------------------------------------------
我也试下,使用DRDY。

出0入0汤圆

 楼主| 发表于 2011-12-8 13:40:00 | 显示全部楼层
回复【32楼】wang6830210
回复【24楼】laber_1911   
回复【2楼】wang6830210  
楼主,你有没有遇到这样的问题:  
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)  
-----------------------------------------------------------------------
我读数的问题解决了。
用它的drdy管脚来触发外部中断进行读数,不会出这样的问题。所以个人感觉读数错误可能和不同步有点关系。。。
但是同样用st的lsm303dlh,却没有l3g4200这样的问题,无奈。
-----------------------------------------------------------------------

坑爹啊,使用DRDY,在ODR 800Hz下依旧有跳变,在400Hz下没有,不知道为啥了。

出0入0汤圆

发表于 2011-12-23 12:33:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-31 17:43:33 | 显示全部楼层
MARK,这帖帮助很大,按照前面几楼的配置,跳变小了很多。

出0入0汤圆

发表于 2012-1-4 09:48:20 | 显示全部楼层
回复【20楼】zht9961020  
-----------------------------------------------------------------------

高地位好像错了吧?
GYRO_Data[0] = I2C_Read(gyro_address, 0x28);//read OUT_X_L_A (MSB)

你后面怎么标:MSB呢?应该是LSB吧?

GYRO_Data[1] = I2C_Read(gyro_address, 0x29);//read OUT_X_H_A (LSB)
Gx = ((GYRO_Data[0] << 8) | GYRO_Data[1]);

出0入0汤圆

发表于 2012-1-13 19:41:55 | 显示全部楼层
回复【13楼】majianjia 阿嘉^_^
-----------------------------------------------------------------------

我开始做的时候是不开滤波,然后看跳动范围,设置带宽然后就是程序上,限定过大的数值(离谱的)。最开始那个只有Y是跳动的,X和Y都不跳动。以为是自己手法不行,把片子焊接坏了,毕竟不是热风焊。然后又焊接了一块。但是调试的时候不是原来的程序了,那个程序没了,,和你的情况差不多。都有跳动,30,50不等,最可惜的是我辛苦焊的传感器在学校丢了。

出0入0汤圆

发表于 2012-1-13 21:07:46 | 显示全部楼层
回复【22楼】racede
-----------------------------------------------------------------------

能把电路图发出来吗

出0入0汤圆

发表于 2012-2-22 16:46:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-2 17:54:54 | 显示全部楼层
laber_1911 发表于 2011-12-8 13:40
回复【32楼】wang6830210
回复【24楼】laber_1911   
回复【2楼】wang6830210  

回去试试看去。

出0入0汤圆

发表于 2012-8-2 21:54:39 | 显示全部楼层
即使是使用INT2脚上的DRDY信号,在800HZ输出的时候还是有这种尖峰的,400hz下就一次也不会出现了。

出0入0汤圆

发表于 2012-10-20 15:43:41 | 显示全部楼层
哈哈,250左右的尖峰

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2012-10-21 22:23:26 | 显示全部楼层
majianjia 发表于 2011-11-2 17:14
回复【20楼】zht9961020  
以前写的

你说的几百度应该是角速度吧,而且不转动了角速度没了值就变0了。

出0入0汤圆

发表于 2012-10-21 22:25:30 | 显示全部楼层
Single_WriteL3G4200D(CTRL_REG1, 0xBF);   // 数据输出频率400Hz,低通110Hz
   Single_WriteL3G4200D(CTRL_REG2, 0x27);   // 高通0.2Hz
   Single_WriteL3G4200D(CTRL_REG3, 0x08);   //
   Single_WriteL3G4200D(CTRL_REG4, 0x10);  //+-500dps 0x10   +-2000dps 0x30
   Single_WriteL3G4200D(CTRL_REG5, 0x10);

我的是这样设置的,完全没有跳变,静止时的偏置最多也就0,1间变化,我用的是集成模块

出0入0汤圆

发表于 2012-11-18 21:41:09 | 显示全部楼层
zht9961020 发表于 2011-10-31 20:22
以前写的

  I2C_Write(gyro_address, 0x21, 0x06); //高通滤波器设置        ,1Hz  

大哥  请问你这修正偏移量和偏移系数是怎样通过实验得到的啊??
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-4 10:22

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

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