原文地址:HMC5883L 磁力计校准作者:WalkAnt

这里针对 HMC5883L 磁力计 的校准,做一个简单讲解。欢迎交流,新浪长沙@WalkAnt。


先看看这篇文章:http://blog.sina.com.cn/s/blog_8240cbef0101i7gn.html

如果磁力计在含有附加的局部磁场的环境中进行操作,磁力计的输出做附加的修正将是必要的。 在没有任何本地磁场的影响下,下图1可以通过旋转设备360°产生的平面 ,图2为引入本地磁场。

 

       方法一.修正的输出可以根据下面的方法来计算:
        1)在磁场干扰的条件下进行,数据收集设备被旋转360°。
        2)数据进行分析,以产生偏差的偏移和灵敏度的比例因子,以补偿所述干扰。

       例子:
       从数据中发现的X和Y磁强计的最大输出:
                        Xmin = -0.284gauss Xmax = +0.402gauss
                   Ymin = -0.322gauss Ymax = +0.246gauss
       从中可以看出X轴的数据,X具有更大的反应,我们设置其比例系数为1
                        Xs = 1
       再计算其他比例系数:
                                    (Xmax - Xmin)
                        Ys = ————————
                                    (Ymax - Ymin)
       对于偏置补偿:
                        Xb = Xs[1/2(Xmax - Xmin) - Xmax ]
                        Yb = Ys[1/2(Ymax - Ymin) - Ymax ]
       正确的输出:
                        Xout = Xin*Xs + Xb
                        Yout = Yin*Ys + Yb
       方法二.
               1)水平匀速旋转,收集XY轴数据
               2)转动器材90度(Z轴)匀速转动以收集Z轴数据
                       Xoffset = (Xmax + Xmin)/2
                        Yoffset = (Ymax + Ymin)/2
                        Zoffset = (Zmax + Zmin)/2
               将磁力计读到的裸值减去offset,得到用做角度计算的Heading值
                       XH = X - Xoffset
                        YH = Y - Yoffset
                        ZH = Z - Zoffset
       水平测试,得到的方位角 = arctanYH/XH
       非水平测试,需要使用加速计进行倾角补偿,先计算出翻滚角Roll和俯仰角Pitch,然后计算Heading值:
                      XH = x*cos(P)+Y*sin(R)*sin(P)-Z*cos(R)*sin(p)
                       YH = Y*cos(R)+Z*sin(R)

关于为什么设置偏置,请参考以下文章:

ST集成传感器方案实现电子罗盘功能:http://www.dzsc.com/data/html/2010-11-29/87454.html

HMC5883L常见问题解答:http://blog.sina.com.cn/s/blog_402c071e0102v8gj.html

这里我采用了上方的简单方法,来计算一个 offsetX, offsetY, offsetZ,然后减去这个偏移量,得到了正确的结果。下方是代码。下方我做了一个处理(诸如:mag.x*0.2 + magRange[0]*0.8)。是因为偶尔mag.x mag.y mag.z 会出现一个异常的值,使得计算的offsetX  offsetY offsetZ不准,所以加了这个滤波处理。

static float magRange[6] = {1.0,-1.0,1.0,-1.0,1.0,-1.0};// magRange[0] 对应X最小,magRange[1] 对应X最大

// Magnetometer not yet used more then for logging.
        // 磁力计尚未使用到,仅仅只是 log 记录下来。
        imu9Read(&gyro, &acc, &mag);
 
        if(magRange[0] > mag.x) magRange[0] = mag.x*0.2 + magRange[0]*0.8; // x min
        if(magRange[1] < mag.x) magRange[1] = mag.x*0.2 + magRange[1]*0.8; // x max
        if(magRange[2] > mag.y) magRange[2] = mag.y*0.2 + magRange[2]*0.8;
        if(magRange[3] < mag.y) magRange[3] = mag.y*0.2 + magRange[3]*0.8;
        if(magRange[4] > mag.z) magRange[4] = mag.z*0.2 + magRange[4]*0.8; // z min
        if(magRange[5] < mag.z) magRange[5] = mag.z*0.2 + magRange[5]*0.8; // z max
        magOffset[0] = (magRange[0]+magRange[1])/2.0;
        magOffset[1] = (magRange[2]+magRange[3])/2.0;
        magOffset[2] = (magRange[4]+magRange[5])/2.0;
        mag.x -= magOffset[0];
        mag.y -= magOffset[1];
        mag.z -= magOffset[2];

自我检测也比较重要。通过HMC5883l芯片提供的自我检测功能,进行自我检测,然后找到一个比例因子。将传感器的检测值乘以这个比例因子,就可以修正磁场。我在代码中没有使用。相关的详细资料请看如下英文。

相关源代码,可以参考 Crazyflie firmware中的 bool hmc5883lSelfTest() 函数。

自我检测

SELF TEST OPERATION

To check the HMC5883L  for proper operation, a self test feature in incorporated in which the sensor offset straps are excited to create a nominal field strength (bias field) to be measured. To implement self test, the least significant bits (MS1 and MS0) of configuration register A are changed from 00 to 01 (positive bias) or 10 (negetive bias), e.g. 0x11 or 0x12.

