HMC5883l磁力计数据读取

article/2025/10/13 18:32:50

1.数据手册地址
2.芯片介绍

  1. 设备的7位地址为0x1e,读地址为0x3d,写地址为0x3c。如图
    图1
    2.寄存器A
    2.主要需要配置的寄存器有3个。分别是配置寄存器A(0x00),配置寄存器B(0x01)和模式寄存器(0x03)

    1. 配置寄存器A(0x00)是用来配置该装置设置的数据输出速率和测量配置. 要注意的是:
      CR7 要设为0。
      CRA6到CRA5用来设置采样平均数。
      CRA4到CRA2用来设置输出速率。
      CRA1到CRA0用来设置测量模式。
      具体配置参数如图
      在这里插入图片描述
      2.配置寄存器B(0x01)
      CRB7到CRB5用来配置测量范围的。
      CRB4到CRB0要设为0。

在这里插入图片描述
3.模式寄存器(0x03)
MR7到MR2要设为0
MRA1到MRA0设置测量模式。

在这里插入图片描述
测试代码如下:
//i2c.c

//i2c.c#include "stm32f4xx_hal.h"
#include "iic.h"void i2c_init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin =  I2C_SCL_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(I2C_PORT, &GPIO_InitStruct);}void SDA_INPUT(void)
{ GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin =  I2C_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(I2C_PORT, &GPIO_InitStruct);
}void SDA_OUTPUT(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin =  I2C_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(I2C_PORT, &GPIO_InitStruct);}void i2c_Delay(void)
{uint8_t i;for (i = 0; i < 50; i++);
}void delay_us(uint16_t time)
{uint16_t i;for (i = 0 ; i < time ; i++){__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();}}void delay_ms(uint8_t time)
{uint8_t i;for (i = 0 ; i < 10 * time ; i++){delay_us(255);delay_us(255);delay_us(200);		}
}void i2c_Start(void)
{SDA_OUTPUT();I2C_SDA_1();	delay_us(20);	I2C_SCL_1();delay_us(50);	I2C_SDA_0();	delay_us(50);	I2C_SCL_0();	delay_us(10);
}void i2c_Stop(void)
{SDA_OUTPUT();I2C_SDA_0();	//STOP:when CLK is high DATA change form low to highdelay_us(20);	I2C_SCL_1();delay_us(50);I2C_SDA_1();delay_us(30);
}void i2c_Ack(void)
{SDA_OUTPUT();I2C_SDA_0();	delay_us(20);I2C_SCL_1();	delay_us(50);I2C_SCL_0();	delay_us(10);
}void i2c_NoAck(void)
{SDA_OUTPUT();I2C_SDA_1();	delay_us(20);I2C_SCL_1();	delay_us(50);I2C_SCL_0();	delay_us(10);
}bool i2c_WaitAck(void)
{uint8_t ucErrTime = 0x00;SDA_INPUT();	I2C_SDA_1();delay_us(30);I2C_SCL_1();	delay_us(30);	while (I2C_SDA_READ()){ucErrTime++;if (ucErrTime > 250){I2C_SCL_0();delay_us(30);i2c_Stop();return (FALSE);}}I2C_SCL_0();delay_us(30);		return (TRUE);
}void i2c_SendByte(uint8_t _ucByte)
{uint8_t i;SDA_OUTPUT();for (i = 0; i < 8; i++){		if (_ucByte & 0x80)I2C_SDA_1();elseI2C_SDA_0();_ucByte <<= 1;	delay_us(10);		I2C_SCL_1();delay_us(30);I2C_SCL_0();delay_us(10);}
}uint8_t i2c_ReadByte(void)
{uint8_t i;uint8_t value = 0x00;for (i = 0; i < 8; i++){SDA_OUTPUT();I2C_SDA_1();		delay_us(20);I2C_SCL_1();	delay_us(50);SDA_INPUT();value <<= 1;if (I2C_SDA_READ())value++;I2C_SCL_0();	 delay_us(10);}return (value);
}

//i2c.h

