HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)
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 源码)相关推荐
- 用Redis作为消息队列的使用方法——附C#源码
消息队列概念 文章源码Github地址:https://github.com/yangwohenmai/TEST/tree/master/Redis 在Redis中,消息队列的用法称之为 redis的 ...
- android 桌面图标的点击放大效果,Android仿英语流利说取词放大控件的实现方法(附demo源码下载)...
本文实例讲述了Android仿英语流利说取词放大控件的实现方法.分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜 ...
- java fileupload 进度_Java上传文件进度条的实现方法(附demo源码下载)
本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...
- java保存图片进度条_Java上传文件进度条的实现方法(附demo源码下载)
本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...
- C++:有限差分求解非粘性时变汉堡方程 和拉克斯-温德罗夫方法(附完整源码)
C++:有限差分求解非粘性时变汉堡方程 和拉克斯-温德罗夫方法 # include <cmath> # include <ctime> # include <cstdli ...
- JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码)
JavaScript实现唯一路径问题的动态编程方法的算法(附完整源码) dpUniquePaths.js完整源代码 dpUniquePaths.test.js完整源代码 dpUniquePaths.j ...
- JavaScript实现唯一路径问题的回溯方法的算法(附完整源码)
JavaScript实现唯一路径问题的回溯方法的算法(附完整源码) btUniquePaths.js完整源代码 btUniquePaths.test.js完整源代码 btUniquePaths.js完 ...
- JavaScript实现截留雨水问题的动态编程方法算法(附完整源码)
JavaScript实现截留雨水问题的动态编程方法算法(附完整源码) dpRainTerraces.js完整源代码 dpRainTerraces.tset.js完整源代码 dpRainTerraces ...
- JavaScript实现截留雨水问题的蛮力方法的算法(附完整源码)
JavaScript实现截留雨水问题的蛮力方法的算法(附完整源码) bfRainTerraces.js完整源代码 bfRainTerraces.test.js完整源代码 bfRainTerraces. ...
- JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)
JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码) greedyJumpGame.js完整源代码 greedyJumpGame.test.js完整源代码 greedyJumpGame.js ...
最新文章
- 最后一片蓝海的终极狂欢-写在Win10发布前夕
- 两个有序单链表的并交差运算
- C++中#ifndef XXX_H #difine XXX_H解析及dllexport、dllimport用法示例
- word文本样式代码样式_使用文本样式表达创建真相来源
- Mysql+Navicat for Mysql
- 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection
- 前端笔记-freemarker模板获取后端数据及提交数据
- C语言:从键盘输入一些数,求所有正数之和。当输入负数时,程序结束。
- 原创:如何统计并过滤行中单元格有颜色的值
- 【莓闻】芮成钢专访黑莓CEO巴尔西利
- Electron 初体验,用 js 搭建桌面应用程序
- 78㎡网络机房动环监控及告警方案
- procast2021学习笔记
- 【python:turtle绘画 圣诞树】
- jenkins报错hudson.plugins.git.GitException: Could not init /root/.jenkins/workspace/DeployOrder/order
- 对二叉树堆排序的升级TOPK问题(跑路人笔记)
- C++11之防止类型收窄
- 陀曼智能IPO被终止:年营收2.7亿曾拟募资3.8亿 俞朝杰是实控人
- [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述
- 其实有很多人在用区块链聊天