一、简介
这款地磁传感器能够测量三个坐标轴的磁场大小,在X,Y轴上精度能够达到0.15uT/count,在Z轴上能够达到0.25uT/count,有很高的灵敏度,支持IIC通信,工作在从设备模式,工作速率100kbps/400kbps可调,非常小的封装,非常低的功耗,测量完能够自动进入power-down模式,测量结果支持中断输出,也支持循环测量。
1 供电
模块供电电压VDD为 1.7V~3.6V可选,数据通信口电压IOVDD的电压是1.7V~VDD可选,不能超过VDD,可以相等
2 工作温度
-40℃到+95℃,其中测量的结果会受温度的影响,在后边将会介绍到,需要对温度进行一个补偿,内部有温度测量模块
3 功耗
在供电电压VDD=2.6V,测量过程中的电流消耗为4mA,非工作过程中的静态功耗为32uA
4 测量耗时
通常情况,磁场测量加上温度测量总耗时为1ms
二、硬件连接
如图所示,两个IIC接口需要上拉
三、操作步骤
1、上电初始化,所涉及的步骤如下:
(1)设置Test寄存器,向Test1R与Test2R寄存器中写入0x00
(2)读取存储在CAL寄存器中的值,这里边的值将会在后边计算测量结果的时候使用,可以读一次,然后存在你的单片机的Flash里,这样就可以不用每次都读取这个值,上电的时候,把这部分值初始化到你的计算公式里就行了,感觉这里应该是每个传感器芯片都是唯一固定的,将会在最后的计算里将,X,Y1,Y2转换成X,Y,Z三个坐标轴的信息,用途应该在那里,这里的值得具体格式在后边介绍
(3)设置Config寄存器,主要包括以下几个部分:一是是否使用中断,二是中断输出是高电平还是低电平,三就是CCK的设置,这里的CCK的值其实也在上边的CAL中存着,可以在上一个步骤中读取这个值,赋到这里边
(4)设置INTRVLR寄存器
当设备工作在延时采集模式的时候,需要在这个寄存器里设置采样间隔,当工作在延时测量模式的时候,使用中断来判断采集完成。
(5)激活ResetCoil
激活这个东西就是说,如果你在测量的时候,磁传感器受到了强烈的磁干扰,比如说有磁铁东西靠近,使这个东西的读数变化的太大了,回不去了,就跟卡在那儿是的,可以用这个东西复位一下,每次初始化都复位一下就得了。
(6)设置Offset Control的值
这东西用途比较大,是一个硬件的偏移量,设置好这个东西之后,他会在测量结果上直接去掉这里设置的值,感觉这个值并不是一个绝对量,或者说是,这个值其实是一个很小的量,不过会对结果有一个比例关系的影响吧,不是很清楚,具体的取值过程,还有设置方法,在后边介绍。
2、采集过程
延时采集模式:每写一次CMDR寄存器,就会启动一次采集,本例以工作在延时采集模式为例,延时采集模式下,采集转换完成不会产生中断,你需要扫描读取DATAR里边的值,这个地方有8Byte的数据,其中第一个Byte里的数据的bit8是是否采集完成的一个标志位,需要检测这个位的值,当为0时表示转换完成,1代表忙状态。
中断模式:写一次CMDR寄存器,等待中断产生即可
3、计算公式
采集转换完成的数据存储在DATAR寄存器里,如下图所示
其中前两个字节是温度值,第三四字节是X轴的值,第五六字节是Y1轴的值,第七八字节是Y2轴的值。由于最终结果是13个bit,可参考如下程序提取值:
Tem_data = (((int)temp[26] << 3) & 0x3f8) | ((temp[27] >> 5) & 0x07);
x_data = (int)(((int)temp[28] << 6) & 0x1fc0) | ((temp[29] >> 2) & 0x3f);
y1_data = (int)(((int)temp[30] << 6) & 0x1fc0) | ((temp[31] >> 2) & 0x3f);
y2_data = (int)(((int)temp[32] << 6) & 0x1fc0) | ((temp[33] >> 2) & 0x3f);
另外说一下CALR寄存器里边的值的提取:
可用如下程序提取:
Cx = (int)temp[11];
Cy1 = (int)temp[12];
Cy2 = (int)temp[13];
a2C = (int)((temp[14] >> 2) & 0x03f);
a3C = (int)(((temp[14] << 2 ) & 0x0c) | ((temp[15] >> 6) & 0x03));
a4C = (int)(temp[15] & 0x3f);
a5C = (int)((temp[16] >> 2) & 0x3f);
a6C = (int)(((temp[16] << 4) & 0x30) | ((temp[17] >> 4) & 0x0f));
a7C = (int)(((temp[17] << 3) & 0x78) | ((temp[18] >> 5) & 0x07));
a8C = (int)(((temp[18] << 1) & 0x3e) | ((temp[19] >> 7) & 0x01));
a9C = (int)(((temp[19] << 1) & 0xfe) | ((temp[20] >> 7) & 0x01));
kC = (int)((temp[20] >> 2) & 0x1f);
然后还不能进行计算,CAL里边的值还有一个转换,就是说这个也不是最终的值,有一个转换公式,下表记录:
SX = x_data;SY = y1_data - y2_data;SZ = -y1_data - y2_data;
然后就是一个矩阵计算:
这里边的Hx,Hy,Hz就是单位为uT的磁场结果了。
在前面还要去掉温度的关系,这里 SX = Dx - CxT,SY1 = Dy1 - Cy1T, SY2 = Dy2 - Cy2T
这就结了
出来的值就是实际值了,可还有需要设置一个偏置,就是以后的变化值只是在这个值得附近变化,就是说,你在任何一个方向设定一个静止值,然后把这个作为总偏置,软件减掉就可以了。
然后说一下那个硬件偏置的设置,直接看程序吧:
void calib_axes(uint8_t whit)
{
uint8_t buf_offset[5] = {16,8,4,2,1};
uint8_t buf_temp[3];
uint8_t i;
buf_temp[0] = 0x00;
for(i = 0; i < 5; i++)
{
//д0
if(whit ==0)
{
i2c1_write(MS_3R_DeviceAddr,MS_3R_OXR,buf_temp,1);
}
if(whit ==1)
{
i2c1_write(MS_3R_DeviceAddr,MS_3R_OY1R,buf_temp,1);
}
if(whit ==2)
{
i2c1_write(MS_3R_DeviceAddr,MS_3R_OY2R,buf_temp,1);
}
get_mag_data();
if(mag_data[whit]>4096)
{
buf_temp[0] = buf_temp[0] + buf_offset[i];
}
if(mag_data[whit]<4096)
{
buf_temp[0] = buf_temp[0] - buf_offset[i];
}
if(mag_data[whit]==4096)
{
break;
}
}
}
这是一段C语言程序,内容应该一看就明白很简单...
未详尽之处,可以问我,有错的话,请不吝赐教,谢谢