Then, by placing the mode register into single-measurement mode (0x01), two data acquisition cycles will be made on each magnetic vector. The first acquisition will be a set pulse followed shortly by measurement data of the external field. The second acquisition will have the offset strap excited  (about 10 mA) in the positive bias mode for X, Y, and Z axes to create about a ±1.1 gauss self test field plus the external field. The first acquisition values  will be subtracted from the second acquisition, and the net measurement will be placed into the data output registers.

Since self test adds ~1.1 Gauss additional field to the existing field strength, using a reduced gain setting prevents sensor from being saturated and data registers overflowed. For example, if the configuration register B is set to 0x60  (Gain=3), values around +766 LSB  (1.16 Ga * 660 LSB/Ga) will be placed in the X and Y data output registers and around +713 (1.08 Ga * 660 LSB/Ga) will be placed in Z data output register. To leave the self test mode, change MS1 and MS0 bit of the configuration register A back to 00 (Normal Measurement Mode), e.g. 0x10.

比例因子校准

SCALE FACTOR CALIBRATION

Using the self test method described above,  the user can scale sensors’ sensitivity  to match each other.  Since placing device in positive bias mode  (or alternatively negative bias mode) applies a known artificial field on all three axes, the resulting ADC measurements in data output registers can be used to scale the sensors. For example, if the expected self test value for X-axis  is 766 and the actual value  is 750 then a scale factor of (766/750) should be multiplied to all future readings of X-axis. Doing so for all three axes will ensure their sensitivity are well matched.

The built-in self test can also be used to periodically compensate the scaling errors due to temperature variations. A compensation factor can be found by comparing the self test outputs with the ones obtained at a known temperature. For example, if the self test output is 750 at room temperature and 700 at the current temperature then a compensation factor of (750/700) should be applied to all current magnetic readings. A temperature sensor is not required using this method.


Crazyflie firmware中的 bool hmc5883lSelfTest() 函数代码如下,仅供参考:(函数中的各种定义这里未给出)

