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

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

3天内不再提示

浅谈HMC5883L和QMC5883P磁力计的区别及STM32F103驱动

jf_88434166 ? 来源:jf_88434166 ? 作者:jf_88434166 ? 2025-08-30 10:10 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

HMC5883L和QMC5883P芯片区别

在这里插入图片描述

HMC5883L和QMC5883P两款都是磁力计芯片,HMC5883L是Honeywell生产的芯片,QMC5883P是QST公司生产的替代芯片,两者在硬件封装上是兼容的,都是LGA-16 3.0x3.0x0.9mm封装,引脚上也都是兼容的,但是引脚功能上HMC5883L比QMC5883P多了一个DRDY引脚,可以用于中断控制,还有软件驱动上是不兼容的,寄存器地址以及IIC地址都是不相同的,不过底层驱动原理都是相同的。
在这里插入图片描述
以上是两个芯片的一些重要参数的区别,还有一个重要的区别是两者的磁场方向上是有区别的,如下图:
在这里插入图片描述
进行计算的时候需要注意区分下。

HMC5883L获取ID及三轴磁力计数据

HMC5883L手册链接:HMC5883L手册

寄存器说明

这里先看下HMC5883L的寄存器表格:
在这里插入图片描述
首先注意下10/11/12寄存器这里用10进制来写了,实际代码中读取的寄存器地址应该分别是0A,0B,0C的寄存器地址。
在这里插入图片描述

Configuration Register A(00H) :位CRA7保留;CRA6-CRA5配置采样平均次数;CRA4-CRA2配置输出速率(配置的是连续测量模式下的输出速率(如下表1)。如果是在单次测量模式下,可以通过监测 DRDY 中断引脚可以实现最高 160 Hz的输出速率);CRA1-CRA0:测量配置(主要用于正常测量启用正/负偏置自检(self-test) :00 = Normal、01 = Positive bias (自检+)、10 = Negative bias (自检?)、11 = 保留/未定义,具体说明可以看下表2)。
输出速率表格
在这里插入图片描述
Configuration Register B(01H) :前三位GN通过设置增益确定量程范围,如下表,剩下的位并未使用,需要配置为0。(对于B寄存器的具体说明可以看资料对应的章节说明,这里就不赘述了)
在这里插入图片描述
Mode Register(01H) :这个寄存器最高位MR7是设置为1可以配置成高速IIC模式,MR6到MR2未使用配置为0,MR1和MR0是用来配置模式,配置00时连续测量模式,01是单次测量模式,剩下两个都是休眠模式。如下表:
在这里插入图片描述03-08H :分别是三轴数据的寄存器了,都是12bits数据。
09H :状态寄存器,只读寄存器,用来读取数据锁存位和数据完成标志位。

名称功能说明
7–30保留,固定为 0
2LOCK数据锁存位。当一个轴的数据输出寄存器被读出时,其他两个轴的数据会锁存,直到它们也被读出或发生新的测量更新。此位为1表示在读取过程中有新数据到来,旧数据被锁存;0表示没有锁存。
1RDY数据准备完成标志。当有新数据写入输出寄存器时置 1,表示三轴数据已更新,可以读取。读取一次数据后会自动清零。
00保留

0A-0CH:分别是存储3个ID身份的ASCII码,分别对应:0A-H,0B-4,0C-3
以上就是所有寄存器的简单介绍了,下面开始初始化模块和读取数据。

获取HMC5883L ID和磁力计三轴数据

这里展示的是STM32F103C8T6单片机通过软件IIC初始化HMC5883L模块以及读取三个标识ID寄存器和磁力计三轴数据,直接读取寄存器的值,未作校准,自己有更精准的数据需求的话,需要自行开发算法哦。
HMC5883L驱动代码部分展示

