【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

2023-05-16

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识,再给一个获取磁力计数据的例子,最后讲解HMC5883L磁力计的校准,以及一些使用中的经验。

1)HMC5883L磁力计的基础知识

磁力计是用来测量磁场强弱(也就是磁感应强度)的,磁感应强度是一个矢量,我们本篇使用的HMC5883L可以用来测量三个轴向的磁感应强度。

磁感应强度的标准单位是特斯拉(Tesla),也有用高斯(Gauss)来表示的,换算关系是1Tesla=10000Gauss。

当垂直于磁场方向长度为1m的导体,通过1A电流时,所受磁场的作用力的大小为1N,则该磁场的磁感应强度为1T。

磁力计可以用来检测地球磁场方向,也就是作为指南针使用,在航模或者四轴飞行器中,可以用来修正偏航角。

2)HMC5883L的数据获取

HMC5883L器件比较小,而且引脚在芯片底下,焊接难度较大,一般建议使用已焊好的模块。本文使用是硬件是STM32F103C8T6最小系统和如下的GY-273模块:

硬件连接上,磁力计模块上只连VCC、GND、SCL、SDA四根线,SCL连接到stm32的PB6,SDA连接到stm32的PB7,由于该模块的电路板上已经设计了上拉电阻,所以I2C接口的两根线不用再外接上拉了。

如果想自己绘制电路板,也可以按如下图纸设计:

在cubemx中创建工程,使用I2C1,此时可以看到PB6和PB7被占用为I2C引脚:

生成工程文件,在keil中打开,先修正cubemx的一个bug,把I2C时钟使能语句提前:

对I2C代码进行一次封装,使用HAL库函数来实现底层的I2C操作,如下用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read两个函数实现:

有了底层的I2C读写函数,我们对HMC5883L的初始化和数据读取时就方便多了。

安装数据手册的寄存器说明,初始化时,只需要设置三个寄存器就行:

然后就可以读取数据了,三个轴向的磁感应强度数据,在寄存器03开始的连续6个字节中,读取后,存放在BUF数组里:

在主函数中,先调用初始化函数,再循环读取数据就行了:

这里将x、y、z三个方向的原始数据都打印出来的,并且计算了x、y方向的反正切角度,如果传感器是水平放置的,x、y方向测量的就是水平方向的磁感应强度,周围没有磁场干扰的话,它们的反正切角度就能指示出地磁场的方向。

上图中atan2(y,x)计算的是y/x的反正切,得到的角度是x轴与地磁北向的夹角。

运行结果如下图:

3)HMC5883L的校准

上面我们已经成功获取了HMC5883L的数据,但是,一般来说都是不太准确的。这是因为传感器初始有误差,并且周围可能有铁制品的器件也会干扰磁场的方向。

如下图所示,只考虑X、Y两个方向,传感器旋转一周时,测量到的地球磁场方向应该如(a)所示是一个正圆形,但是由于受到各种影响,实际可能是一个中心偏离原点的椭圆形:

因此,数据需要校准之后才能有比较好的效果。校准通常有几个方面的工作,一是校准磁场的强度,二是校准磁场的方向。

a)磁场强度校准

在HMC5883L的数据手册里有自检和校准的方法。

简单来说,自检时,可以设置寄存器Configuration Register A的MS1和MS0这两位,使得芯片内部产生一个等效于约1.1高斯的磁感应强度加在三个方向上(实际叠加的是X、Y方向1.16Ga、Z方向1.08Ga),此时设置为单次转换模式,芯片会自动先测量一次外部磁感应强度,再测量一次叠加1.1高斯后的磁感应强度,把两次的值相减之后存放再输出寄存器中。如果增益是默认的,则X、Y轴的原始值应该在951附近,Z轴应该在886附近。(本人手头的这一只,测得的值在1120附近,基本算正常吧)。

校准时,就是把自检时测到的X、Y、Z三个方向的值,与内部叠加的磁感应强度(1.16Ga和1.08Ga)相除,算出一个比值,再用这个比值来反算测到的外部磁感应强度。

一般进行完这一步,可以一定程度地纠正(c)图中的类似变成椭圆形的误差。

b)磁场方向校准

当电路板上或者周围有铁质品或磁性物品时,会在外部叠加一个磁场,使得圆心偏离原点,如果把原始量用于计算地磁北向,就会引起很大误差。这时需要用另一种方法校准。

将传感器Z轴向上,匀速旋转一周,收集X、Y轴的数据;再X或Y轴向上,Z轴水平,匀速旋转一周,收集Z轴数据。将将读取到的各轴数据的最大值加上最小值除以2,就得到一个近似的各轴的原点偏移值,如下:

