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

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

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

  1. STM32系列之HAL库开发

    STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...

  2. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  3. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  4. 配置CLion进行嵌入式STM32的HAL库开发

    前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...

  5. STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

    modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...

  6. 清泉HAL库开发STM32之基础概念

    文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...

  7. STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE

    STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...

  8. STM32 HAL库开发转固件库开发杂谈

    前言 本文使用代码工程 STM32HAL库开发转固件库开发杂谈-嵌入式文档类资源-CSDN文库 STM32 最早提供固件库开发,在当时也是一个很大的创新.导致大量攻城狮熟悉了固件库开发,后面STM32 ...

  9. 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

    目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...

  10. STM32如何配置HAL库

    STM32如何配置HAL库 前言   相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...

最新文章

  1. 二叉树相关性质以及数学证明
  2. 自定义背景_新版快绘精选:自定义背景墙 | 吊顶 | 云渲染滤镜升级
  3. 2018第九届山东省ACM省赛
  4. Java面向对象16种原则
  5. python管道怎么使用_python中管道用法入门实例
  6. Linux绚丽屏保xscreensaver安装
  7. 准提咒LA 观想 3D文字
  8. matlab绘制垂线(x轴或y轴)
  9. 旋转矩阵、欧拉角、四元数、旋转向量(旋转角)
  10. 微信小程序实现音乐播放器(1)
  11. 为什么要用并发编程?
  12. ubuntu 16.04下chrome浏览器Flash过期解决方法
  13. java实训报告结论_Java实验报告(二)及总结
  14. 2005至2022历史路网下载及分析
  15. LoRaWAN1.0.x规范详解之空口帧结构
  16. matlab安装及使用
  17. GHOSTXP_SP3电脑公司特别版_V2011.07
  18. 【图像学习之 视频转素描】
  19. iPhone手机通讯录怎么合并重复联系人?
  20. 三、深度学习基础1(构成、模型)

热门文章

  1. talib函数功能一览表
  2. 最新新游社iApp源码+后台对接的hybbs内核
  3. 捣鼓小米路由器开发版本
  4. 通过 EWF 创建一个XP Embedded
  5. [Prescan] Prescan与Simulink联合
  6. java lambda函数_Java中的Lambda函数
  7. 二维码----百度百科
  8. QCA9377驱动调试
  9. 7.2.5 dps 测试软件,魔兽世界7.2.5兽王猎DPS有什么改动测试
  10. 发那科机器人圆弧指令怎么用_发那科机器人应用-运动指令入门(1)