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

这篇具有很好参考价值的文章主要介绍了【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1)HMC5883L磁力计的基础知识

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

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

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

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

2)HMC5883L的数据获取

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

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

运行结果如下图:

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

3)HMC5883L的校准

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

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

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

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

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)计算出来的角度是地磁北向的角度,如果传感器用在四轴飞行器或其他不水平的物体上,还要考虑俯仰、滚转的角度影响,方法如下:

qmc5883 计算角度,嵌入式软件,姿态控制,单片机,stm32,嵌入式硬件

使用加速计进行倾角补偿,先要计算出横滚角(Φ)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磁力计的使用就讲到这里了。

如果觉得有用,可以关注我的微 信 公众号“小白白学电子”,可以找到所有源码和参考资料:文章来源地址https://www.toymoban.com/news/detail-785245.html

到了这里,关于【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(60)
  • STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

    时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向一定要勾选Use Micro LIB  获取ADC通道值 主函数   串口输出

    2024年02月15日
    浏览(49)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(54)
  • STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    目录 1、函数配置过程(这是标准库配置过程): 2、STM32CubeMx配置过程  3、main函数源文件 采集5路ADC数据,并用串口printf()函数打印出来。 实验现象:  ADC转换的初始条件: 1、使能 2、触发源条件完成(这个需要自己配置)利用:HAL_ADC_Start_DMA()函数; ADC中HAL开发优势就是,

    2023年04月08日
    浏览(74)
  • 【HAL库】STM32CubeMX开发----非阻塞延时实验----SysTick(滴答定时器)中断

    STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录 HAL库 有自带的 ms级 延时函数: HAL_Delay(); 缺点: 这是 阻塞延时 方式,就是延时期间,什么都不能干,这样很浪费资源。 这篇文章主要介绍,利用 SysTick(滴答定时器)中断 实现 非阻塞延时 的实验

    2024年02月16日
    浏览(49)
  • 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

    大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。 AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。 通俗来讲,DDS是一种把波形预先存储在芯片内部的DAC,只要设置好它的工作频率,就能按这个频率来输出特定的波形

    2024年02月02日
    浏览(42)
  • 【STM32+cubemx】0027 HAL库开发:MPU6050陀螺仪和加速度计数据的获取和校准

    在制作平衡车或者飞行器时,不可避免地需要知道设备本身的姿态,一般我们使用陀螺仪和加速度计来获取这些信息。 陀螺仪用来测量物体的角度。传统的机械式陀螺的原理,和我们小时候玩的陀螺一样,是利用了高速旋转的物体能保持轴线稳定的特性;机械式陀螺需要的加

    2023年04月08日
    浏览(47)
  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(47)
  • STM32 HAL库 STM32CubeMX -- ADC

    ADC(Analog-to-Digital Converter)指模/数转换器或者模拟/数字转换器。 是指将连续变量的模拟信号转换为离散的数字信号的器件。 也就是将 模拟信号 转化为 数字信号 。 STM32f103 系列有3 个ADC,精度为12 位,每个ADC 最多有16 个外部通道和2个内部信号源。其中ADC1 和ADC2 都有16 个外部

    2024年02月15日
    浏览(41)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包