/** * 函    数:HMC5883L初始化*/
void HMC5883L_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C
     /* 配置寄存器A:配置为 0x70 (8-average, 15Hz, normal) 
       8-average: MA = 11 (bits 5-6)
       15 Hz: DO = 100 (bits 2-0)
       Normal measurement: MS = 00 (bits 1-0 of config A for measurement mode)*/
    HMC5883L_WriteReg(HMC5883L_REG_CONFIG_A, 0x70);
    /*配置寄存器B: Gain = default (1.3 Ga) - > 0x20 (可按需修改) */
    HMC5883L_WriteReg(HMC5883L_REG_CONFIG_B, 0x20);
    /* 模式: continuous-measurement mode (0x00) */
    HMC5883L_WriteReg(HMC5883L_REG_MODE, 0x00);
}

/**
  * 函    数:HMC5883L获取ID号
  * 参    数:无
  * 返 回 值:HMC5883L的ID号
  */
void HMC5883L_GetID(uint8_t *A, uint8_t *B, uint8_t *C)
{
	*A = HMC5883L_ReadReg(HMC5883L_REG_IDA);		//返回IDA寄存器的值
    *B = HMC5883L_ReadReg(HMC5883L_REG_IDB);		//返回IDB寄存器的值
    *C = HMC5883L_ReadReg(HMC5883L_REG_IDC);		//返回IDC寄存器的值
}


/**
  * 函    数:HMC5883L获取数据
  * 参    数:磁力计X、Y、Z轴的数据,使用输出参数的形式返回
  * 返 回 值:无
  */
void HMC5883L_GetData(int16_t *X, int16_t *Y, int16_t *Z)
{
	uint8_t DataH, DataL;								//定义数据高8位和低8位的变量
	
	DataH = HMC5883L_ReadReg(HMC5883L_REG_XOUT_H);		//读取磁力计X轴的高8位数据
	DataL = HMC5883L_ReadReg(HMC5883L_REG_XOUT_L);		//读取磁力计X轴的低8位数据
	*X = (DataH < < 8) | DataL;						    //数据拼接,通过输出参数返回
	
	DataH = HMC5883L_ReadReg(HMC5883L_REG_YOUT_H);		//读取磁力计Y轴的高8位数据
	DataL = HMC5883L_ReadReg(HMC5883L_REG_YOUT_L);		//读取磁力计Y轴的低8位数据
	*Y = (DataH < < 8) | DataL;						    //数据拼接,通过输出参数返回
	
	DataH = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_H);		//读取磁力计Z轴的高8位数据
	DataL = HMC5883L_ReadReg(HMC5883L_REG_ZOUT_L);		//读取磁力计Z轴的低8位数据
	*Z = (DataH < < 8) | DataL;						    //数据拼接,通过输出参数返回	
}

HMC5883L主函数

uint8_t IDA, IDB, IDC;					//定义用于存放ID号的变量
int16_t X, Y, Z;			            //定义用于存放各个数据的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		                //OLED初始化
	HMC5883L_Init();		            //HMC5883L初始化
	/*显示ID号*/
	OLED_ShowString(1, 1, "ID:");		
	HMC5883L_GetID(&IDA, &IDB, &IDC);	//获取HMC5883L的ID号
	OLED_ShowHexNum(1, 4, IDA, 2);		//OLED显示ID号(hex)
	OLED_ShowHexNum(1, 7, IDB, 2);		
    OLED_ShowHexNum(1, 10, IDC, 2);		
    
    OLED_ShowString(2, 1, "ID:");		
    OLED_ShowChar(2, 4, (char)IDA);		//OLED显示ID号(ASCII码)
	OLED_ShowChar(2, 5, (char)IDB);		
    OLED_ShowChar(2, 6, (char)IDC);		
    
    
	while (1)
	{
		HMC5883L_GetData(&X, &Y, &Z);	//获取HMC5883L的数据
		OLED_ShowSignedNum(3, 1, X, 5);	//OLED显示数据
		OLED_ShowSignedNum(3, 9, Y, 5);
		OLED_ShowSignedNum(4, 1, Z, 5);
	}
}

