0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32F103驱动AS5600读取磁体旋转的模拟量/角度数据

jf_88434166 来源:jf_88434166 作者:jf_88434166 2025-11-30 15:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、AS5600简介

AS5600 是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。该非接触式系统可测量径向磁化同轴磁体的绝对角度。AS5600 专为非接触式电位器应用而设计,其坚固的设计可消除任何均匀外部杂散磁场的影响。 I²C 接口支持用户轻松编程非易失性参数,无需专用编程器。默认情况下,输出范围为 0 至 360 度。也可以通过编程零角度(起始位置)和最大角度(停止位置)来定义更小的输出范围。
AS5600 还配备了智能低功耗模式功能,可自动降低功耗。输入引脚 (DIR) 可根据旋转方向选择输出极性。如果 DIR 接地,则输出值会随着顺时针旋转而增大。如果 DIR 连接到 VDD,则输出值会随着逆时针旋转而增大。
特性
非接触式角度测量
可编程最大角度从 18° 到 360°
12位DAC输出分辨率
输出方式:I2C接口 / PWM / 模拟输出
7位I2C地址:0x36(地址不可配置)

二、引脚说明

VDD5V5V 模式下的正电压供电
VDD3V33.3V 模式下的正电压电源
OUT模拟/PWM输出
GND
PGO编程选项(内部上拉,连接到 GND = 编程选项 B)
SDAI2C 数据
SCLI2C 时钟
DIR方向极性(GND = 值顺时针增加,VDD = 值逆时针增加)

PGO引脚说明:
PGO=高电平(悬空/VDD):AS5600处于正常工作模式,仅读取角度数据。
PGO=低电平(GND):进入编程模式,允许配置零位、最大角度等参数。

DIR 引脚控制磁铁旋转方向。如果 DIR 连接到 GND (DIR = 0),则从顶部顺时针旋转将产生计算角度的增量。如果 DIR 引脚连接到 VDD (DIR = 1),则计算的角度将逆时针旋转。

三、功能框图和数据的读写

写数据

读数据

指定地址读数据

四、寄存器说明


常用寄存器有:
CONF(0x07 / 0x08):配置寄存器

RAW ANGLE(0x0C / 0x0D):未缩放/未处理的原始角度数据,12-bit。

ANGLE(0x0E / 0x0F):已缩放/处理后的角度寄存器,12-bit。

RAW和ANGLE寄存器的区别:RAW 是芯片内部直接计算得到的无缩放角度;ANGLE 是按 ZPOS/MPOS/MANG(如有编程)以及滤波/死区后的输出值。

STATUS(0x0B):状态寄存器,包含磁铁检测位(Magnet Detected,MD)、Magnet Low/High(ML/MH)等位,判断是否检测到合适的磁场(MD=1 表示检测到磁铁)。

AGC(0x1A):自动增益控制,表示放大倍数,5V 下范围 0..255,3.3V 下 0..128。可用来补偿因温度变化、IC 与磁体之间的气隙以及磁体性能下降而导致的磁场强度变化。为了获得最稳健的性能,增益值应位于其范围的中间。
典型的径向磁铁感应气隙在 0.5 mm 到 3 mm 之间,这取决于所选的磁体。更大、更强的磁铁允许更大的气隙。以 AGC 值为指导,通过调整磁体和 AS5600 之间的距离,使 AGC 值位于其范围的中心,可以找到最佳气隙。当使用直径为 0.25mm 的磁体时,参考磁体的旋转轴从封装中心的最大允许位移为 6 mm。

MAGNITUDE(0x1B / 0x1C):用于判断磁场强弱与是否饱和/过弱。

BURN(0xFF):写 0x40 到 0xFF 可做永久写入/OTP,慎重,写入次数有限。
Burn_Angle 命令 (ZPOS, MPOS):主机微控制器可以使用 BURN_ANGLE 命令对 ZPOS 和 MPOS 进行永久编程。要执行 BURN_ANGLE 命令,请将值 0x80 写入寄存器 0x​​FF。BURN_ANGLE 命令最多可执行 3 次。ZMCO 显示 ZPOS 和 MPOS 已永久写入的次数。此命令仅在检测到磁铁存在 (MD = 1) 时执行。
Burn_Setting 命令 (MANG, CONFIG):主微控制器可以使用 BURN_SETTING 命令永久写入 MANG 和 CONFIG。要执行 BURN_SETTING 命令,请将值 0x40 写入寄存器 0x​​FF。只有在 ZPOS 和 MPOS 从未被永久写入 (ZMCO = 00) 的情况下,才能写入 MANG。BURN_SETTING 命令只能执行一次。

