这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 一文弄懂HMC5883L磁力计的应用

共12条 1/2 1 2 跳转至

一文弄懂HMC5883L磁力计的应用

高工
2022-12-13 22:35:17     打赏
今天我们学习一下电子磁力计HMC5883L的使用。首先给大家简单介绍一下磁力计的基础知识,然后再举一个获取磁力计数据的例子,最后再来讲解HMC5883L磁力计的校准,以及一些使用中的经验。

一、HMC5883L磁力计的基础知识磁力计是用来测量磁场强弱(也就是磁感应强度)的,磁感应强度是一个矢量,我们本篇使用的HMC5883L可以用来测量三个轴向的磁感应强度。磁感应强度的标准单位是特斯拉T(Tesla),也有用高斯Ga(Gauss)来表示的,换算关系是1Tesla=10000Gauss。当垂直于磁场方向长度为1m的导体,通过1A电流时,所受磁场的作用力的大小为1N,则该磁场的磁感应强度为1T。磁力计可以用来检测地球磁场方向,也就是作为指南针使用,在航模或者四轴飞行器中,可以用来修正偏航角。

二、HMC5883L的数据获取

HMC5883L器件比较小,而且引脚在芯片底下,焊接难度较大,一般建议使用已焊好的模块。本文使用是硬件是STM32F103C8T6最小系统,以及如下的GY-273模块:image.png硬件连接上,磁力计模块上只连VCC、GND、SCL、SDA四根线,SCL连接到stm32的PB6,SDA连接到stm32的PB7,由于该模块的电路板上已经设计了上拉电阻,所以I2C接口的两根线不用再外接上拉了。如果想自己绘制电路板,也可以按如下图纸设计:image.png接着是软件设计,在cubemx中创建工程,使用I2C1,此时可以看到PB6和PB7被占用为I2C引脚:image.png生成工程文件,在keil中打开,先修正cubemx的一个bug,把I2C时钟使能语句提前:image.png对I2C代码进行一次封装,使用HAL库函数来实现底层的I2C操作,如下用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read两个函数实现:image.png有了底层的I2C读写函数,我们对HMC5883L的初始化和数据读取时就方便多了。按照数据手册的寄存器说明,初始化时,只需要设置三个寄存器就行:image.png然后就可以读取数据了,三个轴向的磁感应强度数据,在寄存器03开始的连续6个字节中。读取后,存放在BUF数组里:image.png在主函数中,先调用初始化函数,再循环读取数据就行了:image.png这里将x、y、z三个方向的原始数据都打印出来的,并且计算了x、y方向的反正切角度,如果传感器是水平放置的,x、y方向测量的就是水平方向的磁感应强度,周围没有磁场干扰的话,它们的反正切角度就能指示出地磁场的方向。上图中atan2(y,x)函数计算的是y/x的反正切,得到的角度是x轴与地磁北向的夹角。运行结果如下图:image.png

三、HMC5883L的校准

上面我们已经成功获取了HMC5883L的数据,但一般来说都是不太准确的。这是因为传感器初始有误差,并且周围可能有铁制品的器件也会干扰磁场的方向。如下图所示,只考虑X、Y两个方向,传感器旋转一周时,测量到的地球磁场方向应该如(a)所示是一个正圆形。但是,由于受到各种影响,实际可能是一个中心偏离原点的椭圆形:image.png因此,数据需要校准之后才能有比较好的效果。校准通常有几个方面的工作,一是校准磁场的强度,二是校准磁场的方向。

1、磁场强度校准

在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)图中的类似变成椭圆形的误差。

2、磁场方向校准

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

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

四、使用经验

(1)磁力计会受到周围磁铁或铁制品的影响,由于很多电子元器件(如插针、电阻、电容、芯片)内部都含有铁制品,印制板上的器件也会影响磁力计的数据,需要注意尽量远离;(2)HMC5883L芯片是霍尼韦尔生产的磁力计,同时也有国产的QMC5883L可以替换,引脚定义相同硬件上可以通用,但是寄存器不同,软件上需要进行相应的更改;(3)计算地磁场来找北向时,需要注意,地理的北向与地磁北向不是完全重合的,它们之间的夹角称为“地磁偏角”,与各地的地理位置有关,在用反正切算出地磁北向角时,再加上当地的地磁偏角进行修正即可。地磁偏角需要查资料获得,如北京地区的地磁偏角为5°50’w,也就是正北方向在地磁北向再往西偏5°50‘,使用atan2(y,x)计算出来角度后要再加上5°50‘就是相对于地理正北向的角度了;(4)只有在水平放置时,使用atan2(y,x)计算出来的角度是地磁北向的角度,如果传感器用在四轴飞行器或其他不水平的物体上,还要考虑俯仰、滚转的角度影响,方法如下:image.png使用加速计进行倾角补偿,先要计算出横滚角(Φ)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     磁力计     应用    

专家
2022-12-14 01:33:32     打赏
2楼

感谢楼主的分享,很实用了。


高工
2022-12-14 04:07:13     打赏
3楼

感谢楼主的分享,很实用了。


专家
2022-12-14 05:26:12     打赏
4楼

看看


专家
2022-12-14 06:26:11     打赏
5楼

感谢楼主分享


专家
2022-12-14 07:01:36     打赏
6楼
谢谢楼主分享



专家
2022-12-14 08:44:08     打赏
7楼

步骤很详细了,值得学习,谢谢!


工程师
2022-12-14 10:46:23     打赏
8楼

很详细 很实用


工程师
2022-12-14 10:48:28     打赏
9楼

谢谢楼主的分享 


工程师
2022-12-14 10:51:00     打赏
10楼

干货


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]