HMC5883L电子罗盘原理及应用,全网最详细~

article/2025/10/13 18:58:07

·寄存器配置部分

HMC5883L模块具有两个配置寄存器,配置寄存器A用来配置该装置设置的数据输出速率和测量配置;配置寄存器 B 设置装置的增益。

模式寄存器则是用来设定装置的操作模式,有连续测量模式,单一测量模式和闲置模式等。具体的情况可以查阅HMC5883L数据手册。

 下面我们对HMC5883L的寄存器进行配置。

#define HMC5883_REG_X_MSB 0x03 //输出X寄存器A中存储测量结果中的MSB(高位数据)
#define HMC5883_REG_X_LSB 0x04 //输出X寄存器B中存储测量结果中的MSB(低位数据)
#define HMC5883_REG_Z_MSB 0x05 //输出Y寄存器A中存储测量结果中的MSB(高位数据)
#define HMC5883_REG_Z_LSB 0x06 //输出Y寄存器B中存储测量结果中的MSB(低位数据)
#define HMC5883_REG_Y_MSB 0x07 //输出Z寄存器A中存储测量结果中的MSB(高位数据) 
#define HMC5883_REG_Y_LSB 0x08 //输出Z寄存器B中存储测量结果中的MSB(低位数据) /* CRA */
#define HMC5883_REG_CRA_MS_MASK      0x03
#define HMC5883_REG_CRA_MS_NORAL     0x00 // default
#define HMC5883_REG_CRA_MS_XYZ_P     0x01
#define HMC5883_REG_CRA_MS_XYZ_N     0x02
#define HMC5883_REG_CRA_MS_REV       0x03#define HMC5883_REG_CRA_DO_Hz_MASK   0x1C
#define HMC5883_REG_CRA_DO_Hz_0_75   0x00
#define HMC5883_REG_CRA_DO_Hz_1_5    0x04
#define HMC5883_REG_CRA_DO_Hz_3      0x08
#define HMC5883_REG_CRA_DO_Hz_7_5    0x0C
#define HMC5883_REG_CRA_DO_Hz_15     0x10 // default
#define HMC5883_REG_CRA_DO_Hz_30     0x14
#define HMC5883_REG_CRA_DO_Hz_75     0x18
#define HMC5883_REG_CRA_DO_Hz_NONE   0x1C#define HMC5883_REG_CRA_MA_MASK      0x60
#define HMC5883_REG_CRA_MA_AVG_1     0x00
#define HMC5883_REG_CRA_MA_AVG_2     0x20
#define HMC5883_REG_CRA_MA_AVG_4     0x40
#define HMC5883_REG_CRA_MA_AVG_8     0x60 // default#define HMC5883_REG_CRA_RUN_MASK     0x80/* CRB */
#define HMC5883_REG_GN_GA_MASK       0xE0
#define HMC5883_REG_GN_0_88_G1370    0x00
#define HMC5883_REG_GN_1_30_G1090    0x20 // default
#define HMC5883_REG_GN_1_90_G820     0x40
#define HMC5883_REG_GN_2_50_G660     0x60
#define HMC5883_REG_GN_4_00_G440     0x80
#define HMC5883_REG_GN_4_70_G390     0xA0
#define HMC5883_REG_GN_5_60_G330     0xC0
#define HMC5883_REG_GN_8_10_G230     0xE0/* MODE */
#define HMC5883_REG_MODE_MR_MASK     0x03    
#define HMC5883_REG_MODE_MR_CON      0x00    
#define HMC5883_REG_MODE_MR_SIG      0x01 // default   
#define HMC5883_REG_MODE_MR_IDLE1    0x02    
#define HMC5883_REG_MODE_MR_IDLE2    0x03    /* read addr*/
#define HMC5883_ADDR                 0X3C
/*-------------------------------------------------------------
IIC地址:0X3C                   
配置寄存器A:0X00 (用于配置该装置设置的数据输出速率和测量配置)
配置寄存器B: 0X01 (用于设置装置的增益)
模式寄存器: 0X02 (用来设定装置的操作模式)
---------------------------------------------------------------*/

·从寄存器读取数值

    /* IIC read x y z data > buf */I2CWriteNByteVal(IIC_HMC5883,HMC5883_REG_X_MSB,0,0);I2CReadNByte(IIC_HMC5883,6,buf);/* buf > short x y z */x = buf[0];x <<= 8;x |= buf[1];z = buf[2];z <<= 8;z |= buf[3];y = buf[4];y <<= 8;y |= buf[5];

·角度获取及计算

在角度计算公式的使用上,atan2函数+180,atan函数+90;

