theonly1sky 发表于 2015-8-18 16:37:05

关于hmc5883l芯片(gy273模块)的问题。

我使用gy273的模块,获得X,Y,Z方向的地磁场强度,然后求他们的均方根。这个值应该是地磁场的模值大小,应该是一个固定量,但为什么姿态变了这个值的大小就变了?

theonly1sky 发表于 2015-8-18 16:39:23

300   281   124   429
299   282   125   429
300   280   127   429
299   280   121   427
302   279   121   428
301   279   124   428
301   282   123   430
119   358   130   399
-265   -415   598   774
-594   -448   119   753
-490   -570   65   754
-568   106   -64   581
-408   143   -251   499
-647   -40   149   665
344   34   590   683
145   -477   601   780
-651   -176   171   695
-364   -136   -308   495
-376   -137   -288   493
-224   417   -10   473
586   -162   397   726
26   -768   492   912
-492   -458   -100   679
-503   -453   -68   680
-599   -231   385   748
240   371   439   622
547   43   91   556
589   -1   173   613
63   -765   -54   769
-551   -472   268   773
-550   121   45   564

theonly1sky 发表于 2015-8-18 16:40:48

#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();

//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.write(0x02); //select mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
}

void loop(){

long x,y,z; //triple axis data

//Tell the HMC5883 where to begin reading data
Wire.beginTransmission(address);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();


//Read data from each axis, 2 registers per axis
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
}

//Print out values of each axis
//Serial.print("x: ");
Serial.print(x);
//Serial.print("y: ");
Serial.print("   ");
Serial.print(y);
    Serial.print("   ");
//Serial.print("z: ");
Serial.print(z);
    Serial.print("   ");

//Serial.print("   x: ");
x=abs(x);
//Serial.print(x);
//Serial.print("y: ");
y=abs(y);
//Serial.print(y);
//Serial.print("z: ");
z=abs(z);
//Serial.print(z);

//Serial.print("   x*x: ");
x=x*x;
//Serial.print(x);
//Serial.print("y*y: ");
y=y*y;
//Serial.print(y);
//Serial.print("z*z: ");
z=z*z;
//Serial.print(z);

unsigned longfx=sqrt(x+y+z);
//Serial.print("fx: ");
Serial.println(fx);
    delay(500);
}

Super169 发表于 2015-8-19 01:36:19

我也不太清楚 HMC5388L 當中 XYZ 的意義及有關單位.
但根據相關的庫的資料, 只是對應的磁場強度, 並非跟一個點的距離.
我也不太清楚你那均方根的值有什麼意義, 為什麼一定會是一個定量?

hubertdong 发表于 2015-8-19 11:33:33

按道理,在一个地方,地球磁场变化不大(其变化是5883测量不出来的),三个分量的均方根是地球总场的大小。由于干扰问题,这个值不太靠谱!

164335413 发表于 2015-8-27 10:23:52

附近是不是有铁磁性的物体或者附近有交流电源。
以前用5883做过东西,在屋子里经过有电线的地方会有误差。
另外。这个东西的数据的稳定性并不是特别好。

sgf_hb 发表于 2016-2-26 23:01:16

当然是固定值,我试过,完全是一条直线,说明还是很准确的!可能你计算有些问题,程序输出的是0-360之间的角度信息,需要换算成余弦,这才是在三个坐标轴上的投影,然后求方根才是模值。
页: [1]
查看完整版本: 关于hmc5883l芯片(gy273模块)的问题。