输出结果

OLED输出数据
在这里插入图片描述

QMC5883P获取ID及三轴磁力计数据

QMC5883P手册链接:QMC5883P手册

寄存器说明

在这里插入图片描述
参数上和HMC5883L是大同小异的,这里不细说明了,可以自行查看手册里的说明。主要区别是两个芯片数据存放的寄存器位置不同,驱动的时候改下寄存器地址即可,还有QMC5883P的三轴数据是16bits,以及ID寄存器这里只用了一个寄存器(00H)去存放,不像HMC5883L用了三个寄存器存放ID。下面直接上代码驱动。

获取QMC5883P ID和磁力计三轴数据

这里展示的是STM32F103C8T6单片机通过软件IIC初始化QMC5883P模块以及读取ID寄存器和磁力计三轴数据,直接读取寄存器的值,未作校准,自己有更精准的数据需求的话,需要自行开发算法哦。
QMC5883P驱动代码部分展示

/**
  * 函    数:QMC5883P初始化
  * 参    数:无
  * 返 回 值:无
  */
void QMC5883P_Init(void)
{
	MyI2C_Init();									//先初始化底层的I2C

    /* 初始化 QMC: 
       配置寄存器1:连续模式 + 200Hz
       位 [7:6]=OSR2, [5:4]=OSR1, [3:2]=ODR, [1:0]=MODE
       这里写 0x0F = > OSR2=00(滤波器), OSR1=00(过采样率), ODR=11(200Hz), MODE=11(连续发送模式Continuous Mode) */
	QMC5883P_WriteReg(QMC5883P_REG_CONTROL1, 0xFF);
    /* 配置寄存器2:这里写的参数是不软复位,不自检,量程30Guass,不更新偏移量 */
    QMC5883P_WriteReg(QMC5883P_REG_CONTROL2, 0x01);
}

/**
  * 函    数:QMC5883P获取ID号
  * 参    数:无
  * 返 回 值:QMC5883P的ID号
  */
uint8_t QMC5883P_GetID(void)
{
	return QMC5883P_ReadReg(QMC5883P_REG_CHIPID);		//返回CHIPID寄存器的值
}

/**
  * 函    数:QMC5883P获取数据
  * 参    数:X Y Z 磁力计X、Y、Z轴的数据,使用输出参数的形式返回
  * 返 回 值:无
  */
void QMC5883P_GetData(int16_t *X, int16_t *Y, int16_t *Z)
{
	uint8_t DataH, DataL;							//定义数据高8位和低8位的变量
	
	DataH = QMC5883P_ReadReg(QMC5883P_REG_XOUT_H);		//读取磁力计X轴的高8位数据
	DataL = QMC5883P_ReadReg(QMC5883P_REG_XOUT_L);		//读取磁力计X轴的低8位数据
	*X = (DataH < < 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = QMC5883P_ReadReg(QMC5883P_REG_YOUT_H);		//读取磁力计Y轴的高8位数据
	DataL = QMC5883P_ReadReg(QMC5883P_REG_YOUT_L);		//读取磁力计Y轴的低8位数据
	*Y = (DataH < < 8) | DataL;						//数据拼接,通过输出参数返回
	
	DataH = QMC5883P_ReadReg(QMC5883P_REG_ZOUT_H);		//读取磁力计Z轴的高8位数据
	DataL = QMC5883P_ReadReg(QMC5883P_REG_ZOUT_L);		//读取磁力计Z轴的低8位数据
	*Z = (DataH < < 8) | DataL;						//数据拼接,通过输出参数返回	
}

QMC5883P主函数

uint8_t ID;								//定义用于存放ID号的变量
int16_t X, Y, Z;			            //定义用于存放各个数据的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		                //OLED初始化
	QMC5883P_Init();		            //QMC5883P初始化
	
	/*显示ID号*/
	OLED_ShowString(1, 1, "ID:");		//显示静态字符串
	ID = QMC5883P_GetID();				//获取QMC5883P的ID号
	OLED_ShowHexNum(1, 4, ID, 2);		//OLED显示ID号
	
	while (1)
	{
		QMC5883P_GetData(&X, &Y, &Z);	//获取QMC5883P的数据
		OLED_ShowSignedNum(2, 1, X, 5);	//OLED显示数据
		OLED_ShowSignedNum(3, 1, Y, 5);
		OLED_ShowSignedNum(4, 1, Z, 5);
	}
}