这里计算的原理就是通过获取的X,Y,Z值代入公式进行计算;笔者这边+360,主要是因为芯片焊在板子上之后,方向与原来的方向反了180度,所以在这里+360如何进行逻辑判断。如果不知道自己的方向有没有相反,可以用手机的指南针功能进行对比。

//atan2求出的angle取值范围为[-180,180]angle_xy = atan2(y,x)*(180/3.14159265)+180;angle_xz = atan2(x,z)*(180/3.14159265)+180;angle_yz = atan2(y,z)*(180/3.14159265)+180;//atan求出的angle取值范围为[-90,90]angle_xy = atan(y,x)*(180/3.14159265)+90;angle_xz = atan(x,z)*(180/3.14159265)+90;angle_yz = atan(y,z)*(180/3.14159265)+90;/* 将芯片焊到板子上时,测量方位时正常方位的反面,因而在原有基础上多加180度旋转,再进行判断 */obj.xy_angle_val = atan2(obj.val_y,obj.val_x) * (180 / 3.14159265) + 360;if(obj.xy_angle_val > 360){obj.xy_angle_val = obj.xy_angle_val - 360;}obj.xz_angle_val = atan2(obj.val_x,obj.val_z) * (180 / 3.14159265) + 360;if(obj.xz_angle_val > 360){obj.xz_angle_val = obj.xz_angle_val - 360;}obj.yz_angle_val = atan2(obj.val_y,obj.val_z) * (180 / 3.14159265) + 360;if(obj.yz_angle_val > 360){obj.yz_angle_val = obj.yz_angle_val - 360;

·通过角度计算方位

这边主要通过东南西北,东北西北东南西南,8个方位各个方位的角度区域来推算出相对应的方向。

/* 通过枚举先定义出8个方位 */    
enum direction_type_em {DIRECTION_NE = 0,  DIRECTION_E,  DIRECTION_SE, DIRECTION_S,  DIRECTION_SW, DIRECTION_W,  DIRECTION_NW, DIRECTION_N,  
};/* 再通过角度范围判断,赋值相应的枚举值 */
unsigned char get_direction(void)
{if (obj.xz_angle_val >= 22 && obj.xz_angle_val <= 67) {obj.direction = DIRECTION_NE;} else if (obj.xz_angle_val >= 68  && obj.xz_angle_val <= 111) {obj.direction = DIRECTION_E;} else if (obj.xz_angle_val >= 112 && obj.xz_angle_val <= 157) {obj.direction = DIRECTION_SE;} else if (obj.xz_angle_val >= 158 && obj.xz_angle_val <= 201) {obj.direction = DIRECTION_S;} else if (obj.xz_angle_val >= 202 && obj.xz_angle_val <= 247) {obj.direction = DIRECTION_SW;} else if (obj.xz_angle_val >= 248 && obj.xz_angle_val <= 291) {obj.direction = DIRECTION_W;} else if (obj.xz_angle_val >= 292 && obj.xz_angle_val <= 337) {obj.direction = DIRECTION_NW;} else {obj.direction = DIRECTION_N;}return obj.direction;}/* 通过枚举值赋值相应的字符串,实现通过角度判断方位 */
char* get_direction_str()
{switch(get_direction()) {case DIRECTION_NE: return "NE";case DIRECTION_E:  return "E";case DIRECTION_SE: return "SE";case DIRECTION_S:  return "S";case DIRECTION_SW: return "SW";case DIRECTION_W:  return "W";case DIRECTION_NW: return "NW";case DIRECTION_N:  return "N";}return 0;
}

·对获取的数据进行校准

众所周知,地球是椭圆的,因而我们获取到的全方位数据并非圆形而是椭圆形。因而我们需要将获取到的数据进行校准成圆形。

 

//偏移校正Xoffset = (Xmax + Xmin)/2;Yoffset = (Ymax + Ymin)/2;Zoffset = (Zmax + Zmin)/2;//系数校正Kx = 1;Ky = (Xmax - Xmin)/(Ymax - Ymin);Kz = (Xmax - Xmin)/(Zmax - Zmin);//将椭圆模型校准成圆形后,获取的x,y,z值x = Kx * (x - Xoffset);y = Ky * (y - Yoffset);z = Kz * (z - Zoffset);

在经过一系列的参数校正后,我们获取到的数据,经过数据采集分析,数据接近圆形(但并非完全的圆形)

*在磁力计校准过程中,我们可以在校准前用如下方法判断磁力计当前状态是否正确:
       磁力计的X轴指向正北时,磁力计的寄存器X轴此时输出最大值
       磁力计的X轴指向正南时,X轴应该有最小值。
       磁力计的Y轴指向正北时,磁力计的寄存器Y轴此时应该输出最小值;
       磁力计的X轴指向正南时,Y轴应该有最大值。

