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++)
	{
		//д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语言程序,内容应该一看就明白很简单...

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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctxq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值