#ifndef _iic_h
#define _iic_h
#include "struct.h"//i2c.h#include "gpio.h"
#include "stm32f4xx_hal.h"
#include "stdint.h"//#define I2C_PORT		    GPIOA
//#define I2C_SCL_Pin		GPIO_PIN_13
//#define I2C_SDA_Pin		GPIO_PIN_14#define I2C_PORT		GPIOA           //硬件接口定义
#define I2C_SCL_Pin		GPIO_PIN_9
#define I2C_SDA_Pin		GPIO_PIN_10#define I2C_SCL_1()  	  I2C_PORT->BSRR = I2C_SCL_Pin							// SCL = 1 
#define I2C_SCL_0()  	  I2C_PORT->BSRR = (uint32_t)I2C_SCL_Pin << 16U  		// SCL = 0 
#define I2C_SDA_1()  	  I2C_PORT->BSRR = I2C_SDA_Pin   						// SDA = 1 
#define I2C_SDA_0()  	  I2C_PORT->BSRR = (uint32_t)I2C_SDA_Pin << 16U  		// SDA = 0 
#define I2C_SDA_READ()    (I2C_PORT->IDR & I2C_SDA_Pin)						    //读取SDAvoid i2c_init(void);
void delay_us(uint16_t time);
void delay_ms(uint8_t time);
void i2c_Start(void);
void i2c_Stop(void);
void i2c_Ack(void);
void i2c_NoAck(void);
bool i2c_WaitAck(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);#endif

// hmc5883l.c

#include "hmc5883l.h"void HMC5883L_Init(void)
{i2c_Start();i2c_SendByte(0x3c); i2c_WaitAck();i2c_SendByte(0x00);i2c_WaitAck();i2c_SendByte(0x58);  //输出速率75hzi2c_Stop();i2c_Start();i2c_SendByte(0x3c); //写指令i2c_WaitAck();i2c_SendByte(0x01);i2c_WaitAck();i2c_SendByte(0x60); //测量范围i2c_WaitAck();i2c_Stop();i2c_Start();i2c_SendByte(0x3c); //写指令i2c_WaitAck();i2c_SendByte(0x02);i2c_WaitAck();i2c_SendByte(0x00); //连续测量模式i2c_WaitAck();i2c_Stop();}void HMC5883L_READ(int16_t *x,int16_t *y)
{ uint8_t XYZ_Data[6]={0};i2c_Start();i2c_SendByte(0x3c); i2c_WaitAck(); i2c_SendByte(0x03);  //X轴数据地址i2c_WaitAck(); i2c_Stop();i2c_Start();          i2c_SendByte(0x3d); i2c_WaitAck();for(uint8_t i=0;i<5;i++)     {XYZ_Data[i]=i2c_ReadByte();i2c_Ack();}XYZ_Data[5] =i2c_ReadByte();  i2c_NoAck();i2c_Stop();*x = (int16_t)(XYZ_Data[0]<<8)|XYZ_Data[1];*y = (int16_t)(XYZ_Data[4]<<8)|XYZ_Data[5];}
#ifndef _hmc5883l_h_
#define _hmc5883l_h_#include "iic.h"
void HMC5883L_Init(void);
void HMC5883L_READ(int16_t *x,int16_t *y);
#endif

测试图

void main(){int16_t X_HM,Y_HM;i2c_init();HMC5883L_Init();   //磁力计while(1){osDelay(30);HMC5883L_READ(&X_HM,&Y_HM);printf("%d,%d\r\n",X_HM,Y_HM);}
}

在这里插入图片描述
可以利用公式计算角度:

Angle = (atan2(Y,X) * (180 / 3.14159265) + 180);

http://chatgpt.dhexx.cn/article/24VMf5xm.shtml

相关文章

ESP8266-Arduino编程实例-HMC5883L磁场传感器

HMC5883L磁场传感器 1、HMC5883L介绍 霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动器、…

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

寄存器配置部分 HMC5883L模块具有两个配置寄存器&#xff0c;配置寄存器A用来配置该装置设置的数据输出速率和测量配置&#xff1b;配置寄存器 B 设置装置的增益。 模式寄存器则是用来设定装置的操作模式&#xff0c;有连续测量模式&#xff0c;单一测量模式和闲置模式等。具…

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 注意:所有操…