laber_1911 发表于 2011-10-26 13:25:04

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

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=SENSOR_SIGN*(int16_t)((Rd_L3G4200_Reg(OUT_X_H)<<8) | Rd_L3G4200_Reg(OUT_X_L));
Buf=SENSOR_SIGN*(int16_t)((Rd_L3G4200_Reg(OUT_Y_H)<<8) | Rd_L3G4200_Reg(OUT_Y_L));
Buf=SENSOR_SIGN*(int16_t)((Rd_L3G4200_Reg(OUT_Z_H)<<8) | Rd_L3G4200_Reg(OUT_Z_L));

laber_1911 发表于 2011-10-26 13:27:44

回复【楼主位】laber_1911
-----------------------------------------------------------------------

自己顶下,呵呵。

wang6830210 发表于 2011-10-29 16:00:41

楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689891Q85TOY.jpg
L3G4200问题尖峰 (原文件名:L3G4200问题.jpg)

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

wang6830210 发表于 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)
也是会出现这样的跳变尖峰。不知道是怎么回事。。

majianjia 发表于 2011-10-30 09:28:32

我的很正常啊。。更新速度是800hz 读取速度250hz 读出来没有跳变的。
Z轴基本都在+-30以内 ,x轴在+-70 ,y轴数据在+-90

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

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

oldbreadman 发表于 2011-10-30 11:37:08

我也觉得很正常,我用的ITG3205基本上三个轴的跳动范围也和阿嘉说的一样,估计现有的技术水平就是这样.

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

racede 发表于 2011-10-30 11:51:24

回复【4楼】majianjia阿嘉^_^
-----------------------------------------------------------------------

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

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

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

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_690054ESVJ0V.png
(原文件名:TM截图未命名.png)

oldbreadman 发表于 2011-10-30 14:49:39

是吗?那我试试换其它滤波看看.

oldbreadman 发表于 2011-10-30 15:48:47

看不到你的图,我换其它滤波跳变也差不多...

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

racede 发表于 2011-10-30 18:28:41

回复【7楼】oldbreadman
-----------------------------------------------------------------------

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

这个是互补滤波后的结果...单位也是0.01度...当然了...只是达到这个分辨率而已...
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_690119WRS7VD.png
(原文件名:TM截图未命名.png)

wang6830210 发表于 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);
是不是设置有什么问题?
求教~~

wang6830210 发表于 2011-10-30 18:53:22

另外,我们用的是淘宝上买的现成的L3G4200模块。
http://item.taobao.com/item.htm?id=12738948025
不知道哪位用过没,有什么经验或者问题,有遇到这种情况吗?
不过还是觉得是自己设置可能有问题……

pc346147477 发表于 2011-10-30 19:11:44

L3G4200D是什么呀?不懂~~~~

majianjia 发表于 2011-10-31 16:08:50

我对它内部的高通低通无限怨念…
大家都是怎么设置这两个的呢??我很想知道!

majianjia 发表于 2011-10-31 16:10:39

回复【11楼】wang6830210
-----------------------------------------------------------------------

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

racede 发表于 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;

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

wang6830210 发表于 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 ?

wang6830210 发表于 2011-10-31 17:57:27

回复【13楼】majianjia 阿嘉^_^
我对它内部的高通低通无限怨念…
大家都是怎么设置这两个的呢??我很想知道!
-----------------------------------------------------------------------

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

racede 发表于 2011-10-31 18:42:07

回复【16楼】wang6830210
-----------------------------------------------------------------------

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

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

wang6830210 发表于 2011-10-31 19:37:43

啊……我们用status_reg判断,I2C读数就不行。

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

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

zht9961020 发表于 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 = I2C_Read(gyro_address, 0x28);//read OUT_X_L_A (MSB)
       //Delay(1);
       GYRO_Data = I2C_Read(gyro_address, 0x29);//read OUT_X_H_A (LSB)
       //Delay(1);
       GYRO_Data = I2C_Read(gyro_address, 0x2A);//read OUT_Y_L_A (MSB)
       //Delay(1);
       GYRO_Data = I2C_Read(gyro_address, 0x2B);//read OUT_Y_H_A (LSB)
       //Delay(1);
       GYRO_Data = I2C_Read(gyro_address, 0x2C);//read OUT_Z_L_A (MSB)
       //Delay(1);
       GYRO_Data = I2C_Read(gyro_address, 0x2D);//read OUT_Z_H_A (LSB)
       //=======================================


       Gx = ((GYRO_Data << 8) | GYRO_Data);
       Gy = ((GYRO_Data << 8) | GYRO_Data);
       Gz = ((GYRO_Data << 8) | GYRO_Data);

       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;

