【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计

STC15F2K60S2 16.384MHz
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
上位机:Vofa+ 1.3.10


硬知识

摘自《HMC5883L中文规格书》、《QMC5883L Datasheet 1.0》、《QMC5883L寄存器对比及参考设置》、QMC5883L说明文档 —— yedongnan001

简介

HMC5883L
        霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。
QMC5883L
        QMC5883L源于霍尼韦尔的HMC5883L,是一款表面贴装的集成了信号处理电路的三轴磁性传感器,应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。
性能对比
在这里插入图片描述

操作模式

HMC5883L

连续测量模式

        连续测量模式,在客户所选择的速率下进行连续的测量,并所测量的更新数据输出寄存器。如果有必要,数据可以从数据输出寄存器重新读取,但是,如果主机并不能确保在下次测量完成之前可以访问数据寄存器,数据寄存器上的旧的数据会被新的测量数据取代。为了保存测量之间的电流,该装置被放置在一个类似闲置模式的状态,但模式寄存器没有改变成空闲模式。即MD[n]位不变。配置寄存器A的设置在连续测量模式时会影响数据输出速率(比特DO[n]) ,测量配置(bits MS[n]),和增益(bits GN[n])。所有寄存器在连续测量模式中保留数值。 在连续测量模式下I2C总线可被网络内的其他装置启用。

单次测量模式

        这是预设的供电模式。在单测量模式,该装置进行单次测量并将测量数据更新至输出数据寄存器中。在完成测量和输出数据寄存器的更新以后,通过设置MD[n] bits,该装置被置于闲置模式,模式寄存器变更为闲置模式。配置寄存器的设置在单一测量模式时影响测量配置(bits MS[n])。。在单测量模式中所有寄存器保留数值。 在单测量模式下I2C总线可被网络内其他装置启用。

闲置模式

        在此模式下,装置可以通过I2C总线访问,但主要电源能耗是禁用的,如ADC,放大器,传感器偏置电流,但不仅限于这些。在空闲模式下所有寄存器保留数值。在闲置测量模式下I2C总线可被网络内其他装置启用。

QMC5883L

连续测量模式

        此模式下,磁性传感器连续进行测量并把测量数据置于数据输出寄存器中。测量数据的偏移和温度的影响将会自动得到补偿。

        正常情况下的读顺序:

  1. 检查DRDY引脚或轮询状态寄存器(06H)中DRDY 位的状态
  2. 读取测量数据,数据寄存器被读取的同时,DRDY和DOR被置0
  3. 数据寄存器一旦被读取,数据保护将启动。直到最后一个数据寄存器(05H)被读取,数据保护才会被解除。其流程图如下:

在这里插入图片描述
        测量时读取
        测量过程中读取的将是之前测量过并保存过的数据,并且这一次测量完成后DRDY将不会被置“1”,即这一次测量的数据丢失掉了。
在这里插入图片描述
        数据未读取
        如果第N个数据被跳过,当前的数据将会被接下来的数据覆盖掉,此种情形下,DRDY保持高电平直到数据被读取,DOR被置“1”,表示有一串数据丢失,同样,下一次读取操作后DOR将被置“0”。
在这里插入图片描述
        数据锁定直至下次测量结束
        只要任意一个数据寄存器被读取,所有测量数据将处于被锁定状态。如果下一次测量结束后,最后一个数据寄存器(05H)仍未被读取,数据寄存器将会拒绝新数据更新当前数据的操作,注意看下图,新数据将会被丢失。此类情形下,DOR将会被置“1”,直至下下次数据被读取。
在这里插入图片描述

待命模式

        QMC5883L上电后默认为待命模式。此状态下,寄存器值将会通过一个超低功耗的LDO保持,对任意寄存器的读写操作都将会唤醒I2C总线接口。内部时钟被停止,同时也不会进行磁场测量。

主要差异

        HMC5883L和QMC5883L的寄存器地址配置不能说一模一样,只能说毫不相关,甚至数据寄存器的顺序及高位低位的先后都不一样,程序如果不加以区分是绝对不能通用的。
        如下表所示,
        HMC5883的七位地址为0x1e(0x3c >> 1 = 0x1e)
        QMC5883的七位地址为0x0d(0x18 >> 1 = 0x0d)(默认,SI接GND) 或 0x0c(0x1a >> 1 = 0x0c)(SI接VDD)
在这里插入图片描述
外观差异
        引自《用前必读.txt》
        进口HMC5883 —— IC丝印 L883
        国产QMC5883 —— IC丝印 D5883
        实际如下图所示,我买到的是QMC5883L