Xoffset=(Xmax+Xmin)/2
Yoffset=(Ymax+Ymin)/2
Zoffset=(Zmax+Zmin)/2

使用时,原始值减去偏移值,就是方向校准后的值:

X=X原始值-Xoffset
Y=Y原始值-Yoffset
Z=Z原始值-Zoffset

经过上面两步简单的校准后,磁力计的输出值就准确得多了。

4)一些使用经验

a)磁力计会受到周围磁铁或铁制品的影响,由于很多电子元器件(如插针、电阻、电容、芯片)内部都含有铁制品,印制板上的器件也会影响磁力计的数据,需要注意尽量远离;

b)HMC5883L芯片是霍尼韦尔生产的磁力计,同时也有国产的QMC5883L可以替换,引脚定义相同硬件上可以通用,但是寄存器不同,软件上需要进行相应的更改;

c)计算地磁场来找北向时,需要注意,地理的北向与地磁北向不是完全重合的,它们之间的夹角称为“地磁偏角”,与各地的地理位置有关,在用反正切算出地磁北向角时,再加上当地的地磁偏角进行修正即可。地磁偏角需要查资料获得,如北京地区的地磁偏角为5°50’w,也就是正北方向在地磁北向再往西偏5°50‘,使用atan2(y,x)计算出来角度后要再加上5°50‘就是相对于地理正北向的角度了;

d)只有在水平放置时,使用atan2(y,x)计算出来的角度是地磁北向的角度,如果传感器用在四轴飞行器或其他不水平的物体上,还要考虑俯仰、滚转的角度影响,方法如下:

使用加速计进行倾角补偿,先要计算出横滚角(Φ)Roll、以及俯仰角(θ)Pitch,再计算X、Y方向的磁感应强度:

Xh=X*cos(θ)+Y*sin(Φ)*sin(θ)-Z*cos(Φ)*sin(θ)
Yh=Y*cos(Φ)+Z*sin(Φ)

再由Xh和Yh的反正切计算偏航角(ψ)yaw。

考虑到X、Y组成的坐标轴四个象限,可以变成如下公式:

当(Xh<0)时,ψ=180-[arctan(Yh/Xh)*180/π]
当(Xh>0,Yh<0)时,ψ=-[arctan(Yh/Xh)*180/π]
当(Xh>0,Yh>0)时,ψ=360-arctan(Yh/Xh)*180/π
当(Xh=0,Yh<0)时,ψ=90
当(Xh=0,Yh>0),ψ=270

好了,本节关于HMC5883L磁力计的使用就讲到这里了。

如果觉得有用,可以关注我的微 信 公众号“小白白学电子”,可以找到所有源码和参考资料:

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