bool hmc5883lSelfTest()
{
  bool testStatus = TRUE;
  int16_t mxp, myp, mzp;  // positive magnetometer measurements
  int16_t mxn, myn, mzn;  // negative magnetometer measurements
  struct
  {
    uint8_t configA;
    uint8_t configB;
    uint8_t mode;
  } regSave;

// Save register values
  if (i2cdevRead(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == FALSE)
  {
    // TODO: error handling
    return FALSE;
  }
  // Set gain (sensitivity)
  hmc5883lSetGain(HMC5883L_ST_GAIN);

// Write CONFIG_A register and do positive test
  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
      (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
      (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
      (HMC5883L_BIAS_POSITIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));

hmc5883lSetMode(HMC5883L_MODE_SINGLE);
  vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
  hmc5883lGetHeading(&mxp, &myp, &mzp);

// Write CONFIG_A register and do negative test
  i2cdevWriteByte(I2Cx, devAddr, HMC5883L_RA_CONFIG_A,
      (HMC5883L_AVERAGING_1 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
      (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
      (HMC5883L_BIAS_NEGATIVE << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)));

hmc5883lSetMode(HMC5883L_MODE_SINGLE);
  vTaskDelay(M2T(HMC5883L_ST_DELAY_MS));
  hmc5883lGetHeading(&mxn, &myn, &mzn);

if (hmc5883lEvaluateSelfTest(HMC5883L_ST_X_MIN, HMC5883L_ST_X_MAX, mxp, "pos X") &&
      hmc5883lEvaluateSelfTest(HMC5883L_ST_Y_MIN, HMC5883L_ST_Y_MAX, myp, "pos Y") &&
      hmc5883lEvaluateSelfTest(HMC5883L_ST_Z_MIN, HMC5883L_ST_Z_MAX, mzp, "pos Z") &&
      hmc5883lEvaluateSelfTest(-HMC5883L_ST_X_MAX, -HMC5883L_ST_X_MIN, mxn, "neg X") &&
      hmc5883lEvaluateSelfTest(-HMC5883L_ST_Y_MAX, -HMC5883L_ST_Y_MIN, myn, "neg Y") &&
      hmc5883lEvaluateSelfTest(-HMC5883L_ST_Z_MAX, -HMC5883L_ST_Z_MIN, mzn, "neg Z"))
  {
    DEBUG_PRINT("Self test [OK].n");
  }
  else
  {
    testStatus = FALSE;
  }

// Restore registers
  if (i2cdevWrite(I2Cx, devAddr, HMC5883L_RA_CONFIG_A, sizeof(regSave), (uint8_t *)&regSave) == FALSE)
  {
    // TODO: error handling
    return FALSE;
  }

return testStatus;
}

另外这里提供了一个方法,日后若有研究,我将给出详细说明,这里提供链接供参考:

http://bbs.kechuang.org/read/67382

HMC5883Lnbsp;磁力计校准相关推荐

  1. 基于Matlab的磁力计校准(附源码)

    目录 一.理想磁力计 二.硬铁效应 三.软铁效应 四.校正技术 五.使用函数magcal 5.1 仅偏移计算 ​编辑5.2 硬铁补偿和轴缩放计算 5.3 全硬铁和软铁补偿 5.4 自动拟合 六. 结论 ...

  2. mpu9250磁力计校准 mpl库数据校准

    mpu9250磁力计校准 mpl库数据校准 写在前面 为什么磁力计需要校准 官方的mpl库简介 如何磁力计校准以及保存校准数据 参考代码 总结 写在前面  前段时间弄了MPU9250,也就是9轴传感器 ...

  3. IMU之磁力计校准地磁场计算磁航向

    背景知识: 导航坐标系:东-北-天 载体坐标系:右-前-上 欧拉角定义:3-1-2旋转,(航向角-俯仰角-滚转角): 航向角北偏西为正,范围[-pi pi]: 俯仰角, 运载体抬头时角度定义为正,角度 ...

  4. 九轴陀螺仪ICM20948磁力计校准

    九轴陀螺仪ICM20948磁力计校准 ICM20948九轴传感器目前应用广泛,是非常适合用于智能手机,平板电脑,可穿戴式传感器,物联网和应 用的全球功耗最低的9轴MotionTracking设备.其融 ...

  5. IMU(陀螺仪、加速度计)Magnetometer(磁力计)校准方法和流程

    一.何为校准: 校准的目的是因为厂商在生产器件时,由于工艺.技术等原因,致使器件存在缺陷,导致实际应用时,存在误差! 一般器件在出厂时,都会做一些校准处理,比如以Sensonor公司的Stim300为 ...

  6. 转载:mavlink 磁力计校准部分分析

    目录 文章目录 目录 摘要 第一节:原理图学习 第二节:飞控代码学习如何启动罗盘校准? 1.通过地面站开启罗盘校准 2.通过遥控器开启罗盘校准 第三节:如何获取采样数据? 第四节:如何进行罗盘校准? ...

  7. MATLAB校准磁力计

    初识magcal函数 语法 [A,b,expmfs] = magcal(D) [A,b,expmfs] = magcal(D,fitkind) 描述 [A,b,expmfs] = magcal(D) ...

  8. 基于STM32F407四旋翼无人机---AK8975磁力计(四)

    基于STM32F407四旋翼无人机---AK8975磁力计(四) 磁力计基本介绍 1.2.磁力计原理图 2.磁力计数据获取 3.磁力计椭球拟合校准 3.1.简单介绍椭球拟合 磁力计基本介绍 该模块采用 ...

  9. IMU加速度、磁力计校正

    IMU加速度.磁力计校正--椭球拟合 IMU校正以及姿态融合 IMU姿态融合(MPU9250从校正到滤波步骤) STM32F0+MPU9250(with MS5611)的姿态解析算法移植(Mahony ...

最新文章

  1. 如何理解soft target这一做法?
  2. strstr php文档,php字符串函数学习之strstr()
  3. 自拟计算机作文100字,我的电脑作文100字五篇
  4. [react] 使用PropTypes和Flow有什么区别?
  5. PostgreSQL之Foreign Data Wrappers使用指南
  6. 【单目标优化求解】基于matlab多子群改进的海洋捕食者算法(MSMPA)求解单目标优化问题【含Matlab源码 1783期】
  7. mysql btree面试_java面试题:你了解mysql的B+TREE索引吗?
  8. BottomNavigationView--基本使用总结
  9. 独立站卖家如何利用Google广告引流
  10. 如何确认EasyNVR拉转推视频流到EasyDSS播放出现掉帧的问题?
  11. [2008北京奥运会]08奥运开幕式NBC版的字幕/解说词
  12. ai不同形状的拼版插件_Illustrator自动拼版脚本插件-AI自动拼版脚本下载-西西软件下载...
  13. mysql的gis_MySQL的GIS功能
  14. Spark读HBASE - shc方案
  15. 新手入门 | photoshop基础教程
  16. bzoj1412: [ZJOI2009]狼和羊的故事(最小割)
  17. 格莱富笔记本电脑教你如何优化笔记本电脑系统
  18. 2020-01-25
  19. 原装RFX2401C集成电路2.4GHZ单芯片射频前端IC无线教学模块
  20. 利用 Ksweb 将手机变为服务器 | 教程

热门文章

  1. Ubuntu 安装和使用MySQL
  2. Python networkx库
  3. Hive(数据仓库)数据压缩、数据存储格式
  4. 哈佛凌晨两点半(读书笔记)
  5. janusgraph 引入 java_JanusGraph入门第一课和官方文档踩坑
  6. Android仅允许安装指定签名apk
  7. 驻极体MIC并联与串联
  8. NRLMSISE-00、太阳辐射流量F107、地磁活动指数Ap
  9. 一个月过软考|软件设计师中级考试经验分享
  10. 如何在linux(ubuntu)下安装字体(给wps安装字体)