硬知识
摘自《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
连续测量模式
此模式下,磁性传感器连续进行测量并把测量数据置于数据输出寄存器中。测量数据的偏移和温度的影响将会自动得到补偿。
正常情况下的读顺序:
检查DRDY引脚或轮询状态寄存器(06H)中DRDY 位的状态
读取测量数据,数据寄存器被读取的同时,DRDY和DOR被置0
数据寄存器一旦被读取,数据保护将启动。直到最后一个数据寄存器(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
上一篇:【51单片机快速入门指南】4.4.1:python串口接收磁力计数据并进行最小二乘法椭球拟合
下一篇:【51单片机快速入门指南】4.3.4: MPU6050使用Madgwick AHRS算法实现六轴姿态融合获取四元数、
推荐阅读最新更新时间:2024-11-12 17:40
设计资源 培训 开发板 精华推荐
- LT6656BCDC-2.048、2.048V 2 端子电压基准电流源的典型应用
- LT6656BIDC-5、5V 扩展电源范围电压基准的典型应用
- SG117A 1.5A 三端可调稳压器改善纹波抑制的典型应用
- LTC1771 3.2V/2A 稳压器
- LTC3350IUHF 11V 至 20V、4A 超级电容器充电器的典型应用电路,具有 2A 输入电流限制和 5V、2A 备份模式
- MIKROE-3245,基于 MUX508 精确模拟多路复用的 MUX 2 Click 板
- 使用 Analog Devices 的 LTC1258CMS8-4.1 的参考设计
- 声控LED旋律灯
- TA8233AH 30W BTL x 2ch 音频功率放大器典型应用
- DM160219,使用 MTCH6102 的低功耗投射电容式触摸板开发套件
- 共抗疫情 少出门多学习: 多部TI实用课程奉上, 身体不能在路上就让灵魂在路上
- 免费送!Maxim 11块热门开发板只等你来!
- 泰克送你三板斧,招招解决电源测试大难题!答题赢好礼喽!
- 下载喽:PCIe要了解的10件事和识别协议的BSX系列BERTScope误码率测试仪技术资料
- 乐享惬意春天,TI A8开源硬件平台体验季!
- 有奖问答|ADI应用之旅——工业大机器健康篇
- 直播已结束【Molex 新能源汽车低压连接器解决方案】
- 温故知新:回顾 ST 2017 Roadshow,洞悉电子界技术新潮流!
- 万人学习51单片机
- 免费申请测评 | Sipeed MAix BiT AIoT 开发套件,搭载K210、屏幕和摄像头