Farid 发表于 2012-1-12 14:37:14

【讨论】L3G4200D陀螺仪 对于这种补码形式数据,各位大侠是如何处理的呢?

如题,小弟在使用这个sensor时候,数据处理不好,老是会出现65532这种很大的数据。我处理的方式如下:
int xMSB = readRegister(L3G4200D_Address, 0x29);
int xLSB = readRegister(L3G4200D_Address, 0x28);
x = ((xMSB << 8) | xLSB);

求指教,多谢!

haolxy 发表于 2012-1-12 15:06:05

你把x定义成有符号的16位数据格式就OK了

Name_006 发表于 2012-1-12 16:26:38

数据 负数时是补码的形式

Farid 发表于 2012-1-12 16:34:17

回复【1楼】haolxy飞鸟
你把x定义成有符号的16位数据格式就ok了
-----------------------------------------------------------------------

signed char?

Farid 发表于 2012-1-12 16:35:21

回复【2楼】Name_006
数据 负数时是补码的形式
-----------------------------------------------------------------------

嗯 负数时是补码,这个也有处理过,不过的处理的数据还是有问题……
求具体做法,谢谢

majianjia 发表于 2012-1-12 20:17:27

直接把数据高位右移位8位后赋值给一个有符号16位变量,然后再"或"数据的低位就OK。清楚没?

unsigned char data_h, data_l;
short int value;

value = data_h;
value = value << 8;
value = value | data_l;

每一步都分开写了。

Farid 发表于 2012-1-13 10:46:54

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

按照你说的写的,sensor静止不懂时读出的数据如下:

4864-25613072
-768-17932303
3328-1025-7681
256-769-4608
-1793-12814095
-1281-10241-4865
46087681535
5120-15370
-5121-35853071
-7694096-3584
-1537-5134607
53760-769
4864-4353-769
1024-5121-2561
1792-1-3841
35842560-3584
153684486656
-307333283839
3072-3585-1537
2048512-6400
0-3841767
53760-3585
-3329-769-1025
貌似这个数据跳动很大哦

寄存器设置如下:
writeRegister(L3G4200D_Address, CTRL_REG1, 0xFF);
writeRegister(L3G4200D_Address, CTRL_REG2, 0x06);
writeRegister(L3G4200D_Address, CTRL_REG4, 0xD0);
writeRegister(L3G4200D_Address, CTRL_REG5, 0x12);

MrLCL 发表于 2012-1-13 19:02:25

回复【6楼】Farid
-----------------------------------------------------------------------

设置一下量程、带宽、滤波等等,然后就是求平均数

majianjia 发表于 2012-1-13 21:59:31

回复【6楼】Farid
-----------------------------------------------------------------------
是不是高低位弄饭了?

htjgdw 发表于 2012-1-16 09:48:08

我的10轴IMU模块例程是这样处理的:
unsigned short msb_dat,lsb_dat;
short dat;

msb_dat = 陀螺仪高8位数据;
lsb_dat = 陀螺仪低8位数据;

dat = (short)((unsigned short)msb_dat*256+lab_dat);

需要注意的是,读取陀螺仪数据是8位的,因此很多时候在不同的系统上大家都会定义读取的数据类型为unsigned char,这个类型在左移8位或者x256的时候最好先强制转换为16位无符号数,要不然有的编译器(比如Keil C51)会把移位结果仍看做8位数据和lsb相加,那样的结果自然就错了。

wjd40 发表于 2012-1-16 10:00:06

后面可能用到。mark

MrLCL 发表于 2012-1-17 20:11:51

回复【4楼】Farid
-----------------------------------------------------------------------

X-axis: FF96 LSBs = -106 LSBs = -106 * 0.00875 = -0.93 dps
Y-axis: 0045 LSBs = 69 LSBs = 69 * 0.00875 = 0.6 dps
Z-axis: FFCC LSBs = -52 LSBs = -0.46 dps

Farid 发表于 2012-1-31 15:13:10

回复【11楼】MrLCL
-----------------------------------------------------------------------

你好,请问这个平均数如何求得?我现在陀螺仪静止的时候发现数据跳动很大……现在滤波也设置了

Farid 发表于 2012-1-31 15:34:04

这个是静止的时候读数,不知道正确不,请大家指正:
X:31   Y:60Z:111
X:25   Y:56Z:-125
X:-2   Y:72Z:-81
X:-9   Y:69Z:109
X:21   Y:105Z:118
X:8   Y:69Z:84
X:-9   Y:64Z:96
X:10   Y:59Z:127
X:59   Y:68Z:65
X:21   Y:68Z:110
X:14   Y:73Z:119
X:13   Y:83Z:112
X:7   Y:81Z:106
X:-11   Y:35Z:-109
X:6   Y:72Z:102
X:-12   Y:68Z:-78
X:7   Y:61Z:-113
X:9   Y:33Z:-121
X:23   Y:89Z:-116
X:-3   Y:87Z:-117
X:45   Y:48Z:110
X:-5   Y:64Z:-100
--------------------------------------------------------
寄存器设置:
writeRegister(L3G4200D_Address, 0x20, 0x0F);
writeRegister(L3G4200D_Address, 0x21, 0x00);
writeRegister(L3G4200D_Address, 0x22, 0x08);
writeRegister(L3G4200D_Address, 0x23, 0x00);
writeRegister(L3G4200D_Address, 0x24, 0x00);
数据定义:
    unsigned char xMSB,xLSB,yMSB,yLSB,zMSB,zLSB;
    charx,y,z;
x =( char)((unsigned char)(xMSB * 256 )+xLSB);

feiling208 发表于 2012-1-31 20:00:08

回复【13楼】Farid
-----------------------------------------------------------------------

貌似比我的漂的还大

Farid 发表于 2012-2-1 10:29:02

回复【14楼】feiling208
-----------------------------------------------------------------------

请问你的现在处理的怎么样了呀?学习下

MrLCL 发表于 2012-2-4 13:45:17

回复【12楼】Farid
-----------------------------------------------------------------------

这个是最终的算法,就是寄存器里面的数如何换算成角速度,这个尤为重要,我的好像也是这个浮动,你参照资料,他那有每个量程对应的噪声指标,270593595,加我qq,一起整,我就差他了别的都做完了

寒寒 发表于 2012-7-11 11:24:04

我用的是ADXL345,也是补码,好郁闷的说

lyreliu 发表于 2012-11-30 18:22:20

先mark一下~以后应该会用到~
页: [1]
查看完整版本: 【讨论】L3G4200D陀螺仪 对于这种补码形式数据,各位大侠是如何处理的呢?