L3G4200D 程序及读数分析
小弟的L3G4200D陀螺仪初始化如下:writeRegister(L3G4200D_Address, CTRL_REG1, 0x0F);
writeRegister(L3G4200D_Address, CTRL_REG2, 0x00);
writeRegister(L3G4200D_Address, CTRL_REG3, 0x08);
writeRegister(L3G4200D_Address, CTRL_REG4, 0x10);
writeRegister(L3G4200D_Address, CTRL_REG5, 0x00);
读取的数据代码如下:
int xMSB = readRegister(L3G4200D_Address, 0x29);
int xLSB = readRegister(L3G4200D_Address, 0x28);
int yMSB = readRegister(L3G4200D_Address, 0x2B);
int yLSB = readRegister(L3G4200D_Address, 0x2A);
int zMSB = readRegister(L3G4200D_Address, 0x2D);
int zLSB = readRegister(L3G4200D_Address, 0x2C);
静止不动时串口打印输出如下:
031037255189
021019255212
019028255220
019023255202
0 8038255207
034039255205
028024255197
019010255217
016043255196
025044255205
013026255220
0 1018255212
017032255200
024037255217
030032255215
016042255227
013020255198
0 2035255232
022029255194
027034255231
014029255199
请问这个数据正常么?如果处理后按照
x = ((xMSB << 8) | xLSB);
这种显示,出来的数据变化貌似非常不对……
请各位达人指点下是数据问题还是我初始化或者别的地方有误?
谢谢! 数据很正常,前两个数是正的,第三个是负数,要取反。 L3G4200D静止不动的时候是会有点飘的,你主要看看转动芯片的时候,数据是不是跟着一起动 读出来的数据负数 是补码形式 回复【1楼】nnnkey
-----------------------------------------------------------------------
那看来这样处理:
x = ((xMSB << 8) | xLSB);
不行了……
如果更好的去处理得到的x,y,z 数值呢?请指点下……多谢! x = ((xMSB << 8) | xLSB);
这样没问题
X,Y,Z轴数据都要这样处理 最好连续一次读6个数据,不要分开读 将高字节与127比较,大于127的说明是负数,整体取反加负号就行了 啊!我都不会用这个陀螺仪?谁有资料呀! 回复【7楼】nnnkey
-----------------------------------------------------------------------
是这样处理?
if( xMSB > 127){
xMSB = -(~xMSB);
}
x= ((xMSB << 8) | xLSB);
但是这样得到的x值很大…… 低字节也要取反的,其实就是已知补码求原码 对,输出的高低字节都是补码形式,可以先将两个补码合并,然后再强制类型转化为带符号的16位数即可; 你好,可以把你的这个程序让我参考一下吗? 定义一个有符号16位的变量,把读到的数据高8位左移8位或上低8位赋给这个有符号变量就行了,没有必要补码转原码。
页:
[1]