单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 133|回复: 0
收起左侧

arduino的hmc5883L源程序

[复制链接]
2572727 发表于 2020-1-7 16:18 | 显示全部楼层 |阅读模式
有关arduino的hmc5883L磁力计的开发程序

单片机源程序如下:
  1. #if ARDUINO >= 100
  2. #include "Arduino.h"
  3. #else
  4. #include "WProgram.h"
  5. #endif

  6. #include <Wire.h>

  7. #include "HMC5883L.h"

  8. bool HMC5883L::begin()
  9. {
  10.     Wire.begin();

  11.     if ((fastRegister8(HMC5883L_REG_IDENT_A) != 0x48)
  12.     || (fastRegister8(HMC5883L_REG_IDENT_B) != 0x34)
  13.     || (fastRegister8(HMC5883L_REG_IDENT_C) != 0x33))
  14.     {
  15.         return false;
  16.     }

  17.     setRange(HMC5883L_RANGE_1_3GA);
  18.     setMeasurementMode(HMC5883L_CONTINOUS);
  19.     setDataRate(HMC5883L_DATARATE_15HZ);
  20.     setSamples(HMC5883L_SAMPLES_1);

  21.     mgPerDigit = 0.92f;

  22.     return true;
  23. }

  24. Vector HMC5883L::readRaw(void)
  25. {
  26.     v.XAxis = readRegister16(HMC5883L_REG_OUT_X_M) - xOffset;
  27.     v.YAxis = readRegister16(HMC5883L_REG_OUT_Y_M) - yOffset;
  28.     v.ZAxis = readRegister16(HMC5883L_REG_OUT_Z_M);

  29.     return v;
  30. }

  31. Vector HMC5883L::readNormalize(void)
  32. {
  33.     v.XAxis = ((float)readRegister16(HMC5883L_REG_OUT_X_M) - xOffset) * mgPerDigit;
  34.     v.YAxis = ((float)readRegister16(HMC5883L_REG_OUT_Y_M) - yOffset) * mgPerDigit;
  35.     v.ZAxis = (float)readRegister16(HMC5883L_REG_OUT_Z_M) * mgPerDigit;

  36.     return v;
  37. }

  38. void HMC5883L::setOffset(int xo, int yo)
  39. {
  40.     xOffset = xo;
  41.     yOffset = yo;
  42. }

  43. void HMC5883L::setRange(hmc5883l_range_t range)
  44. {
  45.     switch(range)
  46.     {
  47.         case HMC5883L_RANGE_0_88GA:
  48.             mgPerDigit = 0.073f;
  49.             break;

  50.         case HMC5883L_RANGE_1_3GA:
  51.             mgPerDigit = 0.92f;
  52.             break;

  53.         case HMC5883L_RANGE_1_9GA:
  54.             mgPerDigit = 1.22f;
  55.             break;

  56.         case HMC5883L_RANGE_2_5GA:
  57.             mgPerDigit = 1.52f;
  58.             break;

  59.         case HMC5883L_RANGE_4GA:
  60.             mgPerDigit = 2.27f;
  61.             break;

  62.         case HMC5883L_RANGE_4_7GA:
  63.             mgPerDigit = 2.56f;
  64.             break;

  65.         case HMC5883L_RANGE_5_6GA:
  66.             mgPerDigit = 3.03f;
  67.             break;

  68.         case HMC5883L_RANGE_8_1GA:
  69.             mgPerDigit = 4.35f;
  70.             break;

  71.         default:
  72.             break;
  73.     }

  74.     writeRegister8(HMC5883L_REG_CONFIG_B, range << 5);
  75. }

  76. hmc5883l_range_t HMC5883L::getRange(void)
  77. {
  78.     return (hmc5883l_range_t)((readRegister8(HMC5883L_REG_CONFIG_B) >> 5));
  79. }

  80. void HMC5883L::setMeasurementMode(hmc5883l_mode_t mode)
  81. {
  82.     uint8_t value;

  83.     value = readRegister8(HMC5883L_REG_MODE);
  84.     value &= 0b11111100;
  85.     value |= mode;

  86.     writeRegister8(HMC5883L_REG_MODE, value);
  87. }

  88. hmc5883l_mode_t HMC5883L::getMeasurementMode(void)
  89. {
  90.     uint8_t value;

  91.     value = readRegister8(HMC5883L_REG_MODE);
  92.     value &= 0b00000011;

  93.     return (hmc5883l_mode_t)value;
  94. }

  95. void HMC5883L::setDataRate(hmc5883l_dataRate_t dataRate)
  96. {
  97.     uint8_t value;

  98.     value = readRegister8(HMC5883L_REG_CONFIG_A);
  99.     value &= 0b11100011;
  100.     value |= (dataRate << 2);

  101.     writeRegister8(HMC5883L_REG_CONFIG_A, value);
  102. }

  103. hmc5883l_dataRate_t HMC5883L::getDataRate(void)
  104. {
  105.     uint8_t value;

  106.     value = readRegister8(HMC5883L_REG_CONFIG_A);
  107.     value &= 0b00011100;
  108.     value >>= 2;

  109.     return (hmc5883l_dataRate_t)value;
  110. }

  111. void HMC5883L::setSamples(hmc5883l_samples_t samples)
  112. {
  113.     uint8_t value;

  114.     value = readRegister8(HMC5883L_REG_CONFIG_A);
  115.     value &= 0b10011111;
  116.     value |= (samples << 5);

  117.     writeRegister8(HMC5883L_REG_CONFIG_A, value);
  118. }

  119. hmc5883l_samples_t HMC5883L::getSamples(void)
  120. {
  121.     uint8_t value;

  122.     value = readRegister8(HMC5883L_REG_CONFIG_A);
  123.     value &= 0b01100000;
  124.     value >>= 5;

  125.     return (hmc5883l_samples_t)value;
  126. }

  127. // Write byte to register
  128. void HMC5883L::writeRegister8(uint8_t reg, uint8_t value)
  129. {
  130.     Wire.beginTransmission(HMC5883L_ADDRESS);
  131.     #if ARDUINO >= 100
  132.         Wire.write(reg);
  133.         Wire.write(value);
  134.     #else
  135.         Wire.send(reg);
  136.         Wire.send(value);
  137.     #endif
  138.     Wire.endTransmission();
  139. }

  140. // Read byte to register
  141. uint8_t HMC5883L::fastRegister8(uint8_t reg)
  142. {
  143.     uint8_t value;
  144.     Wire.beginTransmission(HMC5883L_ADDRESS);
  145.     #if ARDUINO >= 100
  146.         Wire.write(reg);
  147.     #else
  148.         Wire.send(reg);
  149.     #endif
  150.     Wire.endTransmission();

  151.     Wire.requestFrom(HMC5883L_ADDRESS, 1);
  152.     #if ARDUINO >= 100
  153.         value = Wire.read();
  154.     #else
  155.         value = Wire.receive();
  156.     #endif;
  157.     Wire.endTransmission();

  158.     return value;
  159. }

  160. // Read byte from register
  161. uint8_t HMC5883L::readRegister8(uint8_t reg)
  162. {
  163.     uint8_t value;
  164.     Wire.beginTransmission(HMC5883L_ADDRESS);
  165.     #if ARDUINO >= 100
  166.         Wire.write(reg);
  167.     #else
  168.         Wire.send(reg);
  169.     #endif
  170.     Wire.endTransmission();

  171.     Wire.beginTransmission(HMC5883L_ADDRESS);
  172.     Wire.requestFrom(HMC5883L_ADDRESS, 1);
  173.     while(!Wire.available()) {};
  174.     #if ARDUINO >= 100
  175.         value = Wire.read();
  176.     #else
  177.         value = Wire.receive();
  178.     #endif;
  179.     Wire.endTransmission();

  180.     return value;
  181. }

  182. // Read word from register
  183. int16_t HMC5883L::readRegister16(uint8_t reg)
  184. {
  185.     int16_t value;
  186.     Wire.beginTransmission(HMC5883L_ADDRESS);
  187.     #if ARDUINO >= 100
  188.         Wire.write(reg);
  189.     #else
  190.         Wire.send(reg);
  191.     #endif
  192.     Wire.endTransmission();

  193.     Wire.beginTransmission(HMC5883L_ADDRESS);
  194.     Wire.requestFrom(HMC5883L_ADDRESS, 2);
  195.     while(!Wire.available()) {};
  196.     #if ARDUINO >= 100
  197.         uint8_t vha = Wire.read();
  198.         uint8_t vla = Wire.read();
  199.     #else
  200.         uint8_t vha = Wire.receive();
  201.         uint8_t vla = Wire.receive();
  202.     #endif;
  203.     Wire.endTransmission();

  204.     value = vha << 8 | vla;

  205.     return value;
  206. }
复制代码

所有资料51hei提供下载:
Arduino-HMC5883L-master.zip (540.79 KB, 下载次数: 0)

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

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

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

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