wang6830210 发表于 2011-10-31 21:16:19

...都试过,没用...   
各位觉得出现上面图里面的情况是为什么呢?我看网上也有其他人碰到过,不过没有解决。

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

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

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

racede 发表于 2011-10-31 22:20:26

回复【19楼】wang6830210
-----------------------------------------------------------------------

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

wang6830210 发表于 2011-11-1 16:09:24

拜...
那可能是模块设计的问题。。自己弄个试试

laber_1911 发表于 2011-11-2 11:41:30

回复【2楼】wang6830210
楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)

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

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

laber_1911 发表于 2011-11-2 12:24:58

回复【20楼】zht9961020
-----------------------------------------------------------------------

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

adispring 发表于 2011-11-2 15:19:16

回复【25楼】laber_1911
-----------------------------------------------------------------------

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

laber_1911 发表于 2011-11-2 15:27:41

回复【27楼】adispring
-----------------------------------------------------------------------

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

majianjia 发表于 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 = i2c_read(gyro_address, 0x28);......
-----------------------------------------------------------------------


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

zht9961020 发表于 2011-11-2 18:57:24

上代码看看吧,还有采样周期是多少?

racede 发表于 2011-11-2 23:32:20

回复【29楼】majianjia阿嘉^_^
-----------------------------------------------------------------------

高通滤波禁用就好

wang6830210 发表于 2011-11-5 09:56:28

回复【24楼】laber_1911
回复【2楼】wang6830210
楼主,你有没有遇到这样的问题:
当读数速度比器件更新速度慢些时,静止的读数出来会有尖峰?得到下面这样的数据图(静止的时候)

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

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

laber_1911 发表于 2011-11-5 19:50:50

回复【32楼】wang6830210
-----------------------------------------------------------------------
我也试下,使用DRDY。

laber_1911 发表于 2011-12-8 13:40:00

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

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

gc56198 发表于 2011-12-23 12:33:41

mark

killin 发表于 2011-12-31 17:43:33

MARK,这帖帮助很大,按照前面几楼的配置,跳变小了很多。

Farid 发表于 2012-1-4 09:48:20

回复【20楼】zht9961020
-----------------------------------------------------------------------

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

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

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

MrLCL 发表于 2012-1-13 19:41:55

回复【13楼】majianjia 阿嘉^_^
-----------------------------------------------------------------------

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

aricc 发表于 2012-1-13 21:07:46

回复【22楼】racede
-----------------------------------------------------------------------

能把电路图发出来吗

dujun168 发表于 2012-2-22 16:46:38

mark

aeroboy 发表于 2012-8-2 17:54:54

laber_1911 发表于 2011-12-8 13:40 static/image/common/back.gif
回复【32楼】wang6830210
回复【24楼】laber_1911   
回复【2楼】wang6830210


回去试试看去。

i8700 发表于 2012-8-2 21:54:39

即使是使用INT2脚上的DRDY信号,在800HZ输出的时候还是有这种尖峰的,400hz下就一次也不会出现了。

js200300953 发表于 2012-10-20 15:43:41

哈哈,250左右的尖峰

天天在读书 发表于 2012-10-21 22:23:26

majianjia 发表于 2011-11-2 17:14 static/image/common/back.gif
回复【20楼】zht9961020
以前写的



你说的几百度应该是角速度吧,而且不转动了角速度没了值就变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间变化,我用的是集成模块

清风阙月 发表于 2012-11-18 21:41:09

zht9961020 发表于 2011-10-31 20:22 static/image/common/back.gif
以前写的

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


大哥请问你这修正偏移量和偏移系数是怎样通过实验得到的啊??
页: [1]
查看完整版本: 求助:L3G4200 静止时候 数据有跳变