最近两天学习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);
模式寄存器是设置数据的传输方式WriteReg_HMC5883(Mode_Reg,0x00); 程序中设置为连续传输。
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的变化范围,也是我想要的结果。
可能靠近铜柱对磁场有干扰,网上有人说用锡纸裹住也可以。但我试了没有效果,估计是方法不对。留着记录,以便后面研究。