【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)
今天我们来学习电子磁力计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磁力计的应用(电子指南针)相关推荐
- STM32系列之HAL库开发
STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- stm32 IOT_基于STM32平台的cubeMX和HAL库详解
课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...
- 配置CLion进行嵌入式STM32的HAL库开发
前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...
- STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发
modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...
- 清泉HAL库开发STM32之基础概念
文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...
- STM32 HAL库开发学习笔记: USART1串口通讯(中断方式) IDE-STM32CubeIDE
STM32串口通讯有三种方式,分别为阻塞(轮询).中断.DMA.这里将用中断的方式开发. 笔者也是刚入门STM32 HAL库开发,该笔记致希望于能帮到初学者,文中配置步骤.代码.实验现象均是笔者实践可 ...
- STM32 HAL库开发转固件库开发杂谈
前言 本文使用代码工程 STM32HAL库开发转固件库开发杂谈-嵌入式文档类资源-CSDN文库 STM32 最早提供固件库开发,在当时也是一个很大的创新.导致大量攻城狮熟悉了固件库开发,后面STM32 ...
- 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项
目录 1.初识HAL库(了解) 1.1CMSIS简介 1.2HAL库简介 2.STM32Cube固件包浅析(了解) 2.1如何获取STM32Cube固件包? 2.2STM32Cube固件包文件夹简介 ...
- STM32如何配置HAL库
STM32如何配置HAL库 前言 相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好.黑猫也好 ...
最新文章
- 二叉树相关性质以及数学证明
- 自定义背景_新版快绘精选:自定义背景墙 | 吊顶 | 云渲染滤镜升级
- 2018第九届山东省ACM省赛
- Java面向对象16种原则
- python管道怎么使用_python中管道用法入门实例
- Linux绚丽屏保xscreensaver安装
- 准提咒LA 观想 3D文字
- matlab绘制垂线(x轴或y轴)
- 旋转矩阵、欧拉角、四元数、旋转向量(旋转角)
- 微信小程序实现音乐播放器(1)
- 为什么要用并发编程?
- ubuntu 16.04下chrome浏览器Flash过期解决方法
- java实训报告结论_Java实验报告(二)及总结
- 2005至2022历史路网下载及分析
- LoRaWAN1.0.x规范详解之空口帧结构
- matlab安装及使用
- GHOSTXP_SP3电脑公司特别版_V2011.07
- 【图像学习之 视频转素描】
- iPhone手机通讯录怎么合并重复联系人?
- 三、深度学习基础1(构成、模型)