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

news2025/1/15 23:35:04

今天我们来学习电子磁力计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磁力计的使用就讲到这里了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 录音没有声音,设置AudioSource.VOICE_CALL直接MediaRecorder.start异常等系列问题

一、我的需求&#xff1a;来电后&#xff0c;我的三方应用主动开启录音&#xff0c;挂断后结束录音&#xff0c;查验音频 我遇到的问题&#xff1a;录制的音频没有声音。 通过各种尝试&#xff0c;结果如下 &#xff1a;设置不同的录音来源的效果 MediaRecorder API\创建MediaR…

Springboot 结合 MQTT、Redis ,对接硬件以及做消息分发,最佳实践

Springboot 结合 mqtt、redis对接硬件以及做消息分发&#xff0c;最佳实践 一&#xff0c;认识 需要了解EMQX 基本知识原理&#xff0c;不了解的可以查看我之间的博客&#xff0c;以及网上的资料&#xff0c;这里不在过多撰述。 二&#xff0c;开发思路 这里以对接雷达水位计…

【最优化理论】03-无约束优化

无约束优化无约束优化问题无约束优化问题的应用无约束优化问题的最优性条件无约束-凸函数-最优性条件&#xff08;充要&#xff09;无约束-一般函数-最优性条件必要条件一阶必要条件&#xff1a;梯度为0二阶必要条件&#xff1a;hessian矩阵半正定充分条件二阶充分条件&#xf…

元宇宙-漫游世界后与Cocos一起看湖南卫视直播

使用参考资源 CocosCreator v3.6.2 cocomat 腾讯开源公共组件框架 Cocos Creator 3D特制 Video MeshRender 播放器&#xff08;Cocos商店购买&#xff09; TcPlayer 腾讯开源 Web 播放器 视频流 hls 库 正文 场景漫游引发的思考 元宇宙&#xff0c;虚拟世界。OK&#xff0c;…

【UI编程】将Java awt/swing应用移植到JavaFX纪实

1. 背景 最近想做一个实用的小工具&#xff0c;能屏幕截图&#xff0c;录屏和录制课件&#xff0c;简单的图像处理&#xff0c;和制作gif表情包。翻出了很久以前用Java awt/swing写的一个屏幕截图小程序&#xff0c;能运行&#xff0c;但是屏幕截图到剪贴板后&#xff0c;发现…

深入理解JavaScript-this关键字

先说结论&#xff1a;谁调用它&#xff0c;this 就指向谁 前言 在讲 Function、作用域 时&#xff0c;我们都讲到了 this&#xff0c;因为 JavaScript 中的作用域是词法作用域&#xff0c;在哪里定义&#xff0c;就在哪里形成作用域。而与词法作用域相对应的还有一个作用域叫…

MP157-0-遇见的问题及解决办法

MP157-0-遇见的问题及解决办法1.Win11运行VMware15虚拟机崩溃死机&#xff0c;蓝屏。1.Win11运行VMware15虚拟机崩溃死机&#xff0c;蓝屏。 时间&#xff1a;2022.11.15 解决办法&#xff1a; Hyper-V方案。 打开控制面板-程序-启用或关闭Windows功能&#xff0c;可能你的电…

【JavaScript高级】03-JavaScript内存管理和闭包

JavaScript内存管理和闭包JavaScript内存管理垃圾回收机制算法常见的GC算法-标记清除闭包闭包的概念理解闭包的形成过程闭包的内存泄露JavaScript内存管理 JavaScript会在定义数据时为我们分配内存&#xff1a; JS对于原始数据类型内存的分配会在执行时&#xff0c;直接在栈空…

Sentinel使用教程

文章目录一、Sentinel简介1.sentinel介绍2.sentinel应用场景3.sentinel与hystrix4.sentinel组件介绍二、Sentinel使用说明1.控制台Dashboard2.Sentinel 流量控制和熔断降级3.常见报错解决一、Sentinel简介 1.sentinel介绍 Sentinel 是由阿里巴巴中间件团队开发的开源项目&…

Java三大特性篇之——继承篇(超详解的好吧!)

&#x1f60d;&#x1f60d;&#x1f60d;欢迎欢迎欢迎欢迎&#xff0c;我的朋友&#xff0c;答应我&#xff0c;看完好吗&#xff1f;&#x1f974; 文章目录前言&#xff1a;何为继承&#xff1f;不谈钱的继承实现&#xff01;嘘&#xff1a;偷偷访问父类的私密成员&#xff…