【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针) 的相关文章

  • TIDB-Error 1105: Out Of Memory Quota问题解决

    一 背景 复杂sql查询报错 二 原因 单条s q l使用内存默认为1G 三 解决 tiup cluster edit config tidb test server configs tidb mem quota query 4294967
  • Kafka-offset链接kafka链接不上

    是在kafka的broker配置server properties的listeners改为listeners 61 PLAINTEXT kafka ip 9092 kafka ip要写具体IP xff0c 不要写localhost
  • python-加密解密

    一 安装对应的库 pip span class token function install span pycryptodome 二 加密和解密的步骤 span class token comment 加密 span def cry pas
  • Js闭包理解、运用

    br onClick function br var pageNum 61 sourcePageNum br return function node br getChildSources node pageNum br pageNum 6
  • 关于C++ 的无名对象

    include lt iostream gt using namespace std class A public explicit A int val m val val cout lt lt 34 call 1 34 lt lt end
  • pt工具的使用(7) pt-archiver的使用

    一 描述 pt archiver 是归档表的工具 xff0c 在 sql 中写入高效归档和清除作业 目标是在不对 OLTP 查询产生太大影响的情况下 xff0c 将旧数据从表中蚕食掉 xff0c 从而实现低影响 仅向前的作业 您可以将数据插
  • linux-node_exporter突然挂掉(couldn‘t get dbus connection)

    一 背景 突然收到一台机器挂掉的告警 xff0c 去上面查看发现机器正常 xff0c uptime正常 xff0c 没有重启情况 xff0c UID 20029的用户是tidb su tidb的时间较长 xff0c node exporte
  • pt工具的使用(1) pt工具的安装

    PT工具是使用Perl语言编写和执行的 xff0c 所以需要系统中有Perl环境 rpm qa perl DBI perl DBD MySQL perl Time HiRes perl IO Socket SSL 检查是否已经安装pt工具所
  • 使用move_base进行路径规划

    本文所实现的效果来自 ROS入门实例 xff0c 对初学者会有一定帮助 move base是ROS环境下一个重要的功能包 xff0c 可以使机器人在指定框架内移动到目标位置 xff0c 是实现后续导航功能的基础 xff0c 很多人想学习gm
  • iperf3-带宽测试工具的详细使用说明

    软件简介 xff1a iperf3 是一个 TCP UDP 和 SCTP 网络带宽测量工具 是用于主动测量 IP 网络上可达到的最大带宽的工具 它支持调整与时序 xff0c 协议和缓冲区有关的各种参数 对于每个测试 xff0c 它都会报告测
  • 用示波器 查看波特率是多少?

    在做涉及串口操作的应用时 xff0c 要看看串口数据是否正常 xff0c 如果串口通信有问题 xff0c 也可以用示波器来诊断 示波器可以通过高低电平来检测哪里有数据 xff0c 哪里没数据 xff0c 判断哪个模块出问题了 示波器具体用法
  • VS C++ 实现发布订阅模式(Publish/Subscribe)——基于旧版PX4 uORB模式

    源码已经上传至我的 span class token punctuation span Gitee span class token punctuation span span class token punctuation span ht
  • 【TCP专题】TCP连接建立

    今天开始 xff0c 我们整理一些关于TCP协议的知识 这块的内容写起来是非常费劲的 xff0c 因为本身TCP协议就不是一个简单的协议 xff0c 它能获得如今的地位 xff0c 和其复杂且出色的表现是分不开的 什么是面向连接 众所周知
  • cmake中添加引用动态链接和静态链接库

    动态库的添加 xff1a span class hljs keyword link directories span span class hljs envvar PROJECT SOURCE DIR span lib span class
  • ESP32的SDK开发之blufi一键配网

    ESP32 是集成 2 4 GHz Wi Fi 和蓝牙双模的单芯片方案 xff0c 采用台积电 TSMC 超低功耗的 40 纳米工艺 xff0c 拥有最 佳的功耗性能 射频性能 稳定性 通用性和可靠性 xff0c 适用于各种应用和不同功耗需
  • javascript作用域链的灵活运用1

    size 61 large javascript比较出彩的运用之一 xff1a 作用域链 1 对于有洁癖的前台人员来说 xff0c 全局变量就像长在美女脸上的黑斑 xff0c 真的无法容忍 2 javascript权威指南 说的那样 xff
  • ESP32的SDK开发之blufi一键配网微信小程序端开发

    上一篇文章简单介绍了blufi配网协议 xff0c 现在来讲讲再微信小程序端实现配网的控制 xff0c 小程序开发是基于官方原生API开发 本人的微信小程序开发也是初学的 xff0c 由于之前没接触过前端开发 xff0c 软件写的很渣渣 蓝
  • 自定义View之渐变色圆形进度条

    先展示下效果图 xff1a 然后按照自定义view的步骤来实现 我们需要将目标定义清楚 xff1a 目标是渐变色圆形进度条 xff0c 那么 xff0c 使用canvas画弧形是基础了 xff0c 另外是渐变色的效果 xff0c 这里使用L
  • NEMA协议解析 (GPS标准协议)

    概述 NMEA是National Marine Electronics Association 的缩写 xff0c 是美国国家海洋电子协会的简称 xff0c 现在是GPS导航设备统一的RTCM标准协议 协议集合 NMEA 0183协议定义的
  • 深入分析websocket协议,从3个方面设计网络应用层协议丨网络编程|网络IO|epoll|socket|网络协议丨c/c++linux服务器开发

    深入分析websocket协议 xff0c 从3个方面设计网络应用层协议 视频讲解如下 xff1a 深入分析websocket协议 xff0c 从3个方面设计网络应用层协议丨网络编程 网络IO epoll socket 网络协议丨c c 4

