YAMAHA地磁传感器YAS532B应用小记

一、简介

这款地磁传感器能够测量三个坐标轴的磁场大小,在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++){//д0if(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语言程序,内容应该一看就明白很简单...

未详尽之处,可以问我,有错的话,请不吝赐教,谢谢




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部