极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13357|回复: 6

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

[复制链接]
发表于 2015-8-18 16:37:05 | 显示全部楼层 |阅读模式
我使用gy273的模块,获得X,Y,Z方向的地磁场强度,然后求他们的均方根。这个值应该是地磁场的模值大小,应该是一个固定量,但为什么姿态变了这个值的大小就变了?
回复

使用道具 举报

 楼主| 发表于 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
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-18 16:40:48 | 显示全部楼层
  1. #include <Wire.h> //I2C Arduino Library

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

  3. void setup(){
  4.   //Initialize Serial and I2C communications
  5.   Serial.begin(9600);
  6.   Wire.begin();
  7.   
  8.   //Put the HMC5883 IC into the correct operating mode
  9.   Wire.beginTransmission(address); //open communication with HMC5883
  10.   Wire.write(0x02); //select mode register
  11.   Wire.write(0x00); //continuous measurement mode
  12.   Wire.endTransmission();
  13. }

  14. void loop(){
  15.   
  16.   long x,y,z; //triple axis data

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

  22. //Read data from each axis, 2 registers per axis
  23.   Wire.requestFrom(address, 6);
  24.   if(6<=Wire.available()){
  25.     x = Wire.read()<<8; //X msb
  26.     x |= Wire.read(); //X lsb
  27.     z = Wire.read()<<8; //Z msb
  28.     z |= Wire.read(); //Z lsb
  29.     y = Wire.read()<<8; //Y msb
  30.     y |= Wire.read(); //Y lsb
  31.   }
  32.   
  33.   //Print out values of each axis
  34. //  Serial.print("x: ");
  35.   Serial.print(x);
  36. //  Serial.print("  y: ");
  37.   Serial.print("   ");
  38.   Serial.print(y);
  39.     Serial.print("   ");
  40. //  Serial.print("  z: ");
  41.   Serial.print(z);
  42.     Serial.print("   ");
  43.   
  44. //  Serial.print("   x: ");
  45.   x=abs(x);
  46. //  Serial.print(x);
  47. //  Serial.print("  y: ");
  48.   y=abs(y);
  49. //  Serial.print(y);
  50. //  Serial.print("z: ");
  51.   z=abs(z);
  52. //  Serial.print(z);
  53.   
  54. //  Serial.print("   x*x: ");
  55.   x=x*x;
  56. //  Serial.print(x);
  57. //  Serial.print("y*y: ");
  58.   y=y*y;
  59. //  Serial.print(y);
  60. //  Serial.print("z*z: ");
  61.   z=z*z;
  62. //  Serial.print(z);
  63.   
  64.   unsigned long  fx=sqrt(x+y+z);
  65. //  Serial.print("  fx: ");
  66.   Serial.println(fx);
  67.     delay(500);
  68. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-8-19 01:36:19 | 显示全部楼层
我也不太清楚 HMC5388L 當中 XYZ 的意義及有關單位.
但根據相關的庫的資料, 只是對應的磁場強度, 並非跟一個點的距離.
我也不太清楚你那均方根的值有什麼意義, 為什麼一定會是一個定量?  
回复 支持 反对

使用道具 举报

发表于 2015-8-19 11:33:33 | 显示全部楼层
按道理,在一个地方,地球磁场变化不大(其变化是5883测量不出来的),三个分量的均方根是地球总场的大小。由于干扰问题,这个值不太靠谱!
回复 支持 反对

使用道具 举报

发表于 2015-8-27 10:23:52 | 显示全部楼层
附近是不是有铁磁性的物体或者附近有交流电源。
以前用5883做过东西,在屋子里经过有电线的地方会有误差。
另外。这个东西的数据的稳定性并不是特别好。
回复 支持 反对

使用道具 举报

发表于 2016-2-26 23:01:16 | 显示全部楼层
当然是固定值,我试过,完全是一条直线,说明还是很准确的!可能你计算有些问题,程序输出的是0-360之间的角度信息,需要换算成余弦,这才是在三个坐标轴上的投影,然后求方根才是模值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 22:40 , Processed in 0.039612 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表