HMC5883l磁力计数据读取

news/2024/11/24 11:33:57/

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://www.ppmy.cn/news/754274.html

相关文章

HMC5883L磁力计常见问题解答

原文地址&#xff1a;http://blog.sina.com.cn/s/blog_402c071e0102v8gj.html 本文提供了 HMC5883L 磁力计 的 常见问题的解答&#xff0c;本文来自百度文库&#xff0c;欢迎交流&#xff0c;新浪长沙WalkAnt。 HMC5883L常见问题解答 HMC5883L常见问题解答&#xff1a;本文来源…

HMC5883L磁力计使用

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

HMC5883L 磁力计校准

原文地址&#xff1a; http://blog.sina.com.cn/s/blog_402c071e0102v8ie.html 这里针对 HMC5883L 磁力计 的校准&#xff0c;做一个简单讲解。欢迎交流&#xff0c;新浪长沙WalkAnt。 先看看这篇文章&#xff1a;http://blog.sina.com.cn/s/blog_8240cbef0101i7gn.html 如果磁…

基于DHT网络的BT磁力链蜘蛛源码

几年前研究大文件的下载分发&#xff0c;注意到了libtorrent这个非常完善的BT下载库&#xff0c;因此对BT相关协议也有了粗浅的了解。于是我用这个库提供的接口&#xff0c;实现了一个DHT的蜘蛛。 我把这个蜘蛛放到美国的不限制UDP和BT协议的虚拟机上&#xff0c;每天大概可以…

旅游卡系统招募城市合伙人

旅游业的不断发展&#xff0c;旅游卡系统作为一种新型的旅游消费模式也逐渐被越来越多的人所认可。现在&#xff0c;许多旅游卡系统开始招募城市合伙人&#xff0c;以进一步拓展其市场。 旅游卡系统是一种可以将不同景区、景点门票进行整合&#xff0c;并提供折扣优惠的旅游…

保姆级 雅特力AT32 MCU 从SRAM启动KEIL工程配置步骤(STM/GD/APM通用)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录。 一、前言 开发工具&#xff1a;KEIL 开发板&#xff1a;AT32F415 AT-START-F415 软件工程&#xff1a;雅特力BSP flash_wirte_read 点击…

泛型使用场景和例子

泛型是Java中的一种机制&#xff0c;它允许我们在编写类或方法时使用参数化类型。通过使用泛型&#xff0c;我们可以编写更加通用和类型安全的代码。 下面是一些使用泛型的常见场景和例子&#xff1a; 集合类&#xff1a;Java的集合框架中使用了泛型来增加类型安全性。例如&am…

KnowStreaming系列教程第一篇——安装和使用

KnowStreaming介绍 Know Streaming是一套云原生的Kafka管控平台&#xff0c;脱胎于众多互联网内部多年的Kafka运营实践经验&#xff0c;专注于Kafka运维管控、监控告警、资源治理、多活容灾等核心场景。在用户体验、监控、运维管控上进行了平台化、可视化、智能化的建设&#…