HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)

  • 前言
  • 一、寄存器详解
    • 1.配置寄存器A
    • 2.配置寄存器B
    • 3.模式寄存器
    • 4.数据寄存器
    • 5.状态寄存器
    • 6.识别寄存器
  • 二、使用步骤
    • 1.STM32CubeMX设置
    • 2.初始化
    • 3.读取原始数据
  • 三、校准程序
  • 四、方位角计算
  • 五、测试结果
  • 六、总结
  • 七、获取工程源码

前言

HMC5883L是一款高集成的弱磁传感器芯片,带有能使罗盘精度控制在1°-2°的模数转换器。其灵敏度较高,开发难度不高。本文内容是将HMC5883L的XY两轴数据转换成指南针方位角,仅在水平面上使用。


一、寄存器详解

此款芯片的寄存器比较少,使用起来很简单。下面来逐一分析各个寄存器功能。

1.配置寄存器A

  • CRA7 :清除后才能使用;
  • CRA6 - CRA5 : 采样平均数,默认8次;
  • CRA4 - CRA2 : 输出速率,在连续测量模式下使用,默认15Hz;
  • CRA1 - CRA0 : 设置XYZ轴正偏压或负偏压,默认00即可。

2.配置寄存器B

  • CRB7 - CRB5:设置增益位,即多大的值为1高斯,默认1090/高斯,见下图;
  • CRB4 - CRB0:清零

3.模式寄存器

4.数据寄存器

每个轴的数据共16位,存储在两个寄存器(高八位MSB,第八位LSB)。只有把所有寄存器都读取完后,才会清除RDY位和DRDY信号。

5.状态寄存器

6.识别寄存器

用来识别装置。

二、使用步骤

1.STM32CubeMX设置

使用一个I2C、UART和一个IO输入,如下图。

2.初始化

根据以上寄存器设置进行初始化。

void hmc5883l_init(){uint8_t data = 0x70;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,CONFIGURATION_A, 1, &data, 1,1000); //配置寄存器Adata = 0x20;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,CONFIGURATION_B, 1, &data, 1,1000); //配置寄存器Bdata = 0x0;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,HMC5883L_MODE, 1, &data, 1,1000); //配置模式寄存器,连续模式}

3.读取原始数据

