极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18816|回复: 7

Arduino读取HMC5883L电子罗盘数据问题

[复制链接]
发表于 2016-9-11 09:39:43 | 显示全部楼层 |阅读模式
最近看到论坛的大神写的HMC5883L模块的程序,一时心血来潮,使用HMC5883L.h库写了一个电子罗盘程序
出现问题:初始值稳定,用手移动模块数据发生变化,有时数据读取卡住不动不再变化,如下图:

请问有碰到这种情况的吗?怎样解决?
代码如下:
  1. #include<Wire.h>
  2. #include<HMC5883L.h>
  3. HMC5883L compass;
  4. void setup()
  5. {
  6.   Serial.begin(9600);
  7.   Serial.println("HMC5883L Initialize...");
  8.   delay(500);
  9.   while(!compass.begin())
  10.   {
  11.     Serial.println("Initialize Faulse");
  12.     delay(500);
  13.   }
  14.   compass.setRange(HMC5883L_RANGE_1_3GA);
  15.   compass.setMeasurementMode(HMC5883L_CONTINOUS);
  16.   compass.setDataRate(HMC5883L_DATARATE_15HZ);
  17.   compass.setSamples(HMC5883L_SAMPLES_1);
  18.   checksettings();
  19. }
  20. void checksettings()
  21. {
  22.   Serial.print("HMC5883L Range: ");
  23.   switch(compass.getRange())
  24.   {
  25.     case HMC5883L_RANGE_0_88GA:
  26.             Serial.println("0.88Ga");
  27.             break;
  28.         case HMC5883L_RANGE_1_3GA:
  29.             Serial.println("1.3Ga");
  30.             break;
  31.         case HMC5883L_RANGE_1_9GA:
  32.             Serial.println("1.9Ga");
  33.             break;
  34.         case HMC5883L_RANGE_2_5GA:
  35.             Serial.println("2.5Ga");
  36.             break;
  37.         case HMC5883L_RANGE_4GA:
  38.             Serial.println("4Ga");
  39.             break;
  40.         case HMC5883L_RANGE_4_7GA:
  41.             Serial.println("4.7Ga");
  42.             break;
  43.         case HMC5883L_RANGE_5_6GA:
  44.             Serial.println("5.6Ga");
  45.             break;
  46.         case HMC5883L_RANGE_8_1GA:
  47.             Serial.println("8.1Ga");
  48.             break;
  49.         default:Serial.println("ERROR RANGE");
  50.             break;
  51.   }
  52.   Serial.print("HMC5883L Measurement Mode: ");
  53.   switch(compass.getMeasurementMode())
  54.   {
  55.     case HMC5883L_IDLE:
  56.       Serial.println("Idle Mode");
  57.       break;
  58.     case HMC5883L_SINGLE:
  59.       Serial.println("Single Mode");
  60.       break;  
  61.     case HMC5883L_CONTINOUS:
  62.       Serial.println("Continous Mode");
  63.       break;  
  64.     default:Serial.println("ERROR MODE");
  65.       break;      
  66.   }
  67. Serial.print("HMC5883L Data Rate: ");
  68.   switch(compass.getDataRate())
  69.   {
  70.     case HMC5883L_DATARATE_75HZ:
  71.       Serial.println("75Hz");
  72.       break;
  73.     case HMC5883L_DATARATE_30HZ:
  74.       Serial.println("30Hz");
  75.       break;  
  76.     case HMC5883L_DATARATE_15HZ:
  77.       Serial.println("15Hz");
  78.       break;
  79.     case HMC5883L_DATARATE_7_5HZ:
  80.       Serial.println("7.5Hz");
  81.       break;   
  82.     case HMC5883L_DATARATE_3HZ:
  83.       Serial.println("3Hz");
  84.       break;
  85.     case HMC5883L_DATARATE_1_5HZ:
  86.       Serial.println("1.5Hz");
  87.       break;      
  88.     case HMC5883L_DATARATE_0_75_HZ:
  89.       Serial.println("0.75Hz");
  90.       break;      
  91.     default:Serial.println("ERROR DATARATE");
  92.       break;      
  93.   }
  94.   Serial.print("HMC5883L Sample: ");
  95.   switch(compass.getSamples())
  96.   {
  97.     case HMC5883L_SAMPLES_8:
  98.       Serial.println("8");
  99.       break;
  100.     case HMC5883L_SAMPLES_4:
  101.       Serial.println("4");
  102.       break;  
  103.     case HMC5883L_SAMPLES_2:
  104.       Serial.println("2");
  105.       break;
  106.     case HMC5883L_SAMPLES_1:
  107.       Serial.println("1");
  108.       break;   
  109.     default:Serial.println("ERROR SAMPLE");
  110.       break;      
  111.   }
  112. }
  113. void loop()
  114. {
  115.   Vector norm=compass.readNormalize();
  116.   Serial.print("X Normalize: ");
  117.    Serial.print(norm.XAxis);
  118.   Serial.print("Y Normalize: ");
  119.    Serial.print(norm.YAxis);
  120.   Serial.print("Z Normalize: ");  
  121.     Serial.println(norm.ZAxis);
  122.   delay(500);
  123. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-9-11 11:59:57 | 显示全部楼层
以前用32读地磁的时候也会经常出现卡死的情况,后来也没解决就放弃用它了/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-11 19:20:08 | 显示全部楼层
木森林的年轮 发表于 2016-9-11 11:59
以前用32读地磁的时候也会经常出现卡死的情况,后来也没解决就放弃用它了/

同感,有时莫名的卡死
回复 支持 反对

使用道具 举报

发表于 2016-9-13 02:53:46 | 显示全部楼层
我也试过卡住,不过是因为电路接触问题,软件没问题。
回复 支持 反对

使用道具 举报

发表于 2017-5-9 11:02:57 | 显示全部楼层
arduino板无法识别HMC5883L感应器怎么解决,无法访问寄存,求大神解答
回复 支持 反对

使用道具 举报

发表于 2017-5-9 11:10:40 | 显示全部楼层
SCL和SDA上拉了吗
回复 支持 反对

使用道具 举报

发表于 2017-5-9 19:01:40 | 显示全部楼层
弘毅 发表于 2017-5-9 11:10
SCL和SDA上拉了吗

没有 ,不会连上拉电阻,这个是必须的吗?那需要多大的电阻啊?怎么连,可以上传连接图吗
回复 支持 反对

使用道具 举报

发表于 2017-5-9 20:09:28 | 显示全部楼层
zcp冰淼 发表于 2017-5-9 19:01
没有 ,不会连上拉电阻,这个是必须的吗?那需要多大的电阻啊?怎么连,可以上传连接图吗


SCL或者SDA,接一个10K电阻到VCC,上拉是必须的。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 22:06 , Processed in 0.046495 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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