chenhuizai210 发表于 2012-1-4 21:05:51

有关L3G4200D的FIFO

前段时间,用STM32读L3G4200D数据,数据基本正确,基本成功。
使用的是直接读数的方式。设置的数据更新速率为100Hz。
但是,有个问题就是,如果程序循环一周的速度比陀螺仪更新速率低或者不配套的话,陀螺仪新更新的数据可能会被抹掉。
举个例子:
比如L3G4200D的更新速度是800Hz,即每1.25ms更新一次数据,CPU芯片在while(1)循环里循环一次的速度是500Hz,即每2ms循环一次
有人可能觉得这个cpu的速度有点低,其实我觉得对于大多数单片机,500Hz已经很快了,程序中有许多地方会需要延时、等待等

如果L3G4200D采用默认的FIFO模式,即bypass Mode时,芯片仅能保存一个数据。

那么FIFO就是用来使得两级相互匹配的。新的数据会存到FIFO里而不会丢,cpu每次都把FIFO里的数据读完。
L3G4200D自带能存32次数据的FIFO,但是我发现大多数人都不用这个,感觉有点可惜。
我今天用了下,感觉蛮好的。把L3G4200D的datasheet研究了很多次。依然有很多疑问:
1、用FIFO读数据时,读数的地址是否还是原来的地址?我是这样认为的
2、我没有用FIFO空或者满的事件来启动中断,而是在程序主循环里每次读FIFO寄存器的标志位,来判断FIFO是否为空,如果非空则读数据。一般而言,就算L3G4200D的更新速度是800Hz,我cpu的速度是100Hz,也不会丢失数据,因为FIFO里能存32组数据,cpu循环一次,FIFO里最多存9-10组数据,我一口气把这几个数据读完,并处理,这样FIFO又为空了,继续接着循环。
3、我用的是FIFO的STREAM_MODE模式
具体细节,在datasheet上都很详细。但是积分出来的值很小。不知道是什么原因

chenhuizai210 发表于 2012-1-4 22:15:47

问题已经解决了。
我之前用的是串口调试,数据不对劲,怀疑是串口影响了数据,就算有FIFO,但存32组数据的时间还是很快的。
我把串口输出设成循环100次输出一次,这样数据就很正确了。

HYZ1989 发表于 2012-2-13 10:10:44

mark,我刚开始研究这个传感器,无奈自己英语太水了!感谢楼主的分享!
页: [1]
查看完整版本: 有关L3G4200D的FIFO