2461307814 发表于 2016-9-11 09:39:43

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

最近看到论坛的大神写的HMC5883L模块的程序,一时心血来潮,使用HMC5883L.h库写了一个电子罗盘程序
出现问题:初始值稳定,用手移动模块数据发生变化,有时数据读取卡住不动不再变化,如下图:
http://www.geek-workshop.com/forum.php?mod=image&aid=32106&size=300x300&key=0fd29be4721320cb&nocache=yes&type=fixnone
请问有碰到这种情况的吗?怎样解决?
代码如下:
#include<Wire.h>
#include<HMC5883L.h>
HMC5883L compass;
void setup()
{
Serial.begin(9600);
Serial.println("HMC5883L Initialize...");
delay(500);
while(!compass.begin())
{
    Serial.println("Initialize Faulse");
    delay(500);
}
compass.setRange(HMC5883L_RANGE_1_3GA);
compass.setMeasurementMode(HMC5883L_CONTINOUS);
compass.setDataRate(HMC5883L_DATARATE_15HZ);
compass.setSamples(HMC5883L_SAMPLES_1);
checksettings();
}
void checksettings()
{
Serial.print("HMC5883L Range: ");
switch(compass.getRange())
{
    case HMC5883L_RANGE_0_88GA:
          Serial.println("0.88Ga");
          break;
        case HMC5883L_RANGE_1_3GA:
          Serial.println("1.3Ga");
          break;
        case HMC5883L_RANGE_1_9GA:
          Serial.println("1.9Ga");
          break;
        case HMC5883L_RANGE_2_5GA:
          Serial.println("2.5Ga");
          break;
        case HMC5883L_RANGE_4GA:
          Serial.println("4Ga");
          break;
        case HMC5883L_RANGE_4_7GA:
          Serial.println("4.7Ga");
          break;
        case HMC5883L_RANGE_5_6GA:
          Serial.println("5.6Ga");
          break;
        case HMC5883L_RANGE_8_1GA:
          Serial.println("8.1Ga");
          break;
        default:Serial.println("ERROR RANGE");
          break;
}
Serial.print("HMC5883L Measurement Mode: ");
switch(compass.getMeasurementMode())
{
    case HMC5883L_IDLE:
      Serial.println("Idle Mode");
      break;
    case HMC5883L_SINGLE:
      Serial.println("Single Mode");
      break;
    case HMC5883L_CONTINOUS:
      Serial.println("Continous Mode");
      break;
    default:Serial.println("ERROR MODE");
      break;      
}
Serial.print("HMC5883L Data Rate: ");
switch(compass.getDataRate())
{
    case HMC5883L_DATARATE_75HZ:
      Serial.println("75Hz");
      break;
    case HMC5883L_DATARATE_30HZ:
      Serial.println("30Hz");
      break;
    case HMC5883L_DATARATE_15HZ:
      Serial.println("15Hz");
      break;
    case HMC5883L_DATARATE_7_5HZ:
      Serial.println("7.5Hz");
      break;   
    case HMC5883L_DATARATE_3HZ:
      Serial.println("3Hz");
      break;
    case HMC5883L_DATARATE_1_5HZ:
      Serial.println("1.5Hz");
      break;      
    case HMC5883L_DATARATE_0_75_HZ:
      Serial.println("0.75Hz");
      break;      
    default:Serial.println("ERROR DATARATE");
      break;      
}
Serial.print("HMC5883L Sample: ");
switch(compass.getSamples())
{
    case HMC5883L_SAMPLES_8:
      Serial.println("8");
      break;
    case HMC5883L_SAMPLES_4:
      Serial.println("4");
      break;
    case HMC5883L_SAMPLES_2:
      Serial.println("2");
      break;
    case HMC5883L_SAMPLES_1:
      Serial.println("1");
      break;   
    default:Serial.println("ERROR SAMPLE");
      break;      
}
}
void loop()
{
Vector norm=compass.readNormalize();
Serial.print("X Normalize: ");
   Serial.print(norm.XAxis);
Serial.print("Y Normalize: ");
   Serial.print(norm.YAxis);
Serial.print("Z Normalize: ");
    Serial.println(norm.ZAxis);
delay(500);
}


木森林的年轮 发表于 2016-9-11 11:59:57

以前用32读地磁的时候也会经常出现卡死的情况,后来也没解决就放弃用它了/

2461307814 发表于 2016-9-11 19:20:08

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

同感,有时莫名的卡死

1981818001 发表于 2016-9-13 02:53:46

我也试过卡住,不过是因为电路接触问题,软件没问题。

zcp冰淼 发表于 2017-5-9 11:02:57

arduino板无法识别HMC5883L感应器怎么解决,无法访问寄存,求大神解答

弘毅 发表于 2017-5-9 11:10:40

SCL和SDA上拉了吗

zcp冰淼 发表于 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,上拉是必须的。
页: [1]
查看完整版本: Arduino读取HMC5883L电子罗盘数据问题