0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用HMC5883L实现三轴磁力计的设计

科技观察员 来源:Ejshea 作者:Ejshea 2022-06-10 16:24 次阅读

在中,你可以使用 HMC5883L 三轴力计测量这个地球磁场的大小和方向。

介绍

在这个中,我们的 HMC5883L 3 项目设备可以测量地球将磁力计连接到 Arduino 方向。 Uno。它是一种以低轴设备中的设备,可以在手机或导航中,找到提供准确的您航还可以使用它们来检测含铁(含铁)金属,因为金属中的铁在靠近传感器的时候会改变磁场。

别迷路,让我们开始吧!

204像素LCD

与16x2 LCD相比,20x4 LCD每行增加了两行。与我们在之前的项目中使用的16x2类似,204LCD使用日立x,因此命令和接口也是一样的。具有相同的 16 针接头,允许您在不更改任何接线的情况下拔下 16x2 LCD 并插入 20x4。我们列唯一需要的是一行代码 lcd.begin(20, 4),它指定 LCD 的(第一个个)和行(第二个参数)。20x4 LCD 的图像如下所示:

pYYBAGKi_1OAQ0stAAUCmjAfNoM049.png

HMC5883L 三轴磁力计

HMC5883L 3轴磁力计可以精确测量地球在x、y、z的大小和方向。是一款外形类似的低调设备,可以让您将其插入到几乎任何需要指南的项目中。下面提供了一些不同的规格

pYYBAGKi_0-AJzC1AAEims2U_eQ391.png

设备 HMC 的 5 分 DR 板和 5 分 DR 的数据线组成: VIN、DY、SCL 组成的数据线(如图所示)该模块在 2.7V 至 6.5V 的电压工作,但我们无法让磁力计在 5V 电压下工作,因此我们建议使用 3Vdc 范围内的连接模块。电压。

为了使用与部署设备通信的方式,我们使用 CL 和 S 的 I2C 来配置设备上的交付模式和输出模式),并获取 X Y 和 Z 。该0x1 0x1 设备进行7 次编排,因此在IE2C 处设备上进行多个。

DR(但您的数据)用于传输(Uno X、Y和Z向主设备的数据已发送)17月7日。DR DY DY,可以通过使用频率到达目的地。您可以访问可以在这个目的地连接到这个目的地,但不能在这个目的地中使用有效的地权。

poYBAGKi_0uAWoweAAK1V46bPiU493.png

该设备在其这些 3 个轴的每个轴上装有一个电阻器,用于测量下磁场变化。在磁场存在的情况下,元件的电阻会发生变化,从而导致输出电压发生变化。器件的 12 位 ADC 在每个轴上测量,然后将测量结果写入相应的 X、Y 和 Z 8 位数据。

下面这张表要显示屏幕显示我们的屏幕显示价值。在屏幕上的屏幕显示我们的屏幕。 IC的数据表:

pYYBAGKi_0aAHIgFAAKV65015Nk554.png

当您必须围绕 X、Y 和 Z 轴旋转设备时,各个轴的结构发生变化,使之如图所示。

poYBAGKi_0OAWTr_AAILOOTqA2s595.png

将磁力计安装到您的图标。您将需要一个 M2 角支架、M2 螺栓和 M2 允许以六角支架来安装它。这个 XY 平面与提供垂直方向,并保持Adapticon您可以使用正确的计算盘航向您的燃料罐,因此可以向您使用准确的计算盘。确保有色金属磁安装的硬件围绕着 Z 轴显示。

我们将把 12 英寸跨接线连接到上面,我们就可以在左右方向连接设备这样自由。

poYBAGKi_z-AWsJfAAUcxwiEZRk869.png

无焊面包板

您如果使用的是无焊面包板,请使用下面的示意图为 16×2 LCD 进行必要的连接。磁力计通过 12 英寸 F/M 跳线直接连接到 Uno。我们使用 Uno 的3V电源,是Fuel的3V而不是3能够实现。因为公头针的0.1英寸间距太近,将测试夹线电缆安装

注:16×4液晶显示,但需要2×4液晶显示与中图。

pYYBAGKi_zuACyBYAAI0CamHGdU109.png

如果您连接

