HMC5883L 磁力计校准

2023-05-16

原文地址: http://blog.sina.com.cn/s/blog_402c071e0102v8ie.html


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

       


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

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

磁力计校准 磁力计校准

               方法一.修正的输出可以根据下面的方法来计算:
               1) 在磁场干扰的条件下进行, 数据收集设备被旋转360°。
               2)数据进行分析,以产生偏差的偏移和灵敏度的比例因子,以补偿所述干扰。
               例子:
               从数据中发现的X和Y磁强计的最大输出:
                                             X min =  -0.284gauss X max  =  +0.402gauss
                   Ymin = -0.322gauss Ymax = +0.246gauss
               从中可以看出X轴的数据,X具有更大的反应,我们设置其比例系数为1
                                             X s = 1
               再计算其他比例系数:
                                                                    ( X max -  X min
                                             Y s = ————————
                                                                    ( Y max -  Y min
               对于偏置补偿:
                                             X b = X s[1/2( X max -  X min ) -  X max  ]
                                             Y b = Y s[1/2( Y max -  Y min ) -  Y max  ]
 
               正确的输出:
                                             X out = X in*X s + X b
                                             Y out = Y in*Y s + Y b
               方法二.
                              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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HMC5883L 磁力计校准 的相关文章

  • PCI-E 1x, 4x, 8x, 16x 接口定义

    1 PCI E插槽及金手指实物图 xff08 1 xff09 PCI E插槽 从上至下依次为PCI E 4X PCI E 16X PCI E 1X xff08 2 xff09 PCI E金手指 PCI E 1X金手指 PCI E 4X金手指
  • Jetson Xavier RC EP 的PCIe互通测试(12)

    一 硬件连接 xff1a 交叉线 X16引脚定义 xff1a 从此面看 xff1a 从上到下 xff0c 依次为A1 A2 A3 从背面看 xff1a 从上到下 xff0c 依次为B1 B2 B3 注意断开 xff1a A2 A3 B1 B
  • 将自己的ubuntu20.04做成镜像

    系统 xff1a Ubuntu20 04 软件 xff1a systemback 硬件 xff1a 128GU盘一个 1 安装systemback sudo sh c 39 echo 34 deb arch 61 amd64 http mi
  • Orin + SC16IS752+SP3072 SPI转串口485

    文章目录 1 前言 2 修改过程 2 1 sc16is752 芯片 2 1 1引脚说明 2 1 2 设备树配置 2 2 1 源码分析 3 调试 1 前言 Orin 有四路串口 对于多数设备来说已经够用 通过SPI 转串口再转RS485在Or
  • MIPI CSI介绍

    文章目录 1 概述2 MIPI接口的演变2 1 CSI 12 2 CSI 22 3 CSI 32 4 更多关于CSI 3 其他3 1 为什么用MIPI CSI 2代替USB 3 2 MIPI CSI 2的性能亮点3 3 MIPI相机 它是如
  • 车载摄像头概述

    1 车载摄像头概述 SerDes环境 上边的摄像头是德国豪车配备的车载摄像头 我们是从国外网站上买的 为了选择车载摄像头 xff0c 你需要获得关于它的各种信息 首先 xff0c 您需要获取连接器和序列化器制造商名称的信息 xff0c 然后
  • ARM7的三级流水线过程

    看到汇编中很多关于程序返回与中断返回时处理地址都很特别 xff0c 仔细想想原来是流水线作用的效果 所以 xff0c 决定总结学习下ARM流水线 ARM7处理器采用3级流水线来增加处理器指令流的速度 xff0c 能提供0 9MIPS MHz
  • nor flash和nand flash的区别

    NOR 和 NAND 是现在市场上两种主要的非易失闪存技术 Intel 于 1988 年首先开发出 NOR flash 技术 xff0c 彻底改变了原先由 EPROM 和 EEPROM 一统天下的局面 紧接着 xff0c 1989 年 xf
  • UART通信协议

    UART 是用于控制计算机与串行设备的芯片 有一点要注意的是 xff0c 它提供了RS 232C 数据终端设备接口 xff0c 这样计算机就可以和调制解调器或其它使用RS 232C接口的串行设备通信了 作为接口的一部分 xff0c UART
  • stm32f103的IAP升级时,部分APP程序功能丢失,串口中断不起作用,怎么办?

    昨天我用stm32f103做IAP升级 xff0c APP程序是一个LED闪烁和一个串口1收发数据 结果IAP升级后 xff0c 发现APP程序只有LED闪烁但是串口1不行甚至引起死机 这种半死不活的现象是最莫名其妙的 xff0c 它一半在
  • 计算机的启动过程(详细)

    零 boot的含义 先问一个问题 xff0c 启动 用英语怎么说 xff1f 回答是boot 可是 xff0c boot原来的意思是靴子 xff0c 启动 与靴子有什么关系呢 xff1f 原来 xff0c 这里的boot是bootstrap
  • 史上最全Linux面试题(2020最新版)

    出处 xff1a https blog csdn net thinkwon article details 104588679 作者 xff1a ThinkWon 导读 xff1a 本文整理了最新的Linux面试题 xff0c 近3万字 x
  • Endnote中文参考文献格式下载地址(官网)

    Endnote中文参考文献格式官网下载地址 1 下载2 安装 1 下载 今天在写中文论文时 xff0c 发现Endnote里没有中文参考文献格式 上网找了一下有些下载尽然还要币 xff0c 最后看到其实官网里就有GBT7114格式 xff1
  • C++中String类对象的初始化和基本用法

    1 初始化的几种方法和错误案例 首先当然是包含头文件了 xff1a span class token macro property span class token directive keyword include span span c
  • C++中multimap和map容器及使用

    map multimap容器里存放的都是pair模板类的对象 xff0c 而且按照first成员从小到大排序 1 pair模板 pair模板类的定义如下 xff0c 其中有两个成员变量 xff1a first和second xff1a 2
  • Word标题前出现黑块解决办法

    最近Word写文章 xff0c 再次遇到了让人头疼的问题 xff0c 就是自己定义的多级列表 xff0c 某一级前面不显示数字而是一个黑块 之前就遇到过这个问题 xff0c 不知怎么就解决了 再次遇到就懵了 尝试了网上的几种方法 xff0c
  • 从印象笔记无法连接到服务器,到win 10 Eage浏览器无法访问

    昨天电脑上的印象笔记突然无法同步 xff0c 同步的图标上显示了红色的感叹号 按照网上很多的解决方法试了之后都无法解决 印象笔记也重新安装了 xff0c 也退出企图重新登录 xff0c 结果登录界面显示无法连接到服务器 按照官网给出的解决方
  • Crazyflie笔记一:概述开发范围、工具、特点介绍

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v6ho html Crazyflie笔记一 xff1a 概述开发范围 工具 特点介绍 2015 01 04 12 48 31 转载 标
  • Ubuntu16.04如何设置自动休眠时间

    可能有的人觉得 xff0c 虚拟机几分钟没动就自己锁住了 xff0c 再次进入又要输密码非常麻烦 xff0c 那如何设置屏幕关闭时间呢 xff1f 下面就说一说 xff1a 1 打开设置选项 xff0c 在电脑的右上方 2 点击system
  • PX4使用I2C方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式

随机推荐

  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • Matlab 同一文件夹下图片批量处理的两种简单方法

    Matlab 同一文件夹下图片批量处理的两种简单方法 最近因为实验中有许多图片需要处理 xff0c 本来的做法是一张张读取图片 xff0c 这是相当麻烦的 xff0c 因为每处理一张图片就需要修改相应的图片名 于是就想着要是可以批量处理就好
  • MATLAB实现图像巴特沃斯滤波、高频增强滤波及直方图均衡化

    1 巴特沃斯滤波器 1 1 基本概念 在图像处理中 xff0c 巴特沃斯滤波器传递函数如下 xff1a 巴特沃斯低通滤波器公式 xff1a 巴特沃斯高通滤波器公式 xff1a 在公式中 xff0c D u v 代表频域当中 xff0c 点
  • 偏最小二乘法PLS和PLS回归的介绍及其实现方法

    1 偏最小二乘法 xff08 PLS xff09 介绍 偏最小二乘法是一种新型的多元统计数据分析方法 xff0c 于1983年由S Wold和C Albano等人首次提出 偏最小二乘法实现了 xff0c 在一个算法下 xff0c 可以同时实
  • 功率放大芯片IR2184介绍

    IR2184引脚定义 xff1a IN一般为脉冲信号 xff0c 即全桥电路中的pwm波信号 xff0c 一般可以通过调节它的占空比来控制智能车电机的转速 SD信号为使能信号 xff0c 高电平有效 xff0c 芯片工作 Vb是高侧浮动电源
  • 为你解读7大类深度CNN架构创新综述(附论文)

    来源 xff1a 机器之心 本文约3000字 xff0c 建议阅读6分钟 本综述将最近的 CNN 架构创新分为七个不同的类别 xff0c 分别基于空间利用 深度 多路径 宽度 特征图利用 通道提升和注意力 深度卷积神经网络 xff08 CN
  • docker 入门 实例

    先决条件 验证是否已经做好准备 docker run hello world 使用Dockerfile定义容器 Dockerfile将在您的容器内定义环境中执行的操作 对网络接口和磁盘驱动器的访问在此内环境内实现虚拟化 xff0c 这将独立
  • HMC5883L磁力计常见问题解答

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8gj html 本文提供了 HMC5883L 磁力计 的 常见问题的解答 xff0c 本文来自百度文库 xff0c 欢迎交流 xff
  • PX4 Offboard Control with MAVROS--MAVROS(环境搭建)

    需要准备的材料 1 PIXhawk或者Pixracer 2 一个已经安装好ubuntu mate16 04的树莓派3B 3 一根micro USB 数据线 一 安装ROS 1 设置source list sudo sh c 39 echo
  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • Linux:查看网络信息和网络监控命令。

    ifconfig 该命令用于查看机器挂载的网卡情况 使用方式 ifconfig a 命令输出 可见机器有两个网卡 xff0c 一个时eth0 xff0c 另一个是本地回环虚拟网卡 另外 xff0c iproute2软件包含一个强大的网络配置
  • 胡晓明:“自主研发、共生共存、不碰数据是我们的三条生命线”

    5月23日 xff0c 在云栖大会 武汉峰会上 xff0c 阿里云总裁胡晓明系统阐述了这家公司坚守的三条生命线 坚持自主研发之路 xff0c 拿来主义 盖不出高楼大厦 xff0c 自主研发的云才能走得更远 xff1b 生态是阿里巴巴血液里流
  • 视觉SLAM十四讲

    内部交流 xff0c 写的很乱 xff0c 各路大神不建议观看以免影响思路 1 激光SLAM 激光SLAM相对成熟 xff0c 比如2005年出版的 概率机器人 中就介绍了很多关于激光SLAM的知识 xff0c 在ROS里也能找到许多关于激
  • 推荐几本学习c++的靠谱书

    入门推荐 C 43 43 Primer Plus 第6版 中文版 C 43 43 程序设计经典教程 xff0c 畅销30年的C 43 43 大百科全书 xff0c 零基础自学C 43 43 入门 C 43 43 是在 C 语言基础上开发的一
  • Python进阶书籍经典书有这样三本

    1 Python核心编程 xff08 第3版 xff09 Core Python Applications Programming xff08 3rd Edition xff09 美 Wesley Chun 著 xff0c 孙波翔 xff0
  • PID控制算法 无人机的精准悬停 机器人和机械臂的运动系统 飞机和火箭的姿态调整

    目录 应用数学公式机器人为例无人机为例PDI总结参考链接 应用 空调的温度控制 无人机的精准悬停 机器人和机械臂的运动系统 飞机和火箭的姿态调整 数学公式 机器人为例 无人机为例 P D I
  • Docker容器图形界面显示(运行GUI软件)的配置方法

    0 环境说明 Ubuntu 16 04 docker 1 35 1 Docker的 可视化 Docker本身的工作模式是命令行的 xff0c 因为主要的使用场景可能是做服务器后端方面的比较多 但有时候我们会有在docker容器里运行一些图形
  • 即时通讯 3

    即时通讯 3 内容待写
  • HMC5883L 磁力计校准

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8ie html 这里针对 HMC5883L 磁力计 的校准 xff0c 做一个简单讲解 欢迎交流 xff0c 新浪长沙 64 Wal