OkHttp相关知识(二)

okhttp中一次网络请求的大致过程&#xff1a; Call对象对请求的封装 dispatcher对请求的分发 getResponseWithInterceptors()方法 一、OkHttp同步方法总结&#xff1a; 创建OkHttpClient和构建了携带请求信息的Request对象将Request封装成Call对象调用Call的execute()发送…

【11.16】Codeforces 刷题

DP\text{DP}DP &#xff1a;&#xff08;今天做的这两道都没啥 DP 相关来着 D. Match & Catch 题意&#xff1a; 给定两个字符串 1≤∣s1∣,∣s2∣≤50001\leq |s_1|,|s_2|\leq 50001≤∣s1​∣,∣s2​∣≤5000 &#xff0c;求最短的满足各只出现一次的连续公共字串。 思…

实验27:红外遥控三级控速风扇实验

今天介绍一个稍微复杂点的实验,复杂在设计和代码 ——OK,受了抖音西湖大学教授刺激,任何人都可以做研究 ——实验:红外遥控三级风速小电扇 ——每按一下CH-,风速从1-2-3-1-2-3-1循环 ——按下CH+,风扇停止 ——没有背景音乐目的是听风扇声音大小判断风速 OK实验介绍完了…

五个可以永远相信的神仙网站推荐

早八的我们是不是偶尔会处在焦虑中呢&#xff1f;一方面年轻人工作压力大&#xff0c;另一方面我们偶尔会感慨我们的碌碌无为&#xff0c;不知道怎样提升自己。今天为大家推荐五个焦虑时可以随手打开看&#xff0c;不知不觉悄悄提升自己的软件。 1.全历史 全历史是一个把历史以…

《元宇宙2086》亮相金鸡奖中国首部元宇宙概念院线电影启动

2022年中国金鸡百花电影节暨第35届中国电影金鸡奖于11月10日至12日在福建厦门举办&#xff0c;中国动漫集团控股子公司北京中文发文化发展有限公司与《元宇宙2086》作者高泽龙在金鸡奖创投论坛正式签约&#xff0c;宣布将共同启动筹拍中国首部元宇宙概念的院线电影。 当日下午&…

如何在Docker中安装MySQL数据库

1、Docker环境 视频教程&#xff1a;https://www.bilibili.com/video/BV1xv4y1S7kA 2、搜索镜像 https://hub.docker.com/网站搜索MySQL&#xff0c;确定其安装版本&#xff0c;这里安装8.0.31版&#xff1b; 3、拉取镜像 [rootlocalhost ~]# docker pull mysql:8.0.31 8.…

市级专精特新的申报条件

一、基本条件&#xff1a;&#xff08;各市政策不同具体情况也不同&#xff0c;下面为济南市企业的申报条件&#xff09; 1、连续经营3年以上&#xff0c;上年度企业营业收入在800万元以上&#xff1b; 2、近两年营业收入复合增长率不低于8%&#xff08;2021年参照国 家级调…

Nginx 反向代理

title: Nginx 反向代理 date: 2022-11-16 10:24 tags: [Nginx,反向代理,正向代理,代理] 文章目录〇、问题一、前言二、正向代理&反向代理2.1 正向代理2.2 反向代理三、Nginx配置反向代理参考更新〇、问题 什么是正向代理&#xff1f;什么是反向代理&#xff1f;Nginx如何配…

Mysql之视图、索引【第五篇】

大纲&#xff1a; 一、视图 1、什么是视图&#xff1f; 1) MySQL 视图(View)是一种虚拟的表&#xff0c;是从数据库中一个或多个表中导出来的表。视图由列和行构成&#xff0c;行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且还是在使用视图时动态生成的。 …

【蓝桥杯物联网赛项学习日志】Day3 关于IIC

经过昨天的学习&#xff0c;已经了解和初步学会配置CubeMax进行初始化配置。今天就开始下一章节的学习&#xff0c;关于IIC。 关键词&#xff1a;I2C OLED SSD1306 理论基础 串行通信接口通讯方式分&#xff0c;可以分为两种&#xff0c;分别是同步和异步。按照数据的传输方…