到 Fuel Can 的悬空制作,请继续操作。您需要的天线和两个接地板为您提供测试使用接线夹,+5个接地线的接地线。用于为 LCD 供电

计算机,USB的A端插入USB1型,使用,将B端未连接型插入USB1型连接的端头。 6‘A A型连接器 - 外部连接器插入(即主机)。 AC-DC 电源为 FuelCan 供电。

函数首先必须从setOperatingMode

()和设备通信中使用setOperatingMode()和设备通信,因此请在我们的设备上使用setOperatingMode()进行配置,以将数据操作模式设置为连续,将每个测量输出的平均样本数设置为 8 个。其他所有内容都将保留默认值。

现在已经配置好了,我们可以开始使用函数getXYZ()获取原始X、Y和Z数据。这个函数获取X、Y和Z的每一个16位数据。getXYZ()中的Wire.requestFrom()函数用于请求 6 个字节的数据。

X、 和 Z 的值,为了使用 Y 函数convert(用于测量我们转换为高的单位)。必须进行转换,必须使用 IC 数据表格的原始值表 9(用于使用 1090 的大小,我们可以用一个简单的缩放比例,将我们的每一个镜头都以高标准的比例分配给我们。

在我们将数据输出到设备之前,可以用它来计算出设备的最后一个方向。 () 完成。了解切是在 (X, Y) 点和 x 轴之间计算的,如下图所示。我们的原因是能够计算出所有象限的使用情况。

poYBAGKi_zaAJWZ3AACObu9iAE0815.png

atan2弧度角度,因此我们可以将其转换为度数。 360我们可以删除360。并且航向数据已经归化,我们可以通过现在已经展示给它计算。

//将 HMC5883L 3 轴数字罗盘连接到 Arduino Uno

/*Copyright (c) 2019, ProteShea LLC

保留所有权利。 如果满足以下条件,则允许

以源代码和二进制形式重新分发和使用,无论是否修改: 1. 重新分发源代码必须保留上述版权 声明、此条件列表和以下免责声明。 2. 二进制形式的再分发必须在 随分发提供的文档和/或其他材料中复制上述版权 声明、此条件列表和以下免责声明。 3. 既不是版权持有人的姓名,也不是

未经事先书面许可,其贡献者的姓名可用于认可或推广

源自本软件的产品

本软件由版权持有人“按原样”提供,

不提供任何明示或默示的保证,包括但不限于对

适销性和特定用途适用性的默示保证

。在任何情况下,版权所有者均不对任何

直接、间接、偶然、特殊、惩戒性或后果性损害

(包括但不限于采购替代商品或服务;

使用、数据或利润或业务损失)负责中断)无论是由何种原因造成的,

以及基于任何责任理论,无论是合同、严格责任或侵权

(包括疏忽或其他原因)以任何方式因使用本

软件而引起的,即使已被告知存在此类损害的可能性。

*/

#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//工作模式发送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮动航向;
浮动高斯X;
浮动高斯Y;
浮动高斯Z;
void setup() {
Wire.begin();
序列号.开始(9600);
设置操作模式(连续);
集合样本();
}
无效循环() {
getXYZ();
转换(x,y,z);
获取航向(高斯X,高斯Y,高斯Z);
Serial.print("X:");
Serial.print(gaussX);
Serial.print("Y:");
串行打印(高斯Y);
Serial.print("Z:");
Serial.println(gaussZ);
Serial.print("标题:");
Serial.println(标题);
延迟(500);
}
//将原始X、Y、Z计数转换为高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考虑磁偏角(取决于位置的磁场误差)
void getHeading(float X, float Y, float Z){
heading = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (标题 < 0) 标题 += 360;
如果(标题> 360)标题-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//写入配置A寄存器
Wire.write(0x70);//8个样本平均,15Hz输出速率,正常测量
Wire.endTransmission();
延迟(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//写入模式寄存器
Wire.write(addr);//设置测量模式
Wire.endTransmission();
延迟(10);
}
//从寄存器 0x​​03 到 0x08 获取 X、Y、Z 的原始计数
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//读取X的高字节
x = temp << 8;
temp = Wire.read();//读取X的低字节
x = x |温度;
temp = Wire.read();//读取 Z 的高字节
z = temp << 8;
temp = Wire.read();//读取 Z 的低字节
z = z |温度;
temp = Wire.read();//读取 Y 的高字节
y = temp << 8;
temp = Wire.read();//读取 Y 的低字节
y = y |温度;
}
}

