霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域(指南针、GPS)。
HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成威廉希尔官方网站 包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在 1°~2°的 12 位模数转换器.
支持 I2C,带有 16 引脚,尺寸为 3.0 X 3.0 X 0.9mm。
HMC5883L 的所应用领域有手机、笔记本电脑、消费类电子、汽车导航系统和个人导航系统。
HMC5883L 采用霍尼韦尔各向异性磁阻(AMR)技术,该技术的优点是其他磁传感器技术所无法企及。 这些各向异性传感器具有在轴向高灵敏度和线性高精度的特点。 传感器带有的对于正交轴低敏感行的固相结构能用于测量地球磁场的方向和大小,其测量范围从毫高斯到 8 高斯(gauss)。
25°C 时的测试
该器件可有两种不同的供电模式。 第一个是内部运作的 VDD 供电电源,第二个是为 IO 接口供电的 VDDIO 电源,当然 VDDIO 的电压可以与 VDD 电源电源相近; 单电源模式,或在 VDDIO 电压低于 VDD 的情况下,HMC5883L 都能正常运作并能与其他装置兼容。
为了检测 HMC5883L 是否正常运行,传感器内部可产生标准磁场而进行的自测试(不论是正向配置还是负向配置),再去测量此标准磁场强度并输出。 在设置 A 寄存器上相应位 MS 的值,就可启动自测功能及产生电压的极性。 来自 VDD 电源的内部电流源产生直流电流(大约 10 mA),然后加到磁阻传感器的偏置带上,这样就在传感器内部产生了一个人为的标准磁场。
《HMC5883L中文规格书.pdf》
《HMC5883L.pdf》
箭头标明磁场方向,该磁场在正常测量模式下产生正向输出可读。
封装图 HMC5883L(16-PIN LPCC,单位 mm)
连续测量模式,在客户所选择的速率下进行连续的测量,并所测量的更新数据输出寄存器。 如果有必要,数据可以从数据输出寄存器重新读取,但是,如果主机并不能确保在下次测量完成之前可以访问数据寄存器,数据寄存器上的旧的数据会被新的测量数据取代。 为了保存测量之间的电流,该装置被放置在一个类似闲置模式的状态,但模式寄存器没有改变成空闲模式。 即MD[n]位不变。 配置寄存器A的设置在连续测量模式时会影响数据输出速率(比特DO[n]) ,测量配置(bits MS[n]),和增益(bits GN[n])。 所有寄存器在连续测量模式中保留数值。 在连续测量模式下 I2C 总线可被网络内的其他装置启用。
这是预设的供电模式。 在单测量模式,该装置进行单次测量并将测量数据更新至输出数据寄存器中。 在完成测量和输出数据寄存器的更新以后,通过设置MD[n] bits,该装置被置于闲置模式,模式寄存器变更为闲置模式。 配置寄存器的设置在单一测量模式时影响测量配置(bits MS[n])。。 在单测量模式中所有寄存器保留数值。 在单测量模式下 I2C 总线可被网络内其他装置启用。
在此模式下,装置可以通过 I2C 总线访问,但主要电源能耗是禁用的,如 ADC,放大器,传感器偏置电流,但不仅限于这些。 在空闲模式下所有寄存器保留数值。 在闲置测量模式下 I2C 总线可被网络内其他装置启用。
7位地址:0x1E
8位读取地址:0x3D
8位写入地址:0x3C
寄存器详细解释请参考数据手册
博主用的是轮询去读数据,大家也可以配置成中断方式。
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);
HMC5883L 国产替代是 QMC5883L,硬件上 PIN to PIN,软件上大致相同,寄存器有所区别,如下:
因此大家也可以用 QMC5883L。
自此,博主大致实现了一个 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、增加虚拟传感器功能,利用物理传感器的数据进行融合,实现如计步器、步伐检测、设备旋转方向等功能。
全部0条评论
快来发表一下你的评论吧 !