调试MAG3110地磁传感器心得体会

可能是IIC通讯引脚未加上拉电阻!!(爆锤自己,2019.1.21留)

-----------------------------以下写于2018年---------------------------------

首先先骂两句,这个传感器至少浪费了我三天去调试,最后的结果还是没有调试成功!

为什么我要选择放弃呢,原因有三:

1,芯片本身不稳定,我买的两块有一块在使用几次后再也无法驱动。

2,datasheet实在扯淡,对功能的描述含糊不清(比如REG2中的复位功能)。

3,读数非常离奇,寄存器的读取规则很多(这可能是我没有调试成功的关键)

更加生气的是,但我打算用网易博客写博,他竟然提示我创建博客成功,果不其然,我之前写的博客没了,SB网易!果断选择CSDN。

以下是对调试3110的一些心得,一方面加强自己的记忆,一方面可为来者师。(才疏学浅,见识尚浅,见谅)

1.IIC的通讯规则是先写器件地址(相当于喊人名字,3110的器件地址为0x1C,最低一位是读写指令位,0写1读),然后是寄存器地址,写的话后面加上一个字节得信息,读的话等待Ack接受一个字节。细节略(应答和起止见其他博客)

2.对于IIC的读取,若出现数据异常,可尝试增加延时,有时会有效果(有时而已)

3.对于寄存器中的数据,读出来就是补码形式的,不需要自己转化。(尤其注意,存储该类数据是不可使用无符号类型unsigned!!否则负数无法读出!)

4.可以使用“0b”前缀表示一个二进制数,比如0X0F可写成0b00001111(keil中可行,感觉C里面都可以,笑!)(现在的版本不可以了 2019.7.9)

代码(未实现效果,问题表现为读数异常)

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "74H595.h"
#include "math.h"
#include "iic.h"
#include "mag3110.h"


short mx,my,mz;
float d1=0,d2;
short num=0;
u8 xh,yh,zh,xl,yl,zl;

u16 cnt1=1;
u16 cnt2=1;

int main(void)
{		
 	
	delay_init();	    	 	//延时函数初始化	 
	res_Init();						//寄存器初始化
	ResDriver(0,40);      //清空74HC595锁存
 
	 while(MAG3110_Init())   //初始化地磁模块(内含写入REG2和REG1)
	{
		ResDriver(0,num++);
		delay_ms(50);
		if (num>=36) num = 0;
	}

			MAG3110_Standby();   
			MAG_Write_Byte(CTRL_REG1, 0x00); 	
			MAG3110_Active();
			
			delay_us(2);
			delay_us(2);
			MAG3110_Standby();
			delay_ms(2);			
			MAG_Write_Byte(CTRL_REG2, 0x10); 	
			MAG3110_Active();
			
			test2 = MAG_Read_Byte(CTRL_REG1);
			delay_ms(20);
			test3 = MAG_Read_Byte(WHO_AM_I_REG);
			delay_ms(20);
			while(cnt2++)
			{			
				if (cnt2>0x7FFF) cnt2=1;
				delay_ms(20);
							
				if (MAG_Read_Byte(STATUS_00_REG)&ZYXDR_MASK)
				{
						test4++;
						MAG3110_Standby();
						delay_ms(10);

						xh = MAG_Read_Byte(OUT_X_MSB_REG);
						delay_us(50);
						xl = MAG_Read_Byte(OUT_X_LSB_REG);
						mx = xh * 256 + xl+1331; //加数为修正值,下同
						delay_ms(10);
					
						yh = MAG_Read_Byte(OUT_Y_MSB_REG);
						delay_us(50);
						yl = MAG_Read_Byte(OUT_Y_LSB_REG);
						my = yh * 256 + yl+2142;
						delay_ms(10);
					
						zh = MAG_Read_Byte(OUT_Z_MSB_REG);
						delay_us(50);
						zl = MAG_Read_Byte(OUT_Z_LSB_REG);
						mz = zh * 256 + zl+2897;
						delay_ms(10);
					
						MAG3110_Active();

			}
			
					if (mz>=0)
				{		
						d1  = atan2(mx,my);
						d2  = d1 + 3.14159;
						num = d2 / 3.14159 * 18;
						ResDriver(0,num);
				}
				else
				{
						ResDriver(1,0);
				}
	
	}	

}
	

可能是IIC通讯未加上拉电阻!!(爆锤自己,2019.1.21留)

你可能感兴趣的:(开发心得,电子设计)