在这里插入图片描述

寄存器

寄存器列表

HMC5883L

在这里插入图片描述

QMC5883L

在这里插入图片描述

配置寄存器

HMC5883L
配置寄存器 A

        配置寄存器是用来配置该装置设置的数据输出速率和测量配置。 CRA0 通过 CRA7 表明位的位置,用 CAR 指示在配置寄存器中的位。 CRA7 指示数据流的第一位。括号中的数目显示是该位的默认值。
在这里插入图片描述
在这里插入图片描述
        下表的数据显示在连续测量模式下的所有可选的输出速率。所有这三个通道应在某一特定数据速率下测量。其他输出速率可以通过控制单测量模式下的 DRDY 中断引脚来获得,最大速率为 160Hz。
在这里插入图片描述
在这里插入图片描述

配置寄存器 B

        配置寄存器 B 设置装置的增益。 CRB0 通过 CRB7 识别位的位置,用 CRB 指示在配置寄存器里的位。CRB7 表示数据流中的第一位。括号中的数目显示的是位的默认值。
在这里插入图片描述
在这里插入图片描述
        下表描述增益设置。使用以下“增益”一栏将counts转换成Guass。在总共磁场强度引起所有数据输出存储器中一个溢位(饱和)时选择较低的增益值(高GN#值)。
在这里插入图片描述

模式寄存器

        该寄存器是一个8位可读可写的寄存器。该寄存器是用来设定装置的操作模式。 MR0通过MR7识别位的位置,MR表明模式寄存器里的位。MR7指示数据流中的第一位。括号中的数字显示的是位的默认值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

QMC5883L
控制寄存器1

        控制寄存器1位于地址09H,它设置操作模式(MODE)。输出数据更新速率(ODR),磁场测量范围或传感器的灵敏度(RNG)和过采样率(OSR)。
        两个MODE寄存器可以传输设备中的操作模式,两种模式是待机模式和连续测量模式。POR (Power-on-Reset)后默认模式为standby。模式之间的切换没有任何限制。
        输出数据速率由ODR寄存器控制。数据更新频率可选择10Hz、50Hz、100Hz和200Hz四种频率。对于大多数的封装应用,我们推荐10hz的低功耗。对于游戏,可以使用高更新率,如100Hz或200Hz。
        磁传感器的磁场范围可以通过寄存器RNG来选择。全量程范围由应用环境决定。对于磁清晰的环境,可以使用低场范围,如+/- 2高斯。磁场范围与磁传感器的灵敏度密切相关。最低的视场范围有最高的灵敏度,因此,更高的分辨率。
        过采样率(OSR)寄存器用于控制内部数字滤波器的带宽。OSR值越大,滤波器带宽越小,带内噪声越小,功耗越高。它可以用来达到噪音和功率之间的良好平衡。有四种过采样率可选,64,128,256或512。
在这里插入图片描述

控制寄存器2

        控制寄存器2位于地址0AH。它控制中断引脚启用(INT_ENB),点滚过功能启用(POL_PNT)和软复位(SOFT_RST)。
        中断启用由控制寄存器2中的INT_ENB控制。一旦中断被启用,当新的数据在数据输出寄存器中,它将置位。
        INT_ENB:“0”:允许中断PIN,“1”:禁止中断PIN
指针滚转函数由ROL_PNT寄存器控制。开启点滚转功能后,如果I2C读取从00H ~ 06H的任意地址开始,则I2C数据指针自动在00H~06H之间滚动。
        ROL_PNT: 0:正常,1:开启指针滚转功能
        软复位可以通过将寄存器SOFT_RST更改为set来实现。软复位可以在任何时间、任何模式下调用。例如,如果软复位发生在连续模式读取中间,由于模式寄存器默认被重置为“00”,QMC5883L立即切换到待机模式。
        SOFT_RST:“0”:正常。“1”:软复位,恢复所有寄存器的默认值。
在这里插入图片描述

SET/RESET Period Register

        SET/RESET周期由FBR[7:0]控制。建议将寄存器0BH写成0x01。
在这里插入图片描述

数据输出寄存器

HMC5883L

数据输出 X 寄存器 A 和B
        数据输出 X 寄存器是两个 8 位寄存器,数据输出寄存器 A 和 B。这些寄存器储存从通道 X 所测量结果。数据输出 X 寄存器 A 储存一个来自测量结果中的 MSB(高位数据),数据输出 X 寄存器 B 储存一个来自测量结果中的 LSB(低位数据)。存储在这两个寄存器的值是一个 16 位值以二进制的补码形式存在,其范围是 0xF800到 0x07FF。DXRA0 至 DXRA7、DXRB0 至 DXRB7 标识出位置, DXRA 和 DXRB 标识出在数据输出寄存器 X 中的位。DXRA7 和 DXRB7 标识出数据流的第一位,括号中的数目显示该位的默认值。
        在事件的ADC上溢或下溢阅读给定的通道,或者如果有一个数学溢出的过程,这种数据寄存器将包含-4096的值。在下一次有效测量完成进行之后,该寄存器上的值将被清除。
在这里插入图片描述
数据输出 Y 寄存器 A 和B
        数据输出 Y 寄存器是两个 8 位寄存器,数据输出寄存器 A 和 B,这些寄存器储存从通道 Y 所测量的结果。数据输出 Y 寄存器 A 储存一个来自测量结果中的 MSB(高位数据),数据输出 Y 寄存器 B 包含一个来自测量结果中的 LSB(低位数据)。存储在这两个寄存器的值是一个 16 位值以二进制的补码形式存在,其范围是0xF800 到 0x07FF。DYRA0 至 DYRA7、DYRB0 至 DYRB7 标识位置, DYRA 和 DYRB 标识在数据输出寄存器 Y 中的位。DYRA7 和 DYRB7 标识数据流的第一位。括号中的数目显示该位的默认值。
        在事件的ADC上溢或下溢阅读给定的通道,或者如果有一个数学溢出的过程,这种数据寄存器将包含值为-4096。在下一次有效测量进行之后,该寄存器上的值将被清除。
在这里插入图片描述
数据输出 Z 寄存器 A 和 B
        数据输出 Z 寄存器是两个 8 位寄存器,数据输出寄存器 A 和 B,这些寄存器储存从通道 Z 所测量的结果。数据输出 Z 寄存器 A 储存一个来自测量结果中的 MSB(高位数据),数据输出 Z 寄存器 B 包含一个来自测量结果中的 LSB(低位数据)。存储在这两个寄存器的值是一个 16 位值以二进制的补码形式存在,其范围是0xF800 到 0x07FF。DZRA0 至 DZRA7、DZRB0 至 DZRB7 标识位置,DZRA 和 DZRB,标识在数据输出寄存器 Z 中的位。DZRA7 和 DZRB7 标识数据流的第一位。括号中的数目显示该位的默认值。
        在事件的ADC上溢或下溢阅读给定的通道,或者如果有一个数学溢出的过程,这种数据寄存器将包含价值-4096。在下一次有效测量进行之后,该寄存器上的值将被清除。
在这里插入图片描述
数据输出寄存器操作
        当一个或一个以上的输出寄存器在被读取时,如果所有六种数据输出寄存器未被读取完,那么新的数据不能被更新到相应的数据输出寄存器。这一要求也影响 DRDY 和 RDY ,在新的数据未被更新到所有输出寄存器之前是不能被清除的。

QMC5883L

        寄存器00H ~ 05H存储连续测量中各轴磁传感器的测量数据。
        在连续测量模式下,输出数据根据控制寄存器1中的数据更新速率ODR设置定期刷新。无论通过I2C读取状态如何,数据都保持不变,直到新数据替换它们。每条轴的数据宽度为16位2的补码,即01H/03H/05H的MSB表示每条轴的符号。每个通道的输出数据范围为-32768到32767。
在这里插入图片描述
温度数据寄存器
        寄存器07H-08H存储温度传感器输出数据。16位温度传感器输出是2的补码。
        温度传感器的增益是工厂校准的,但其偏移量没有被补偿,只有相对温度值是准确的。温度系数约为100 LSB/℃
在这里插入图片描述

状态寄存器

HMC5883L

        状态寄存器是一个8位只读寄存器。该寄存器是表明装置的状态, SR0到SR7表明位的位置,SR表明在状态寄存器的位, SR7指数据流的第一位。
在这里插入图片描述
在这里插入图片描述

QMC5883L

        有两个状态寄存器位于地址06H和0CH。
        寄存器06H有三个位表示状态标志,其余为工厂使用保留。状态寄存器是只读位。
        数据就绪寄存器(Data Ready Register, DRDY),当所有三轴数据就绪时设置,并在连续测量模式下加载到输出数据寄存器。通过I2C推荐通过读取任何数据寄存器(00H~05H)将其重置为“0”
        DRDY: 0:无新数据,1:有新数据
        如果三轴磁传感器通道有数据超出范围,则设置溢出标志(OVL)为“1”。每个轴的输出数据在-32768和32767处饱和,如果任何一个轴超过这个范围,OVL标志设置为“1”。如果下一次测量回到(-32768,32767)的范围,该标志将被重置为“0”,否则,它将保持为“1”。
        OVL: 0:正常,1:数据溢出
        如果在连续测量模式下读取时跳过输出数据寄存器的所有通道,则数据跳过位设置为“1”。通过I2C读取任何数据寄存器(00H~05H),复位为“0”
        DOR: 0:正常,1:跳过数据读取
在这里插入图片描述

识别寄存器

HMC5883L

识别寄存器 A
        识别寄存器 A 是用来识别装置。IRA0 通过 IRA7 表明位的位置,而 IRA 表明在识别寄存器 A 中的位。IRA7 指数据流的第一位。括号中的数目显示的默认值是位
        该装置的识别值存储在本寄存器中。这是一个只读寄存器。
        寄存器值: ASCII 值 H
在这里插入图片描述
识别寄存器 B
        识别寄存器 B 是用来识别装置。IRB0 到 IRB7 表明位的位置,而 IRB 表明在识别寄存器 B 中的位。IRB7 指数据流的第一位。
        寄存器值:ASCII 值 4
在这里插入图片描述
识别寄存器 C
        鉴定寄存器 C 是用来识别装置,IRC0 到 IRC7 表明位的位置,而 IRC 表明在识别寄存器 C 中的位,IRC7 指数据流的第一位。
        寄存器值: ASCII 值 3
在这里插入图片描述

QMC5883L

        这个寄存器是芯片识别寄存器。它返回0xff。
在这里插入图片描述

示例程序

       stdint.h【51单片机快速入门指南】1:基础知识和工程创建
       软件I2C程序见【51单片机快速入门指南】4: 软件 I2C
       串口部分见【51单片机快速入门指南】3.3:USART 串口通信

XMC5883L.c

/**
******************************************************************************
* @file			XMC5883L.c
* @author		Royic
* @date		 	2021-11-27
* @brief 		XMC5883L传感器驱动
******************************************************************************
*/
#include "XMC5883L.h"
#include "./Software_I2C/Software_I2C.h"

static int i2cWrite(uint8_t reg_, uint8_t Data)
{
	return i2c_mem_write(MAG_ADDRESS, reg_, &Data, 1);
}

static int i2cRead(uint8_t reg_, uint8_t len, uint8_t* buf)
{
	return i2c_mem_read(MAG_ADDRESS, reg_, buf, len);
}

/**
* @brief	xmc5883初始化,包含传感器校准
* @note
*/
void xmc5883lInit(void)
{
#ifdef HMC5883L
	i2cWrite(ConfigRegA, Sample_MAX << 5 | DataOutputRate_Max << 2 | NormalOperation);
	i2cWrite(ConfigRegB, Full_Scale_1_9G << 5);
	i2cWrite(ModeRegister, ContinuousConversion);	
#endif
#ifdef QMC5883L
	i2cWrite(ConfigReg1, Sample_MAX << 6 | Full_Scale_2G << 4 | DataOutputRate_Max << 2 | ContinuousConversion);
	i2cWrite(ConfigReg2, Enable_Interrupt_PIN << 7 | ROL_PNT_Normal << 6 | SOFT_RST_Normal);
	i2cWrite(Period_FBR, 0x01);
#endif
}

/**
* @brief	读取磁场传感器数据。
* @note
* @param	magData:存储磁场传感器原始数据的指针
*/
#ifdef QMC5883L
	int16_t QMC5883L_Temp = 0;
#endif
void xmc5883lRead(int16_t *mag_x, int16_t *mag_y, int16_t *mag_z)
{
#ifdef HMC5883L
	uint8_t buf[6];
	i2cRead(MAG_DATA_REGISTER, 6, buf);
	*mag_x = buf[0] << 8 | buf[1];
	*mag_z = buf[2] << 8 | buf[3];
	*mag_y = buf[4] << 8 | buf[5];
#endif
#ifdef QMC5883L
	uint8_t buf[9];
	i2cRead(MAG_DATA_REGISTER, 9, buf);
	*mag_x = buf[0] | buf[1] << 8;
	*mag_y = buf[2] | buf[3] << 8;
	*mag_z = buf[4] | buf[5] << 8;
	QMC5883L_Temp = buf[7] | buf[8] << 8;
#endif
}

XMC5883L.h

#ifndef XMC5883L_H_
#define XMC5883L_H_

#include "XMC5883L.h"
#include "stdint.h"

#define QMC5883L	
//#define HMC5883L	

#define _FAIL		1
#define _SUCCESS	0

#ifdef QMC5883L
	#ifdef HMC5883L
		#error //同时define了QMC5883L、HMC5883L
	#endif
#endif

#ifdef HMC5883L
	#define MAG_ADDRESS				0x1E

		#define MAG_DATA_REGISTER		0x03
		#define MAG_X_DATA_REGISTER		0x03
		#define MAG_Y_DATA_REGISTER		0x07
		#define MAG_Z_DATA_REGISTER		0x05

		#define ConfigRegA				0x00

			// ConfigRegA valid Data output rates for 5883L
			#define DataOutputRate_0_75HZ	0x00
			#define DataOutputRate_1_5HZ	0x01
			#define DataOutputRate_3HZ		0x02
			#define DataOutputRate_7_5HZ	0x03
			#define DataOutputRate_15HZ		0x04
			#define DataOutputRate_30HZ		0x05
			#define DataOutputRate_75HZ		0x06
			#define DataOutputRate_Max		DataOutputRate_75HZ

			// ConfigRegA valid sample averaging for 5883L
			#define SampleAveraging_1		0x00
			#define SampleAveraging_2		0x01
			#define SampleAveraging_4		0x02
			#define SampleAveraging_8		0x03
			#define Sample_MAX				SampleAveraging_8

			#define NormalOperation			0x00
			#define PositiveBiasConfig		0x01
			#define NegativeBiasConfig		0x02

		#define ConfigRegB				0x01

			#define Full_Scale_0_88G		0x00
			#define Full_Scale_1_3G			0x01
			#define Full_Scale_1_9G			0x02
			#define Full_Scale_2_5G			0x03
			#define Full_Scale_4_0G			0x04
			#define Full_Scale_4_7G			0x05
			#define Full_Scale_5_6G			0x06
			#define Full_Scale_8_1G			0x07

		#define ModeRegister			0x02

			#define ContinuousConversion	0x00
			#define SingleConversion		0x01

		#define StatusReg				0x09	

		#define IDRegA					0x0A
		#define IDRegB					0x0B
		#define IDRegC					0x0C
#endif

#ifdef QMC5883L
//	#define MAG_ADDRESS 0x0C	//SI = GND
	#define MAG_ADDRESS 0x0D	//SI = VDD

		#define MAG_DATA_REGISTER		0x00
		#define MAG_X_DATA_REGISTER		0x00
		#define MAG_Y_DATA_REGISTER		0x02
		#define MAG_Z_DATA_REGISTER		0x04
		#define MAG_TEMP_DATA_REGISTER	0x07

		#define ConfigReg1				0x09

			// ConfigReg1 valid Data output rates for 5883L
			#define DataOutputRate_10HZ		0x00
			#define DataOutputRate_50HZ		0x01
			#define DataOutputRate_100HZ	0x02
			#define DataOutputRate_200HZ	0x03
			#define DataOutputRate_Max		DataOutputRate_200HZ

			#define SampleOverRatio_512		0x00
			#define SampleOverRatio_256		0x01
			#define SampleOverRatio_128		0x02
			#define SampleOverRatio_64		0x03
			#define Sample_MAX				SampleOverRatio_512

			#define Full_Scale_2G			0x00
			#define Full_Scale_8G			0x01

			#define StandbyConversion		0x00
			#define ContinuousConversion	0x01

		#define ConfigReg2				0x0A

			#define Enable_Interrupt_PIN	0x00
			#define Disable_Interrupt_PIN	0x01

			#define ROL_PNT_Normal			0x00
			#define ROL_PNT_Enable			0x01

			#define SOFT_RST_Normal			0x00
			#define SOFT_RST_Reset			0x01

		#define StatusReg				0x06

		#define Period_FBR				0x0b

		#define IDReg					0x0d 	//可读到0xFF

		extern int16_t QMC5883L_Temp;
#endif

void xmc5883lInit(void);
void xmc5883lRead(int16_t *mag_x, int16_t *mag_y, int16_t *mag_z);

#endif
//------------------End of File----------------------------

测试程序

#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdint.h"
#include "USART.h"
#include "./Software_I2C/Software_I2C.h"
#include "XMC5883L.h"

void Delay1ms()		//@16.384MHz
{
	unsigned char i, j;

	i = 16;
	j = 237;
	do
	{
		while (--j);
	} while (--i);
}

void delay_ms(uint32_t ms)
{
	while(ms --)
		Delay1ms();
}

#define LED_PORT P0

void main(void)
{
	int16_t mag_x, mag_y, mag_z;

	AUXR &= 0xBF;		//定时器时钟12T模式 1T的51使用12T的定时器程序时需要加入这两句
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 16384000, 1200, DOUBLE_BAUD_ENABLE, USART_TIMER_1);

	xmc5883lInit();

	while(1)
	{
		xmc5883lRead(&mag_x, &mag_y, &mag_z);
		printf("%d,%d,%d\r\n", mag_x, mag_y, mag_z);
	}
}