五、数据的换算公式

角度(deg) = raw / 4096.0 * 360.0。raw 为 0..4095(12-bit),即每 LSB ≈ 360/4096 = 0.087890625°。

MCU ADC(12-bit)电压换算:V = ADC_raw / 4095.0 * Vref。其中, ADC_raw为OUT引脚输出的模拟量,Vref为接的供电电压。

六、STM32F103驱动AS5600获取数据

准备工作

STM32F103C8T6开发板,OLED显示屏,AS5600磁编码器模块,磁铁等。

接线说明

STM32F103C8T6AS5600
3.3VVCC
GNDGND
PB10SCL
PB11SDA
PA0OUT
PB8OLED-SCL
PB9OLED-SDA

代码示例

AS5600.c

#include "as5600.h"
#include "oled.h"

void AS5600_Init(void)
{
	MyI2C_Init();
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);
	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

void AS5600_WriteData(uint8_t Wordaddress, uint8_t Data)
{
	MyI2C_Start();
	MyI2C_SendByte(AS5600_ADDR);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(Wordaddress);
	MyI2C_ReceiveAck();
	
	MyI2C_SendByte(Data);
	MyI2C_ReceiveAck();
	MyI2C_Stop();
}

uint32_t AS5600_ReadData(uint8_t Wordaddress)
{
	uint8_t Data;
	
	MyI2C_Start();
	MyI2C_SendByte(AS5600_ADDR);
	MyI2C_ReceiveAck();
	MyI2C_SendByte(Wordaddress);
	MyI2C_ReceiveAck();
	
	MyI2C_Start();
	MyI2C_SendByte(AS5600_ADDR | 0x01);
	MyI2C_ReceiveAck();
	Data = MyI2C_ReceiveByte();
	MyI2C_SendAck(1);
	MyI2C_Stop();
	
	return Data;
}

uint16_t AS5600_ReadRawAngle(void)	//获取原始数值
{
    uint8_t hi = (uint8_t)AS5600_ReadData(AS5600_RAW_HI_REG);
    uint8_t lo = (uint8_t)AS5600_ReadData(AS5600_RAW_LO_REG);
    uint16_t val = ((uint16_t)hi < < 8) | (uint16_t)lo;
    val &= 0x0FFF;   
    return val;      
}

uint16_t AS5600_ADC_ReadRaw(void)  //获取ADC数值
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	return ADC_GetConversionValue(ADC1);
}

float AS5600_ReadVolatge(uint16_t Vol)  //获取电压值
{
	float Volatge;
	Volatge = (float)Vol / 4095 * 3.3;
	return Volatge;
}