·存在的干扰问题

*硬磁干扰:


    硬磁干扰是指固定在磁力计所在机体的表面物质产生的固定方向的干扰。
    硬磁干扰会导致磁力计所采集的数据形成的圆球偏离球心。

*软磁干扰:


    软磁干扰是指固定在磁力计所在机体的表面物质所产生的混乱地磁场的干扰,也就是磁场干扰的方面不是固定的。
    软磁干扰会导致磁力计所采集的数据形成圆球变成椭球。

可能造成干扰的因素:


    电路板上的马达和喇叭、
    含有铁钴镍等金属材料如:屏蔽罩、螺丝、电阻、LCD背板及外壳

  
需要注意的事项:


    在使用传感器側不要使用含铁磁材料(如铁做的插针、插座以及铁材料的导线),这些材料不仅会干扰被测磁场,而且材料的剩磁会导致零位误差。直接将导线焊在传感器板上,不用接插件渡。

        如果想要将芯片手工焊在板子上,那么记住要找个技术好的师傅,这个芯片还是挺考验技术的!此外,如果想要用这块芯片做项目,那么在电路设计的时候,记住连接这块芯片的电容要与数据手册上的数值相对应,否则你可能读不到数据然后怀疑自己的程序有问题。两个电容,一个是4.7uf,一个是0.22uf,注意啦,不一样可能读不出数据。

·HMC5883L与QMC5883L的区别

从两个电子罗盘的数据手册上看,两个模块在寄存器上还是有差异的,具体的话不多说,看下图:

 从模块的芯片丝印来看,两者的丝印是不同的。

HMC5883L的丝印为L883,QMC5883L的丝印正常为HA5883,大家一定要记住!

首先,HMC5883L是进口的芯片,QMC5883L为国产仿制芯片,在价格上差异就不小,其次,根据研发经验来看,国产QMC5883L芯片在稳定性方面就差不少。所以在购买的时候大家要记住差异。

 

        好啦,感谢小伙伴的查阅,在技术方面,有兴趣的小伙伴可以一起探讨一下。


http://chatgpt.dhexx.cn/article/U7tIIIpX.shtml

相关文章

HMC5883L磁力计使用

一、器件简介 HMC5883L是一款三轴磁场传感器&#xff0c;电子指南针罗盘模块。采用IIC通讯协议。 二、工作原理 传统罗盘用一根被磁化的磁针来感应地球磁场&#xff0c;地球磁场与磁针之间的磁力时磁针转动&#xff0c;直至磁针的两端分别指向地球的磁南极与磁北极。电子罗盘也…

HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)

HMC5883L电子罗盘/指南针实现&#xff0c;附带校准方法&#xff08;附STM32 源码&#xff09; 前言一、寄存器详解1.配置寄存器A2.配置寄存器B3.模式寄存器4.数据寄存器5.状态寄存器6.识别寄存器 二、使用步骤1.STM32CubeMX设置2.初始化3.读取原始数据 三、校准程序四、方位角计…

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

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识&#xff0c;再给一个获取磁力计数据的例子&#xff0c;最后讲解HMC5883L磁力计的校准&#xff0c;以及一些使用中的经验。 1&#xff09;HMC5883L磁力计的基础知识 磁力计是用来测量磁场强弱&#xff08;也就…

Web 应用防火墙怎样添加域名

Web 应用防火墙是一款基于 AI 的一站式 Web 业务运营风险防护方案。沉淀了安全大数据检测能力和多年自营业务 Web 安全防护经验。通过 Web 入侵防护、0day 漏洞补丁修复、恶意访问惩罚、云备份防篡改等多维度防御策略全面防护网站的系统及业务安全。 包括四个步骤&#xff1a; …

WEB应用防火墙(WAF启明设备)

1.应用背景 网络安全形式严峻 新型0day漏洞频发 等保2.0 热点需求 行业规范 安全事件 2.产品介绍 1.工作原理 a) 桥模式串行部署于Web服务器前端&#xff0c;对应用层攻击行为进行精确识别和实时阻断&#xff0c;主动而有效的保护 Web应用不被攻击及篡改 b) 单臂代理模…

阿里云服务器接入云盾Web应用防火墙教学

什么是云盾Web应用防火墙&#xff1f; 云盾Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力实现&#xff0c;通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击&#xff0c;过滤海量恶意CC攻击&…

Web应用防火墙和普通防火墙的区别与联系

随着互联网的不断发展&#xff0c;Web应用程序的安全问题日益凸显&#xff0c;各种安全漏洞和攻击手段层出不穷。Web应用防火墙(WAF)作为保障Web应用程序安全的一种有效手段&#xff0c;正在被越来越多的企业所采用。那么&#xff0c;Web应用防火墙到底有什么用呢?web应用防火…

