HMC5883 电子罗盘

最近两天学习HMC5883电子罗盘,电子罗盘也叫指南针。

通讯方式:I2C  

HMC寄存器:

#define    Write_Address     0x3C      //定义器件5883在IIC总线中的从地址
#define    Read_Address    0x3D      //地址读
#define    Config_RegA       0x00
#define    Config_RegB      0x01
#define    Mode_Reg          0x02
#define X_MSB                 0x03      //数据寄存器地址
#define X_LSB            0x04
#define Y_MSB            0x07
#define Y_LSB            0x08
#define Z_MSB            0x05
#define Z_LSB            0x06     内容不多,首先是I2c通讯成功之后,通过写或者读方式,读取寄存器的值。首先通过配置寄存器A设置数据传输的速率和测量配置WriteReg_HMC5883(Config_RegA,0x70)。

配置寄存器 B 设置该装置的增益,WriteReg_HMC5883(Mode_Reg,0x00);HMC5883 电子罗盘_第1张图片
模式寄存器是设置数据的传输方式WriteReg_HMC5883(Mode_Reg,0x00); 程序中设置为连续传输。

HMC5883 电子罗盘_第2张图片
            X_MSB ,X_LSB  , Y_MSB  , Y_LSB ,  Z_MSB , Z_LSB这六个寄存器是用来存储X轴,Y轴,z轴的数据。MSB存储高八位的数据,LSB存储地八位的数据。把数据保存到数组中,以便后续应用。

    temp=ReadReg_HMC5883(X_MSB); data[0]=(temp<<8)+ReadReg_HMC5883(X_LSB);
    temp=ReadReg_HMC5883(Y_MSB); data[1]=(temp<<8)+ReadReg_HMC5883(Y_LSB);
    temp=ReadReg_HMC5883(Z_MSB);data[2]=(temp<<8)+ReadReg_HMC5883(Z_LSB);    

  在使用之前还需要对电子罗盘进行校正,首相把电子罗盘水平放在平面上,旋转一周,读取这一周的最大最小值,求平均。

 offsetX = (xMax + xMin)/2;    offsetY = (yMax + yMin)/2;   

目前,我只是利用电子罗盘的角度,并不需要进行精确角度,利用相对角度就可以。后期加入mpu6050进行数据融合才校正。

目前,我遇到最棘手的问题是:把电子罗盘放在车头的,结果旋转一周的时候,角度变化并不是十分明显,150以下。我放在空中旋转有360的变化范围,也是我想要的结果。

可能靠近铜柱对磁场有干扰,网上有人说用锡纸裹住也可以。但我试了没有效果,估计是方法不对。留着记录,以便后面研究。

你可能感兴趣的:(STM32)