float AS5600_RawToDegree(uint16_t angle)  //获取角度
{
	return ((float)angle) * 360.0f / 4096.0f;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "delay.h"  
#include "Delay.h"
#include "AS5600.h"
#include "OLED.h"

uint16_t rawAngle;
uint16_t adcRaw;
float  adcVolt, angleDeg;
char tmp[16];

int main(void)
{ 
    OLED_Init();
    AS5600_Init();
	OLED_ShowString(1,1,"RAW: ");
	OLED_ShowString(2,1,"ADC: ");
	OLED_ShowString(3,1,"Vol: 0.00V");
	OLED_ShowString(4,1,"ANG: 000.0");

	while(1)
	{
		rawAngle = AS5600_ReadRawAngle();  //角度原始数值
		adcRaw = AS5600_ADC_ReadRaw();	   //ADC模拟量
		adcVolt = AS5600_ReadVolatge(adcRaw);	//电压值
		angleDeg = AS5600_RawToDegree(rawAngle);  //角度:0-360°
		
		OLED_ShowNum(1,6,rawAngle,4);
		
		OLED_ShowNum(2,6,adcRaw,4);
		
		OLED_ShowNum(3, 6, adcVolt, 1);
		OLED_ShowNum(3, 8, (uint16_t)(adcVolt * 100) % 100, 2);

        OLED_ShowNum(4, 6, angleDeg, 3);
		OLED_ShowNum(4, 10, (uint16_t)(angleDeg * 1000) % 1000, 1);
		
		Delay_ms(50);
	}
}

效果展示


将磁铁固定在电机上,让电机转动。

注意事项

  1. AGC 与磁铁摆放:把磁铁放到合适的间隙(典型 0.5–3 mm),并用 AGC 值把距离调到居中(3.3V 下 AGC 0..128,目标约中间值)。如果 AGC 很小或很大,说明磁场太弱或太强。
  2. 程序写 OTP(Burn)非常谨慎:write 0x40 to 0xFF 会永久写入,次数有限。务必在确认无误后再做。
  3. 滤波设定:默认有 slow/fast filter,能在精度与响应间做折中;如果需要高速动态测量请降低慢滤波系数/调整 FTH。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32F103
    +关注

    关注

    34

    文章

    497

    浏览量

    68192
  • 位置传感器
    +关注

    关注

    3

    文章

    307

    浏览量

    28682
  • AS5600
    +关注

    关注

    0

    文章

    13

    浏览量

    12522
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AS5600 AS5600-ASOT AS5600-ASOM 非接触式磁性位置传感器

    使用电位计的应用的角位移,包括旋转旋钮和刻度盘。通过将AS5600与低成本两极磁铁配对,设计工程师能以与使用中档电位计类似的成本部署角度测量系统,这都得益于该设备极具吸引力的性价比。AS560
    发表于 11-05 13:56

    AS5600开发记录

    AS5600这颗磁角度传感器,以前就对相关的磁应用感到各种高大上(例如霍尔传感器,磁流体等)。既然接触到了,就开始搜索相关资料,发现有用的资料并不多,仅限官网上发布的一些。作为程序员看完datashe...
    发表于 08-27 07:32

    如何读取stm32f103外部的数据

    如何读取stm32f103外部的数据
    发表于 12-09 07:48

    如何用STM32F103模拟IIC去读取陀螺仪/加速度/角度数据?

    如何用STM32F103模拟IIC去读取陀螺仪/加速度/角度数据?
    发表于 12-14 07:28

    STM32读取MPU6050角度数据的方法

    STM32读取MPU6050角度数据OLED显示 STM32F103C8T6读取陀螺仪MPU6050的
    发表于 02-10 06:33

    基于stm32f103的mpu6050自带的dmp数据读取实验程序

    基于stm32f103的mpu6050自带的dmp数据读取实验程序
    发表于 12-08 15:54 273次下载

    基于stm32f103数据采集

    基于stm32f103数据采集,将0-3.3v的电压转换成数字量
    发表于 05-06 16:43 53次下载

    STM32F103封装方式与功能配置

    本文介绍STM32F103封装方式和STM32F103管脚功能的配置。
    发表于 08-03 17:44 2.2w次阅读
    <b class='flag-5'>STM32F103</b>封装方式与功能配置

    STM32F103使用总结

    STM32F103使用总结
    发表于 10-24 10:22 154次下载

    stm32f103移植

    stm32f103移植
    发表于 10-27 09:03 43次下载
    <b class='flag-5'>stm32f103</b>移植

    STM32F103教程之STM32F103单片机的使用心得资料免费下载

    本文档的主要内容详细介绍的是STM32F103教程之STM32F103单片机的使用心得资料免费下载目前很火的设计STM32教程。
    发表于 09-26 08:00 260次下载

    PLC如何读取模拟量数据

    PLC的基本单元是不能直接读取模拟量数据的,本身没有模拟量输入接口必须通过扩展的AD模块才能读取。AD模块的作用就是把
    的头像 发表于 11-02 09:42 1.3w次阅读
    PLC如何<b class='flag-5'>读取</b><b class='flag-5'>模拟量</b>的<b class='flag-5'>数据</b>

    STM32F103 模拟IIC时序

    STM32F103 模拟IIC时序
    发表于 11-25 09:51 35次下载
    <b class='flag-5'>STM32F103</b>  <b class='flag-5'>模拟</b>IIC时序

    STM32F103:内部Flash模拟EEPROM

    内部Flash模拟EEPROM一、原因由于STM32F103系列的单片机内部Flash的擦写次数仅有10k次,如果遇到想要存储又多变,又需要掉电保存的数据,就显得有点捉襟见肘了。我决定利用单片机
    发表于 12-02 11:36 35次下载
    <b class='flag-5'>STM32F103</b>:内部Flash<b class='flag-5'>模拟</b>EEPROM

    基于STM32F103的DAC8411驱动程序

    基于STM32F103的DAC8411驱动程序,亲测可用,欢迎大家一起交流
    发表于 08-28 11:21 25次下载