AS5600磁编码器获取角度(IIC方式)的简单应用

文章目录

  • 一、AS5600是什么?
  • 二、硬件
    • 1.引脚说明
    • 2.硬件连接
    • 3.实物固定
  • 三、软件
    • 1.初始化配置代码如下(示例):
    • 2.AS5600是否正常代码如下(示例):
    • 3.AS5600读取字节代码如下(示例):
    • 4.AS5600写字节代码如下(示例):
    • 5.AS5600读双字节代码如下(示例):
    • 6.获取相对角度代码如下(示例):
    • 7.手轮判断测试代码如下(示例):
  • 四、测试结果
    • 1.正转
    • 2.反转
  • 五、总结


一、AS5600是什么?

AS5600是一个易于编程的磁旋转位置传感器,具有高分辨率的12位模拟或PWM输出。该传感器采用非接触式系统,可测量磁化轴上直径的绝对角度,并适用于应用于非接触式电位器的稳健设计,消除了外部杂散磁场的影响。

AS5600的设计目的是为了满足工业标准,并通过I²C接口支持简单的用户编程,无需专门的程序员即可设置非易失性参数。默认情况下,输出表示0到360度的范围。此外,用户还可以定义一个较小的输出范围,并通过编程设置零角(起始位置)和最大值角度(停止位置)。

此外,AS5600还配备了智能低功耗模式,可自动降低功耗。在使用时,输入引脚(DIR)可选择输出的极性以反映旋转方向。如果DIR接地,则输出值随顺时针旋转而增加;如果DIR连接到VDD,则输出值逆时针旋转而增加。

二、硬件

1.引脚说明

AS5600磁编码器获取角度(IIC方式)的简单应用_第1张图片

引脚编号 引脚名称 引脚描述
1 VDD5V 5V模式的正电压供电(要求100nf,解耦电容)
2 VDD3V3 3.3V模式的正电压供电外置1μf去耦电容(5V模式)
3 OUT 模拟/PWM输出
4 GND 电源地
5 PGO 程序选项(内部上拉,连接GND =编程方案B)
6 SDA I²C数据(考虑外部上拉)
7 SCL I²C时钟(考虑外部上拉)
8 DIR 方向极性(GND =值顺时针增加,VDD =值逆时针增加)

2.硬件连接

供电的选择:AS5600由片上5.0V电源供电LDO稳压器,或者它可以直接从3.3V电源供电。内部LDO不用于为其他外部ic供电,需要1 μF的电容接地,如下图所示。3.3V工作时,VDD5V和VDD3V3引脚必须绑扎在一起。
AS5600磁编码器获取角度(IIC方式)的简单应用_第2张图片
这里选择3.3V供电,DIR接地,表示选择方向为顺时针值增加。
AS5600磁编码器获取角度(IIC方式)的简单应用_第3张图片

3.实物固定

需要注意的是,磁铁和磁编码器的最大距离不应超过1mm,超过就无法检测出,所以,如果是用这个芯片,对于装配和设计也有点小的要求。


这里放两根线是代表这是起始位置,只要旋转两根重合,就表示回到起点。

AS5600磁编码器获取角度(IIC方式)的简单应用_第4张图片

三、软件

AS5600磁编码器芯片支持IIC通信,但是输出的信号的方式还有PWM,模拟电压等多种方式。这里采用IIC来驱动获取绝对角度值。

1.初始化配置代码如下(示例):

AS5600是12位的霍尔磁编码器,它的地址是0x36,只需要读取0x0C、0x0D这两个寄存器就可以读出角度的原始数据,再将其乘以360,再除以4096,就可以获得角度值。

