HMC5883L磁力传感器使用指南

描述

1、前言

霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域(指南针、GPS)。

HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在 1°~2°的 12 位模数转换器.

支持 I2C,带有 16 引脚,尺寸为 3.0 X 3.0 X 0.9mm。

HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统。

HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。 这些各向异性传感器具有在轴向高灵敏度和线性高精度的特点。 传感器带有的对于正交轴低敏感行的固相结构能用于测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。

2、传感器特性

  1. 三轴磁阻传感器和 ASIC 都被封装在 3.0 × 3.0 × 0.9mm LCC 表面装配中
  2. 12-bit ADC 与低干扰 AMR 传感器,能在 ±8 高斯的磁场中实现 5 毫高斯分辨率
  3. 内置自检功能
  4. 低电压工作(2.16-3.6V)和超低功耗(100uA)
  5. 内置驱动电路
  6. I2C 数字接口
  7. 无引线封装结构
  8. 磁场范围广(+/-8Oe)
  9. 有相应软件及算法支持
  10. 最大输出频率可达 160Hz
  11. 4 个可编程红外 LED 电流输出
  12. 高环境光抑制
  13. 串扰补偿
  14. 符合 RoHS 安全标准

优点

  1. 是体积小高集成产品。 只需添加一个微处理器接口,外加两个外部 SMT 电容。 专为大批量、成本敏感的 OEM 生产而设计,易于装配并与高速 SMT 装配件兼容
  2. 能让罗盘航向精度精确到 1°~2°
  3. 产品组装后能进行低成本功能性测试
  4. 适用于电池供电的应用场合
  5. 带置位/复位和偏置驱动器用于消磁、自测和偏移补偿
  6. 适用于消费类电子设备应用中通用双线串行数据接口
  7. 符合 RoHS 标准
  8. 传感器能在强磁场环境中罗盘航向精度达到 1°~2°
  9. 可获得罗盘航向、硬磁、软磁以及自动校准库
  10. 能应用于个人导航系统和 LBS

技术规格

25°C 时的测试

传感器传感器传感器传感器

内部示意图

传感器

双电源参考设计

传感器

单电源参考设计

传感器

电源管理

该器件可有两种不同的供电模式。 第一个是内部运作的 VDD 供电电源,第二个是为 IO 接口供电的 VDDIO 电源,当然 VDDIO 的电压可以与 VDD 电源电源相近; 单电源模式,或在 VDDIO 电压低于 VDD 的情况下,HMC5883L 都能正常运作并能与其他装置兼容。

自测

为了检测 HMC5883L 是否正常运行,传感器内部可产生标准磁场而进行的自测试(不论是正向配置还是负向配置),再去测量此标准磁场强度并输出。 在设置 A 寄存器上相应位 MS 的值,就可启动自测功能及产生电压的极性。 来自 VDD 电源的内部电流源产生直流电流(大约 10 mA),然后加到磁阻传感器的偏置带上,这样就在传感器内部产生了一个人为的标准磁场。

3、参考资料

《HMC5883L中文规格书.pdf》

《HMC5883L.pdf》

4、引脚说明

传感器

传感器

箭头标明磁场方向,该磁场在正常测量模式下产生正向输出可读。

封装图 HMC5883L(16-PIN LPCC,单位 mm)

传感器

5、工作模式

1)连续测量模式

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

2)单次测量模式

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

3)闲置模式

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

6、I2C 读写地址

7位地址:0x1E

8位读取地址:0x3D

8位写入地址:0x3C

7、寄存器

寄存器详细解释请参考数据手册

传感器

8、代码

博主用的是轮询去读数据,大家也可以配置成中断方式。

HMC5883L.H

#define HMC5883_ADDR      0X1E
 
#define HMC_CONFIG_A_REG    0X00
#define HMC_CONFIG_B_REG    0X01  
#define HMC_MODE_REG        0X02 
  
#define HMC_XMSB_REG        0X03    //X
#define HMC_XLSB_REG        0X04  
  