下一个示例通过调用函数writeLCD()在20×4 LCD上显示数据。

poYBAGKi_yuAP1c6AATm1DmoIzA039.png

//将 HMC5883L 3 轴数字罗盘连接到 Arduino Uno 并

在 20x4 LCD 上显示 //数据

/*版权 (c) 2019,ProteShea LLC

保留所有权利。 如果满足以下条件,则允许

以源代码和二进制形式重新分发和使用,无论是否修改: 1. 重新分发源代码必须保留上述版权 声明、此条件列表和以下免责声明。 2. 二进制形式的再分发必须在 随分发提供的文档和/或其他材料中复制上述版权 声明、此条件列表和以下免责声明。 3. 既不是版权持有人的姓名,也不是

未经事先书面许可,其贡献者的姓名可用于认可或推广

源自本软件的产品。

本软件由版权持有人“按原样”提供,

不提供任何明示或默示的保证,包括但不限于对

适销性和特定用途适用性的默示保证

。在任何情况下,版权所有者均不对任何

直接、间接、偶然、特殊、惩戒性或后果性损害

(包括但不限于采购替代商品或服务;

使用、数据或利润或业务损失)负责中断)无论是由何种原因造成的,

以及基于任何责任理论,无论是合同、严格责任或侵权

(包括疏忽或其他原因)以任何方式因使用本

软件而引起的,即使已被告知存在此类损害的可能性。

*/