/*******************************************************************************
 * 函数名:User_AS5600_Init
 * 描述  :AS5600初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void User_AS5600_Init(void)
{
    IIC_Init();	
    AS5600_DATA_Init();
}

/*******************************************************************************
 * 函数名:AS5600_Init
 * 描述  :AS5600相关变量数据初始化
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void AS5600_DATA_Init(void)
{	
	  /*细调手枪轮参数初始化*/		
	  Fine.Raw_num = 0;
	  Fine.First_Raw_num = 0;	
	  Fine.Last_Raw_num = 0;
	  Fine.Actual_Raw_num = 0;	
	  Fine.Real_start_angle = 0;
	  Fine.Real_angle = 0;
	  Fine.LastReal_angle = 0;
	  Fine.RelativeAngle  = 0;		
	  Fine.Raw_num = AS5600_Read_TwoByte(Angle_Hight_Addr,Angle_Low_Addr);//获取初始值	
	  Fine.Real_start_angle = (Fine.Raw_num * 360)/4096;//换算成初始角度
}

2.AS5600是否正常代码如下(示例):

/*******************************************************************************
 * 函数名:AS5600_CheckOk
 * 描述  :判断AS5600是否正常
 * 输入  :void
 * 输出  : 1 表示正常, 0 表示不正常
 * 调用  :
 * 备注  :
 *******************************************************************************/
uint8_t AS5600_CheckOk(void)
{
	if(IIC_CheckDevice((Slave_Addr<<1)|0x00) == 0)
	{
		AS5600_Flag = 1;
	    printf("Check OK \r\n");			
		return 1;
	}
	else
	{
		/* 失败后,切记发送I2C总线停止信号 */
		IIC_Stop();
		AS5600_Flag = 0;
		printf("Check Fail \r\n");		 		
		return 0;
	}
}

3.AS5600读取字节代码如下(示例):

/*******************************************************************************
 * 函数名:AS5600_Read_Byte
 * 描述  :AS5600读取字节
 * 输入  :ReadAddr地址
 * 输出  :uint8_t
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
uint8_t AS5600_Read_Byte(uint16_t ReadAddr)
{
    uint8_t	temp = 0;
	IIC_Start();//Start IIC
	IIC_Send_Byte((Slave_Addr<<1)|0x00);//发送写命令  最后一位是读写位,1是读,0是写
	IIC_Wait_Ack();//等待应答
	IIC_Send_Byte(ReadAddr);//发送读取寄存器地址 0x0C或0x0D
	IIC_Wait_Ack();//等待应答
    IIC_Start();//Start IIC
	IIC_Send_Byte((Slave_Addr<<1)|0x01);//进入接收模式
	IIC_Wait_Ack();//等待应答
	temp = IIC_Read_Byte(0);//读取数据
	IIC_Stop();//Stop IIC
	return temp;//返回读取的数据
}

4.AS5600写字节代码如下(示例):

/*******************************************************************************
 * 函数名:AS5600_Write_Byte
 * 描述  :AS5600写字节
 * 输入  :WriteAddr地址
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
void AS5600_Write_Byte(uint16_t WriteAddr,uint8_t WriteData)
{
	IIC_Start();
	IIC_Send_Byte((Slave_Addr<<1)|0x00);
	IIC_Wait_Ack();	
	IIC_Send_Byte(WriteAddr);		
	IIC_Wait_Ack();	
	IIC_Start();
	IIC_Send_Byte(WriteAddr);		
	IIC_Wait_Ack();	
	IIC_Stop();
	Delay_2us();		
}

5.AS5600读双字节代码如下(示例):

此函数是使用读取两个寄存器的值,对位的操作将两个8位的寄存器数据合并为16位数据
因为as5600是12位精度的霍尔传感器,一个8位寄存器存不下,所以需要两个8位的寄存器来存储他的值

/*******************************************************************************
 * 函数名:AS5600_Read_TwoByte
 * 描述  :AS5600读双字节
 * 输入  :ReadAddr_Hi,ReadAddr_Lo地址
 * 输出  :void
 * 调用  :初始化
 * 备注  :
 *******************************************************************************/