#define HMC_ZMSB_REG        0X05    //Z 
#define HMC_ZLSB_REG        0X06  
  
#define HMC_YMSB_REG        0X07    //Y  
#define HMC_YLSB_REG        0X08  
  
#define HMC_STATUS_REG      0X09   
  
#define HMC_CHEAK_A_REG     0X0A 
#define HMC_CHEAK_B_REG     0X0B  
#define HMC_CHEAK_C_REG     0X0C  

//value
  
#define HMC_CHECKA_VALUE    0x48
#define HMC_CHECKB_VALUE    0x34  
#define HMC_CHECKC_VALUE    0x33

HMC5883_Check

u8 HMC5883_Check(void)
{
 u8 tempA;
 u8 tempB;
 u8 tempC;
 
 tempA=I2C2_ReadOneByte(HMC5883_ADDR,HMC_CHEAK_A_REG);
 tempB=I2C2_ReadOneByte(HMC5883_ADDR,HMC_CHEAK_B_REG);
 tempC=I2C2_ReadOneByte(HMC5883_ADDR,HMC_CHEAK_C_REG);
     
 if(tempA == HMC_CHECKA_VALUE & tempB == HMC_CHECKB_VALUE & tempC == HMC_CHECKC_VALUE)
  return 0; 
 else
   return 1; 
}

void Hmc5883_Init(void)
{
 I2C2_WriteOneByte(HMC5883_ADDR,HMC_CONFIG_A_REG,0x78);  //set 75Hz
 I2C2_WriteOneByte(HMC5883_ADDR,HMC_CONFIG_B_REG,0x00);
 I2C2_WriteOneByte(HMC5883_ADDR,HMC_MODE_REG,0x00);  //cotinue mode
}

读取数据

xValue = I2C2_ReadOneByte(HMC5883_ADDR,HMC_XLSB_REG)|(I2C2_ReadOneByte(HMC5883_ADDR,HMC_XMSB_REG)<<8);
zValue = I2C2_ReadOneByte(HMC5883_ADDR,HMC_ZLSB_REG)|(I2C2_ReadOneByte(HMC5883_ADDR,HMC_ZMSB_REG)<<8);
yValue = I2C2_ReadOneByte(HMC5883_ADDR,HMC_YLSB_REG)|(I2C2_ReadOneByte(HMC5883_ADDR,HMC_YMSB_REG)<<8);
printf("M-SENSOR:xValue:%d ,yValue:%d ,zValue:%d \\r\\n",xValue,yValue,zValue);

9、国产替代

HMC5883L 国产替代是 QMC5883L,硬件上 PIN to PIN,软件上大致相同,寄存器有所区别,如下:

传感器

传感器

传感器

因此大家也可以用 QMC5883L。

10、传感器集线器

自此,博主大致实现了一个 sensorhub,在 STM32 上,用 FreeRTOS 启用几个 task,采集传感器数据并上报。 后面会继续扩展:

1、将 accgyro 从轮询模式改成中断模式,并从 I2C 改为 SPI 接口,应对高速率采集场景。 其他三个传感器还是轮询模式,I2C 接口,但是不用延时实现,用定时器去做。

2、可以动态的 enable、disable、config、sample、calibration 各个传感器,并且支持数据时间戳机制。

3、为该系统提供一个 framework 层,统一管控各个传感器的 enable、disable、config 、sample、calibration 操作。

4、在 framework 层区分下命令的 user,根据 user 下命令的不同,为各个 user 分发不同速率的传感器数据,简称 down sample 机制(down sample 只能以倍数实现,如采样 200Hz,可以分发出 50Hz,100Hz)

5、若器件数据手册写明支持自测功能,则增加 self_test 函数,如 lsm6dso accgyro 和 HMC5883L 磁力计都支持。

6、增加虚拟传感器功能,利用物理传感器的数据进行融合,实现如计步器、步伐检测、设备旋转方向等功能。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分