随机推荐

  • CMake找不到opencv库解决办法

    一 问题详情 在ubuntu中使用CMake编译链接opencv库的程序时FIND PACKAGE OpenCV REQUIRED 报错 xff0c 找不到opencv xff0c 信息如下 xff1a Found OpenCV Windo
  • 详解使用PHP CURL访问HTTPS

    三年前写过一篇 一个简陋的支持HTTPS的PHP CURL封装函数 xff0c 当时只是知其然不知其所以然 xff0c 今天来详细梳理一下 为方便说明 xff0c 先上代码吧 这是今天重新封装的一个函数 curl POST 64 param
  • adb启动Android系统设置命令

    adb打开系统设置的命令 adb命令打开手机设置页面 设置主页面 adb shell am start com android settings com android settings Settings 安全 adb shell am s
  • bootjar和fw配合动态jar

    Gradle 43 bootJar打包SpringBoot工程并分离jar包和配置文件 ruiurrui的博客 CSDN博客 bootjar Gradle 43 bootJar打包SpringBoot工程并分离jar包和配置文件 ruiur
  • 解决 Ubuntu 无法播放 MP4 格式视频的问题的办法

    解决 Ubuntu22 04 无法播放 MP4 格式视频的问题的办法 问题原因 xff1a 系统中的终端上安装缺少的编解码器 解决办法 xff1a 第一条命令将更新存储库 xff1a sudo apt get update 安装以下包含视频
  • 程序查询方式、程序中断、直接内存存取DMA

    程序查询方式 xff1a 当主机进行I O操作时 xff0c 首先发出询问信号 xff0c 读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传输还是等待 这种控制下 xff0c CPU一旦启动I O xff0c 必须停止现行程序的运
  • app监听白天黑夜

    需要在AndroidManifest中的MainActivity配置 xff1a android configChanges 61 34 uiMode 34 64 param newConfig 64 Override public voi
  • 可缩放性ImageView(可以放大缩小)

    由于项目需求的原因 xff0c 最近一直在研究可缩放性ImageView xff0c 用本文来记录一下最近所学 xff1a 该ImageView的实现功能有 xff1a 1 xff09 初步打开时 xff0c 图片按比例满屏 xff08 填
  • 两行代码用camera2 打开闪光灯

    CameraManager c 61 CameraManager getSystemService Context CAMERA SERVICE c setTorchMode c getCameraList 0 true 打开闪光灯 c s
  • 混淆与加固

    https blog csdn net guolipeng network article details 74551968 上面是混淆 加固方面 腾讯乐固首选 xff0c 阿里加固没毛用 xff0c 360次选 原本大小阿里聚安全腾讯云应
  • C语言10进制转16进制

    void decimal to hexaDecimal int a char strs char hex int i 61 0 int j 61 0 int base 61 16 char tmp 16 while a gt 0 j 61
  • socket网络编程select使用方法

    文章以及源码均为原创 xff0c 当然欢迎转载 xff0c 转载请加说明 server h int select int nfds fd set readfds fd set writefds fd set exceptfds const
  • 海豚蓝牙ASIO软件设置方法

    1 为什么要使用海豚蓝牙音箱 xff0c 能带给我什么样的音乐体验 目前市面上的蓝牙音箱基本上是一个全频段的喇叭来播放CD音质的音乐 xff0c 如果是立体声的是不能通过一个喇叭来播放 xff0c 无法实现空间上的立体效果 xff0c 必须
  • pixhawk学习笔记-----mavlink

    mavlink协议 一帧数据的长度为8到263个字节 其具体的解析如下所示 xff1a 字节的索引 值 含义 0 0xFE V1 0 帧头 xff0c 表示一帧数据的开始 1 0 255 表示有效数据的长度 2 0 255 包序列 xff0
  • Ubuntu搭建本地web站点,并内网穿透实现公网访问

    本次教程我们通过搭建Apache服务 xff0c 部署一个简单的静态样例站点 xff0c 并使用cpolar内网穿透将内网样例站点发布到公网来进行演示 1 设置 Apache Web 服务器 1 1 安装Apache Web span cl
  • 为何某些公司不允许使用 C++ STL?

    最初开始禁用 C 43 43 STL xff0c 更多地是早期项目编码实践中留下的惯例 xff0c 被后来的程序员继承下来 老项目中这种选择尤其地多 不过如果有人将其上升到公司行为在不同项目中全面禁用 STL xff0c 则没有必要 xff
  • 手把手教你无线数传电台透明传输的配置全攻略

    透明传输 功能说明 任意电台发送数据 xff0c 具有相同地址且相同信道的电台均可同时接收数据 数据以透明方式发送和接收 xff0c 所发即所收 电台设置 1 需将 OPTION 特殊功能寄存器的第 7 位配置成 0 xff0c 透明传输模
  • unity寻路插件(A* Pathfinding)小结

    A Pathfinding 详细使用教程 基本功能 1 astarpath cs 核心组件 xff0c 相当于 路 xff0c 场景里应该只存在一个 2 Seeker cs 相当于一个代理 xff0c 寻找路径 xff0c 需要绑定在每一个
  • Socket网络通信C++编程总结

    概述 Socket编程有三种 xff0c 流式套接字 xff08 SOCK STREAM xff09 数据报套接字 SOCK DGRAM 原始套接字 SOCK RAW 前两者较常用 xff0c 这里简单总结前两种编程步骤以及一些参考资料 编
  • 【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

    今天我们来学习电子磁力计HMC5883L的使用 先介绍磁力计的基础知识 xff0c 再给一个获取磁力计数据的例子 xff0c 最后讲解HMC5883L磁力计的校准 xff0c 以及一些使用中的经验 1 xff09 HMC5883L磁力计的基