uint16_t AS5600_Read_TwoByte(uint16_t ReadAddr_Hi,uint16_t ReadAddr_Lo)
{
	uint16_t TwoByte_Data = 0;
	uint8_t Hi_Data = 0;	
	uint8_t Lo_Data = 0;	
    Hi_Data = AS5600_Read_Byte(Angle_Hight_Addr);//读寄存器高位地址
    Lo_Data = AS5600_Read_Byte(Angle_Low_Addr);///读寄存器低位地址	
	TwoByte_Data = (Hi_Data << 8) | Lo_Data;//取值范围为0-4095
   	return TwoByte_Data;
}

6.获取相对角度代码如下(示例):

该函数用于获取两个角度之间的相对角度,以顺时针方向为正。

/*******************************************************************************
 * 函数名:RelativeAngleCorrect
 * 描述  :获取相对角度
 * 输入  :初始角度,下次角度
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
short RelativeAngleCorrect(short starAngle,short realAngle)
{
	//相对角度获取,顺时针为正
	Fine.RelativeAngle = realAngle - starAngle;//没变动为0
	if(Fine.RelativeAngle < 0)//0-360
	{
		Fine.RelativeAngle = Fine.RelativeAngle + 360;
	}
        return Fine.RelativeAngle;
}

7.手轮判断测试代码如下(示例):

该函数的作用是实现手轮的旋转检测和获取旋转的相对角度,并通过打印信息进行输出。

函数流程如下:
1.将上一次的真实角度保存到Fine.LastReal_angle中。
2.通过AS5600_Read_TwoByte函数读取当前角度的原始值保存到Fine.Raw_num中。
3.将原始值转换为角度,并保存到Fine.Real_angle中。
4.判断当前角度是否与起始角度不同,如果不同则表示开始旋转。
5.如果当前角度与上一次的真实角度不同,则进行以下操作:
1)如果当前角度大于起始角度,打印"+++“表示顺时针旋转。
2)如果当前角度小于起始角度,打印”- - -"表示逆时针旋转。
3)调用RelativeAngleCorrect函数获取相对角度,并将结果保存到Fine.RelativeAngle中。
6.打印相对角度Fine.RelativeAngle的值。

/*******************************************************************************
 * 函数名:Fine_adjustment_Function
 * 描述  :手轮判断
 * 输入  :void
 * 输出  :void
 * 调用  :50ms
 * 备注  :
 *******************************************************************************/
void Fine_adjustment_Function(void)
{	 	
	//已经换算成角度
	Fine.LastReal_angle = Fine.Real_angle;
	Fine.Raw_num = AS5600_Read_TwoByte(Angle_Hight_Addr,Angle_Low_Addr);//读取当前值		
	Fine.Real_angle = (Fine.Raw_num * 360)/4096;//换算成角度
        if(Fine.Real_angle != Fine.Real_start_angle)//角度发生变化表示开始转动
	{
		if(Fine.Real_angle != Fine.LastReal_angle)
		{
			if(Fine.Real_angle > Fine.Real_start_angle)
			{
				printf("+++ \r\n");//顺时针旋转								
				RelativeAngleCorrect(Fine.Real_start_angle,Fine.Real_angle);//获得相对角度
				printf("Fine.RelativeAngle = %d\r\n",Fine.RelativeAngle);//打印角度								
			}
			else
			{
				printf("--- \r\n");//逆时针旋转										
				RelativeAngleCorrect(Fine.Real_start_angle,Fine.Real_angle);//获得相对角度 
				printf("Fine.RelativeAngle = %d\r\n",Fine.RelativeAngle);//打印角度									
			}	
		}				
	}			
}

四、测试结果

1.正转

AS5600磁编码器获取角度(IIC方式)的简单应用_第5张图片

2.反转

AS5600磁编码器获取角度(IIC方式)的简单应用_第6张图片


五、总结

上面简单介绍了12位的霍尔磁编码器AS5600的一些相关知识,感兴趣的可以下载附件看看,感谢你的观看,谢谢!

AS5600磁编码器获取角度(IIC方式)的简单应用_第7张图片

你可能感兴趣的:(STM32,#,芯片驱动,单片机,嵌入式硬件,硬件工程,驱动开发,学习)