腾某云web应用防火墙-被ban后小技巧绕过

长这样式de 修改xff即可正常访问 &#xff08;X-Forwarded-For Header&#xff09;浏览器插件

WEB应用防火墙安全技术要求与测试评价方法

信息安全技术 WEB应用防火墙安全技术要求与测试评价方法 范围 本标准规定了WEB应用防火墙的安全功能要求、自身安全保护要求、性能要求和安全保证要求&#xff0c;并提供了相应的测试评价方法。 本标准适用于WEB应用防火墙的设计、生产、检测及采购。 规范性引用文件 下列…

开源免费的WEB应用防火墙

开源免费的WEB应用防火墙 排名不分前后 资源宝分享&#xff1a;www.httple.net 南墙waf测试linux7.6和宝塔不兼容&#xff0c;会用使用docker版waf隔离开来https://waf.uusec.com/waf-docker-community.v2.1.5.tgz 1、南墙WEB应用防火墙&#xff08;简称&#xff1a;&#x…

Saas型网站域名如何接入腾讯云的web应用防火墙?

步骤 1&#xff1a;域名添加 使用 Web 应用防火墙&#xff08;WAF&#xff09;防护您的 Web 业务前&#xff0c;需要先将防护的网站接入到 Web 应用防火墙。未完成接入前&#xff0c;您的 Web 应用防火墙防护将无法生效。本文档将指导您如何在 SaaS 型 WAF 中接入域名。 登录…

云上守护者—Web应用防火墙

说到防火墙&#xff0c;大家既熟悉又陌生。熟悉&#xff0c;是因为我们日常或多或少听过见过&#xff0c;例如Window自带防火墙。陌生&#xff0c;是因为我们不知道如何定义防火墙。 什么是防火墙&#xff1f; 应用防火墙对应在现实生活中&#xff0c;像公司大门的保安大爷&am…

web应用防火墙与防火墙的差别

在蔚可云众多安全产品中&#xff0c;有一个名为“web应用防火墙”的产品&#xff0c;很容易引起普通开发者的疑惑&#xff0c;web应用防火墙和传统防火墙到底有什么差别&#xff0c;以至于我们还需要购买这一种产品&#xff1f; 传统防火墙 传统防火墙的功能&#xff0c;主要…

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执…

什么是Web应用程序防火墙?

Web应用程序防火墙/WAF简介 Web应用程序防火墙&#xff08;WAF&#xff09;为来自恶意安全攻击&#xff08;例如SQL注入&#xff0c;跨站点脚本&#xff08;XSS&#xff09;&#xff09;的在线服务提供Web安全。 WAF安全性可以检测并过滤掉可能会使在线应用程序降级&#xff0…

如何不安装ORACLE就可以连接服务器端Oracle

在2021年10月7日开始我的本科实习的第一天&#xff0c;之前自己写demo和练习技术的时候&#xff0c;数据库用的都是MySQL&#xff0c;可视化工具用的都是navicat&#xff0c;来到了实习单位后&#xff0c;发现公司用的是Oracle数据库&#xff0c;工具只能使用plsql 不给使用na…

sqlserver链接oracle服务器

1.sqlserver链接orcacle数据库前提条件&#xff1a; sqlserver数据库服务器上sqlserver服务端的版本与oracle客户端的版本要统一 都是64为或者都是32位 如果sqlserver数据库服务器的版本是32位的&#xff0c;则需要在sqlserver数据库服务器上安装32位的oracle客户端 如果sqlser…

创建sql server 到Oracle的链接服务器

需要一个软件ODAC112040Xcopy_64bit 我连接的oracle是11g r2 sqlserver 是 2016 软件下载 https://pan.baidu.com/s/1OpYmpReEJcPg4wNESWy61Q 或者&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1uXpWP-QmRzEpaDnlwBuHbg 提取码&#xff1a;nazl 注意:所有操…

Oracle服务器和客户端的安装(图解)

处于网络覆盖的时代&#xff0c; 数据库 对于现代社会和行业已经不是什么新鲜事物&#xff0c;它已经被运用到了社会生产和生活的各个领域。作于一款高性能、高生产率的 数据库管理 应用平台&#xff0c;Oracle9i在数据库管理、数据完整性检查、数据库查询性能、数据 安全 性方…

oracle客户端连接oracle服务器

oracle客户端连接oracle服务器 1、配置监听器 2 启动监听器 启动成功&#xff01; 3查看当前数据库local_listener的值 发现该参数没有值&#xff0c;没有设置动态注册的监听器信息 4&#xff0c;查看刚配置监听器listner1状态信息 没有任何服务注册 5 动态注册orcl数据库…