输出结果

QMC5883P——OLED测试现象
在这里插入图片描述

总结

==由于两个模块的底板是兼容的,所以拿到手的时候磁场方向只有HMC5883L的磁场方向是对的,QMC5883P的磁场方向对应手册里或者上面磁场方向图片看就行。==
需要代码和对应资料的可以在评论区留言邮箱获取哦!

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

    关注

    6071

    文章

    45150

    浏览量

    655091
  • STM32F103
    +关注

    关注

    34

    文章

    485

    浏览量

    65945
  • 磁力计
    +关注

    关注

    1

    文章

    72

    浏览量

    21471
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    HMC5883L

    放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12位模数转换器.简易的I2C 系列总线接口。HMC5883L 是采用无铅表面封装技术,带有16引脚,尺寸为3.0X3.0X0.9mm
    发表于 04-16 09:04

    发现一款可以直接PIN-TO-PIN替换HMC5883L的传感器!!!!

    最近看到很多人都在找HMC5983和HMC5883L的替代料,给大家推荐一颗新的替代料: QMC5883L,可以和HMC5883L进行PIN to PIN替换,不用改硬件,只需软件修改
    发表于 05-09 16:36

    请问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

    如何使用这款QMC5883L磁力计

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

    HMC5883L中文数据手册

    霍尼韦尔公司出品,三轴地磁传感器HMC5883的升级版HMC5883L,用于地磁车辆检测,智能交通系统,停车诱导系统等等。
    发表于 02-29 16:58 ?119次下载

    HMC5883L中文

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

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

    尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12位模数转换器。简易的I2C 系列总线接口。HMC5883L 是采用无铅表面封装技术,带有16引脚,尺寸为3.0X3.0X0.9mm。HMC588
    发表于 03-08 10:32 ?1.7w次阅读

    HMC5883L应用说明

    尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12位模数转换器。简易的I2C 系列总线接口。HMC5883L 是采用无铅表面封装技术,带有16引脚,尺寸为3.0X3.0X0.9mm。HMC588
    发表于 03-08 10:49 ?2.9w次阅读

    霍尼韦尔HMC5883L详细资料下载

    霍尼韦尔HMC5883L详细资料下载
    发表于 12-08 10:51 ?11次下载

    QMC5883L磁力计介绍(硬件+软件)(附STM32程序~~~)

    QMC5883L磁力计介绍(硬件+软件)(附STM32程序~~~)
    发表于 12-08 10:51 ?87次下载
    <b class='flag-5'>QMC5883L</b><b class='flag-5'>磁力计</b>介绍(硬件+软件)(附<b class='flag-5'>STM32</b>程序~~~)

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

    在这个中,我们的 HMC5883L 3 项目设备可以测量地球将磁力计连接到 Arduino 方向。 Uno。它是一种以低轴设备中的设备,可以在手机或导航中,找到提供准确的您航还可以使用它们来检测含铁(含铁)金属,因为金属中的铁在靠近传感器的时候会改变磁场。
    的头像 发表于 06-10 16:24 ?7068次阅读
    如何利用<b class='flag-5'>HMC5883L</b>实现三轴<b class='flag-5'>磁力计</b>的设计

    磁力计HMC5883L传感器特性

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