void hmc5883l_rawread(float *GaX, float *GaY){uint8_t data[6];HAL_I2C_Mem_Read(&hi2c1,HMC5883L_ADDER, 0x03,1,data,6 , 1000); //连续读取int16_t dxra,dyra;dxra = (data[0] << 8) | data[1]; *GaX = (float)dxra /1090;dyra = (data[4] << 8) | data[5]; *GaY = (float)dyra /1090 ;/* dzra = (data[2] << 8) | data[3]; float GaZ = (float)dzra /1090 ;        */}

经过旋转一周测试后,发现X轴的测量值范围是 -0.34 ~ 0.30高斯,Y轴的范围是 -0.6 ~0.12 高斯

三、校准程序

通过以上发现传感器测量的数据并不准确,原因是磁阻传感器属于比较精密的器件,在生产时会产生误差,所以需要进行校准。因为最后转换的是角度值,所以将原始数据进行归一化处理,X,Y轴的测量值都转化为 -1~1的范围内。具体步骤如下:上电后大约20s内将传感器缓慢旋转几周,测得最大值和最小值,然后获得校准值。

     uint8_t i=0 ;float GaX,GaY,GaXmax=0,GaXmin=0,GaYmax=0,GaYmin=0;while(i != 100){hmc5883l_rawread(&GaX, &GaY);GaXmax = GaXmax < GaX? GaX:GaXmax;GaXmin = GaXmin > GaX? GaX:GaXmin;GaYmax = GaYmax < GaY? GaY:GaYmax;GaYmin = GaYmin > GaY? GaY:GaYmin;HAL_Delay(200);i++;}*Xoffest = (GaXmax+GaXmin)/2;*Yoffest = (GaYmax+GaYmin)/2;*Kx = 2/(GaXmax-GaXmin);*Ky = 2/(GaXmax-GaXmin);

最后由下列式子得到 -1~1 范围内的最终数值

 GaX = (rawGaX - Xoffest) * Kx;GaY = (rawGaY - Yoffest) * Ky;

经过校准后输出,X的取值范围是 -0.98 ~ 1.02 , Y轴取值范围是-1.08 ~ 1.12。(受环境磁场和测量偏离水平面的误差影响),对于特定一个传感器,可在没有环境磁场干扰情况下测定校准数值,直接应用,不必每次上电后进行校准。

四、方位角计算

方位角的计算公式如下:

但由于测试后发现与手机上的指南针不相符,可能是传感器镜像方位的原因,于是自行修改了计算方法,如下(方法可能不准确,仅供参考):

         if((GaX > 0)&&(GaY > 0)) Magangle = atan(GaY/GaX)*57;else if((GaX > 0)&&(GaY < 0)) Magangle = 360+atan(GaY/GaX)*57;else if((GaX == 0)&&(GaY > 0)) Magangle = 90;else if((GaX == 0)&&(GaY < 0)) Magangle = 270;else if(GaX < 0) Magangle = 180+atan(GaY/GaX)*57;

五、测试结果

用手机指南针软件和模块X轴对准同一个方向,随机测取几个数,串口输出和手机截图如下:



六、总结

总的来说,精确度还是很高的。但是可能是用的是模块原因,测量的时候很飘,稍微一动测量结果就相差很多,并且受环境磁场影响大(电脑手机电器之类的),在PCB板或者面包板上可能有所改善。另外,DRDY引脚中断信号和GPIO未用到,可根据需要使用。

七、获取工程源码

关注下方公众号,回复 “HMC5883L” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!


参考资料:

  • HMC5883L 磁力计校准 http://blog.sina.com.cn/s/blog_402c071e0102v8ie.html

HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)相关推荐

  1. 用Redis作为消息队列的使用方法——附C#源码

    消息队列概念 文章源码Github地址:https://github.com/yangwohenmai/TEST/tree/master/Redis 在Redis中,消息队列的用法称之为 redis的 ...

  2. android 桌面图标的点击放大效果,Android仿英语流利说取词放大控件的实现方法(附demo源码下载)...

    本文实例讲述了Android仿英语流利说取词放大控件的实现方法.分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜 ...

  3. java fileupload 进度_Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...

  4. java保存图片进度条_Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...

  5. C++:有限差分求解非粘性时变汉堡方程 和拉克斯-温德罗夫方法(附完整源码)

    C++:有限差分求解非粘性时变汉堡方程 和拉克斯-温德罗夫方法 # include <cmath> # include <ctime> # include <cstdli ...

  6. JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码)

    JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码) dpUniquePaths.js完整源代码 dpUniquePaths.test.js完整源代码 dpUniquePaths.j ...

  7. JavaScript实现唯一路径问题的回溯方法的算法(附完整源码)

    JavaScript实现唯一路径问题的回溯方法的算法(附完整源码) btUniquePaths.js完整源代码 btUniquePaths.test.js完整源代码 btUniquePaths.js完 ...

  8. JavaScript实现截留雨水问题的动态编程方法算法(附完整源码)

    JavaScript实现截留雨水问题的动态编程方法算法(附完整源码) dpRainTerraces.js完整源代码 dpRainTerraces.tset.js完整源代码 dpRainTerraces ...

  9. JavaScript实现截留雨水问题的蛮力方法的算法(附完整源码)

    JavaScript实现截留雨水问题的蛮力方法的算法(附完整源码) bfRainTerraces.js完整源代码 bfRainTerraces.test.js完整源代码 bfRainTerraces. ...

  10. JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)

    JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码) greedyJumpGame.js完整源代码 greedyJumpGame.test.js完整源代码 greedyJumpGame.js ...

最新文章

  1. 最后一片蓝海的终极狂欢-写在Win10发布前夕
  2. 两个有序单链表的并交差运算
  3. C++中#ifndef XXX_H #difine XXX_H解析及dllexport、dllimport用法示例
  4. word文本样式代码样式_使用文本样式表达创建真相来源
  5. Mysql+Navicat for Mysql
  6. 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection
  7. 前端笔记-freemarker模板获取后端数据及提交数据
  8. C语言:从键盘输入一些数,求所有正数之和。当输入负数时,程序结束。
  9. 原创:如何统计并过滤行中单元格有颜色的值
  10. 【莓闻】芮成钢专访黑莓CEO巴尔西利
  11. Electron 初体验,用 js 搭建桌面应用程序
  12. 78㎡网络机房动环监控及告警方案
  13. procast2021学习笔记
  14. 【python:turtle绘画 圣诞树】
  15. jenkins报错hudson.plugins.git.GitException: Could not init /root/.jenkins/workspace/DeployOrder/order
  16. 对二叉树堆排序的升级TOPK问题(跑路人笔记)
  17. C++11之防止类型收窄
  18. 陀曼智能IPO被终止:年营收2.7亿曾拟募资3.8亿 俞朝杰是实控人
  19. [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述
  20. 其实有很多人在用区块链聊天

热门文章

  1. ITIL服务管理知识体系的介绍
  2. 【分享】第48次中国互联网络发展状况统计报告- 数据截止2021年6月
  3. diff和patch工具打补丁
  4. ubuntu开机自动启动脚本_Ubuntu添加开机自动启动程序方法
  5. 树莓派搭建全功能NAS服务器(07):管理你的书库随心阅读
  6. 中国医大CT-YOUNG 闪讯和深澜并存的验证机制研究
  7. PostgreSQL教程
  8. 瑞星企业防毒2010网络版(一)管理中心与客户端部署
  9. 新中大 金蝶 用友产品技术比较
  10. 计算机进化史(纯科普)