#include
#include
//寄存器地址映射
#define configA 0x00
#define configB 0x01
#define mode 0x02
#define dataOutX_U 0x03
#define dataOutX_L 0x04
#define dataOutZ_L 0x05
#define dataOutZ_L 0x06
#define dataOutY_L 0x07
#define dataOutY_L 0x08
#define statusReg 0x09
//操作模式发送到模式寄存器(0x02)
#define Continuous 0x00
#define single 0x01
#define idle 0x02
#define i2c_addr 0x1E
#define gain 1090
const int RS = 2, EN = 3, D4 = 4, D5 = 5, D6 = 6, D7 = 7;
LiquidCrystal lcd(RS,EN,D4,D5,D6,D7);//设置连接到 LCD 的 Uno 引脚,4 位模式
int16_t x = 0;
int16_t y = 0;
int16_t z = 0;
浮动航向;
浮动高斯X;
浮动高斯Y;
浮动高斯Z;
void setup() {
Wire.begin();
lcd.开始(20,4);//设置20列4行20x4 LCD
setOperatingMode(continuous);
集合样本();
}
无效循环() {
getXYZ();
转换(x,y,z);
获取航向(高斯X,高斯Y,高斯Z);
写液晶显示器();
延迟(500);
}
无效写入液晶显示器(无效){
lcd.clear();
lcd.print("X:");
lcd.print(高斯X);
lcd.setCursor(0,1);
lcd.print("Y:");
lcd.print(高斯);
lcd.setCursor(0,2);
lcd.print("Z:");
lcd.print(高斯Z);
lcd.setCursor(0,3);
lcd.print("标题:");
lcd.print(标题);
}
//将原始X、Y、Z计数转换为高斯
void convert(int16_t rawX, int16_t rawY, int16_t rawZ){
gaussX = (float)rawX/gain;
gaussY = (float)rawY/gain;
gaussZ = (float)rawZ/增益;
}
//考虑磁偏角(取决于位置的磁场误差)
void getHeading(float X, float Y, float Z){
航向 = (atan2(Y,X) - 0.1) * 180 / PI;
如果 (标题 < 0) 标题 += 360;
如果(标题> 360)标题-= 360;
}
void setSamples(void){
Wire.beginTransmission(i2c_addr);
Wire.write(configA);//写入配置A寄存器
Wire.write(0x70);//8 个样本平均,15Hz 输出速率,正常测量
Wire.endTransmission();
延迟(10);
}
void setOperatingMode(uint8_t addr){
Wire.beginTransmission(i2c_addr);
Wire.write(模式);//写入模式寄存器
Wire.write(addr);//设置测量模式
Wire.endTransmission();
延迟(10);
}
//从寄存器 0x​​03 到 0x08 获取 X、Y、Z 的原始计数
void getXYZ(void){
Wire.beginTransmission(i2c_addr);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(i2c_addr, 6);
if (Wire.available() >= 6){
int16_t temp = Wire.read();//读取X的高字节
x = temp << 8;
temp = Wire.read();//读取X的低字节
x = x |温度;
temp = Wire.read();//读取 Z 的高字节
z = temp << 8;
temp = Wire.read();//读取 Z 的低字节
z = z |温度;
temp = Wire.read();//读取 Y 的高字节
y = temp << 8;
temp = Wire.read();//读取 Y 的低字节
y = y |温度;
}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 三轴磁力计
    +关注

    关注

    0

    文章

    7

    浏览量

    8342
  • HMC5883L
    +关注

    关注

    0

    文章

    25

    浏览量

    14925
收藏 人收藏

    评论

    相关推荐

    Protues中HMC5883L寻找

    最近要做一个电子指南针,需要用到元件HMC5883L,软件元件库中找不到,求帮助。
    发表于 11-27 13:03

    有谁用STM32编过HMC5883L的程序啊?

    有谁用STM32编过HMC5883L的程序啊?电子罗盘求指教。。。。
    发表于 06-28 15:15

    求助啊 为什么我的HMC5883L读出的原始数据中Y一直都是-4096

    =-4096z=-476x=-137y=-4096z=-476这是hmc5883l代码# include "hmc5883l.h"//磁力计初始化void HMC5883L
    发表于 02-22 23:04

    HMC5883L

    HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系列磁阻传感器,并附带集成电路包括
    发表于 04-16 09:04

    HMC5883L常见问题解答

    HMC5883L常见问题解答
    发表于 08-17 12:21

    请问怎么进行HMC5883L数据的读取

    最近在调试GY-86模块,调试到HMC5883L的时候读回来的数据都是0,仔细看原理图发现HMC5883L的SDA,SCL是连接到MOU6050的XDA,XCL上的,这样的话就是MPU6050作为
    发表于 05-08 04:16

    请问MPU6050+HMC5883L的数据融合磁力计如何加入算出YAW的准确角度?

    最近一直在研究四,读完6050后,加入磁力计对YAW角度进行校准,磁力计选用HMC5883L,读取完数据后,按照网上说法,用互补滤波的方法进行数据融合。融合完后发现我实际旋转的角度与
    发表于 06-06 04:36

    如何处理磁力计HMC5883L获取的数据?

    HMC5883L来矫正陀螺仪使用四元数法来求偏航角,想问问如何处理磁力计HMC5883L获取的数据?
    发表于 07-25 19:44

    请问MPU6050,HMC5883L,ADXL345之间我该选择哪个?

    我想测量一个物体的自身旋转角度(应该是相当于自身的偏航角yaw),最近一段时间一直在看相关的资料和一些程序。MPU6050是 3轴角度+3加速度,HMC5883L磁力计,ADXL345是加速度
    发表于 07-31 04:36

    如何基于VHDL语言通过IIC总线电路获取HMC5883L芯片的数据并转存到PFGA上,最终在LCD上显示结果?

    要求是利用IIC总线电路实现霍尼韦尔HMC5883L芯片的设置和数据读取,要求利用VHDL语言,并实时显示。如何通过IIC总线电路对HMC5883L
    发表于 12-04 23:43

    如何使用这款QMC5883L磁力计

    QMC5883L磁力计介绍QMC5883L是一款国产磁力计,与HMC5993 pin to pin 兼容,软件上只要少许改动,便可达到相同效
    发表于 02-11 07:26

    HMC5883L中文

    HMC5883L中文
    发表于 12-13 17:15 13次下载

    hmc5883l的特点及优点_HMC5883L磁力计校准方法

     霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系列磁阻传感器,并附带
    发表于 03-08 10:32 1.6w次阅读

    HMC5883L应用说明

     霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系列磁阻传感器,并附带
    发表于 03-08 10:49 2.8w次阅读

    磁力计HMC5883L传感器特性

    霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域(指南针、GPS)。 HMC5883L 包括最先进的高分辨率 HMC
    的头像 发表于 07-20 10:40 716次阅读