AS5600是一个易于编程的磁旋转位置传感器,具有高分辨率的12位模拟或PWM输出。该传感器采用非接触式系统,可测量磁化轴上直径的绝对角度,并适用于应用于非接触式电位器的稳健设计,消除了外部杂散磁场的影响。
AS5600的设计目的是为了满足工业标准,并通过I²C接口支持简单的用户编程,无需专门的程序员即可设置非易失性参数。默认情况下,输出表示0到360度的范围。此外,用户还可以定义一个较小的输出范围,并通过编程设置零角(起始位置)和最大值角度(停止位置)。
此外,AS5600还配备了智能低功耗模式,可自动降低功耗。在使用时,输入引脚(DIR)可选择输出的极性以反映旋转方向。如果DIR接地,则输出值随顺时针旋转而增加;如果DIR连接到VDD,则输出值逆时针旋转而增加。
引脚编号 | 引脚名称 | 引脚描述 |
---|---|---|
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 =值逆时针增加) |
供电的选择:AS5600由片上5.0V电源供电LDO稳压器,或者它可以直接从3.3V电源供电。内部LDO不用于为其他外部ic供电,需要1 μF的电容接地,如下图所示。3.3V工作时,VDD5V和VDD3V3引脚必须绑扎在一起。
这里选择3.3V供电,DIR接地,表示选择方向为顺时针值增加。
需要注意的是,磁铁和磁编码器的最大距离不应超过1mm,超过就无法检测出,所以,如果是用这个芯片,对于装配和设计也有点小的要求。
这里放两根线是代表这是起始位置,只要旋转两根重合,就表示回到起点。
AS5600磁编码器芯片支持IIC通信,但是输出的信号的方式还有PWM,模拟电压等多种方式。这里采用IIC来驱动获取绝对角度值。
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;//换算成初始角度
}
/*******************************************************************************
* 函数名: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;
}
}
/*******************************************************************************
* 函数名: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;//返回读取的数据
}
/*******************************************************************************
* 函数名: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();
}
此函数是使用读取两个寄存器的值,对位的操作将两个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;
}
该函数用于获取两个角度之间的相对角度,以顺时针方向为正。
/*******************************************************************************
* 函数名: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;
}
该函数的作用是实现手轮的旋转检测和获取旋转的相对角度,并通过打印信息进行输出。
函数流程如下:
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);//打印角度
}
}
}
}
上面简单介绍了12位的霍尔磁编码器AS5600的一些相关知识,感兴趣的可以下载附件看看,感谢你的观看,谢谢!