实验现象

转动板子,可见数据随之变化。
在这里插入图片描述

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
//*************************************************** void Single_Write_HMC5883(uchar REG_Address,uchar REG_data) { HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf HMC5883_Stop(); //发送停止信号 } //********单字节读取内部寄存器************************* uchar Single_Read_HMC5883(uchar REG_Address) { uchar REG_data; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=HMC5883_RecvByte(); //读出寄存器数据 HMC5883_SendACK(1); HMC5883_Stop(); //停止信号 return REG_data; } //****************************************************** // //连续读出HMC5883内部角度数据,地址范围0x3~0x5 // //****************************************************** void Multiple_read_HMC5883(void) { uchar i; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = HMC5883_RecvByte(); //BUF[0]存储数据 if (i == 5) { HMC5883_SendACK(1); //最后一个数据需要回NOACK } else { HMC5883_SendACK(0); //回应ACK } } HMC5883_Stop(); //停止信号 Delay5ms(); } //初始化HMC5883,根据需要请参考pdf进行修改**** void Init_HMC5883() { Single_Write_HMC5883(0x02,0x00); // }
HMC5883L是一种三轴磁力计芯片,它可以测量周围环境中的磁场强度。以下是HMC5883L的初始化过程: 1. 确定I2C地址:HMC5883L的默认I2C地址为0x1E,但是可以通过将其A0、A1、A2引脚接地或连接到电源线上来改变地址,这样可以使用多个HMC5883L设备。 2. 配置测量范围:HMC5883L可以测量的磁场强度范围有几种可选,包括±0.88 Ga、±1.3 Ga、±1.9 Ga、±2.5 Ga、±4.0 Ga、±4.7 Ga和±5.6 Ga。我们需要根据实际应用需求来选择合适的范围。 3. 配置采样率:HMC5883L的采样率可以设置为1到75Hz之间的任何值。我们需要根据实际应用需求来选择合适的采样率。 4. 配置工作模式:HMC5883L有两种工作模式可选,连续测量模式和单次测量模式。在连续测量模式下,磁力计会持续测量并输出数据;在单次测量模式下,磁力计只会进行一次测量并输出数据,然后就会进入待机模式。 5. 开启测量:设置寄存器模式寄存器的值,使磁力计开始进行测量。 下面是一个简单的HMC5883L初始化代码示例(使用Arduino): ``` #include <Wire.h> #define HMC5883L_ADDRESS (0x1E) void setup() { Wire.begin(); // 启动I2C总线 Wire.beginTransmission(HMC5883L_ADDRESS); // 发送初始化命令 Wire.write(0x00); // 配置寄存器A地址 Wire.write(0x70); // 设置测量范围为±1.3 Ga,采样率为15Hz,连续测量模式 Wire.write(0x00); // 设置寄存器B地址 Wire.write(0x20); // 设置磁力计输出数据的方向为正常方向 Wire.write(0x00); // 设置模式寄存器地址 Wire.write(0x00); // 开启测量 Wire.endTransmission(); } void loop() { // 读取磁力计数据 Wire.beginTransmission(HMC5883L_ADDRESS); Wire.write(0x03); // 设置数据输出寄存器地址 Wire.endTransmission(); Wire.requestFrom(HMC5883L_ADDRESS, 6); // 读取6个字节的数据 if (6 == Wire.available()) { int x = Wire.read() << 8 | Wire.read(); // 读取X轴数据 int z = Wire.read() << 8 | Wire.read(); // 读取Z轴数据 int y = Wire.read() << 8 | Wire.read(); // 读取Y轴数据 // 处理数据 } delay(50); // 延时一段时间后再次读取数据 } ``` 请注意,以上示例代码仅供参考,实际应用中需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乙酸氧铍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值