ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

48-AS5600旋转磁编码器

48-AS5600旋转磁编码器 AS5600旋转磁编码器1.引脚说明2.读写地址3.相关寄存器1. ZMCO0x00—— 烧录次数Bit[1:0]只读。记录 ZPOS/MPOS 已经被 BURN_ANGLE 永久烧录过几次。最多 3 次所以该字段最大值为 3。2.ZPOS0x01-0x02—— 零位/起始角12 位分成高 4 位0x01 的低 4 位 低 8 位0x02。定义角度的起始位置即输出为 0 时对应的机械角度。默认值 00°。3. MPOS0x03-0x04—— 最大角/终止角12 位格式同 ZPOS。定义角度的终止位置与 ZPOS 一起限定有效角度范围。默认值 4095360°。4. MANG0x05-0x06—— 最大角度范围12 位格式同 ZPOS。直接设定角度范围的大小而不是终点位置。只能在没有烧录过 ZPOS/MPOS 时烧录ZMCO00。范围必须 18°。ZPOS/MPOS 与 MANG 的区别ZPOSMPOS 指定起点和终点。ZPOSMANG 指定起点和范围大小。两种方式二选一不要混用。5. CONF0x07-0x08—— 配置寄存器重点这是最核心的配置寄存器按位段划分位段 名称 功能 取值[1:0] PM 功耗模式 00NOM, 01LPM1, 10LPM2, 11LPM3[3:2] HYST 迟滞 00关, 011LSB, 102LSB, 113LSB[5:4] OUTS 输出模式 00模拟全量程, 01模拟10%~90%, 10PWM[7:6] PWMF PWM 频率 00115Hz, 01230Hz, 10460Hz, 11920Hz[9:8] SF 慢滤波 0016x, 018x, 104x, 112x[12:10] FTH 快滤波阈值 000仅慢滤波, 0016LSB, … 11110LSB13 WD 看门狗 0关, 1开注意CONF 是 16 位跨 0x07高字节和 0x08低字节6. RAW ANGLE0x0C-0x0D—— 原始角度12 位未缩放、未修正的原始角度值。反映芯片直接测量到的机械角度0~4095 对应 0~360°。读这个寄存器时地址指针不会自动递增方便连续读取。7. ANGLE0x0E-0x0F—— 缩放后角度12 位经过 ZPOS/MPOS/MANG 映射后的角度值。这是最终用于输出模拟/PWM的角度值。同样具有地址指针不自动递增的特性。在 360° 边界处有 10 LSB 迟滞防止输出在 0°/360° 附近抖动。RAW ANGLE vs ANGLERAW 机械绝对角度不受编程影响。ANGLE 应用角度受 ZPOS/MPOS/MANG 影响。8. STATUS0x0B—— 状态位 名称 含义5 MH AGC 最小增益溢出磁铁太强4 ML AGC 最大增益溢出磁铁太弱3 MD 检测到磁铁MD1 表示磁铁在位烧录命令必须在 MD1 时执行。MH/ML 可用来判断气隙是否合适。9. AGC0x1A—— 自动增益8 位反映内部 AGC 环路当前增益。5V 模式范围 0~2553.3V 模式范围 0~128。最佳值在量程中间可用来调整磁铁与芯片的气隙。10. MAGNITUDE0x1B-0x1C—— 磁场幅值12 位CORDIC 计算出的磁场矢量幅值。可用于诊断磁场强度是否合适。11. BURN0xFF—— 烧录命令只写寄存器写入特定值触发 OTP 烧录写入值 命令 作用 次数限制0x80 BURN_ANGLE 烧录 ZPOS MPOS 最多 3 次0x40 BURN_SETTING 烧录 MANG CONF 只能 1 次重要约束BURN_ANGLE 要求 MD1磁铁在位。BURN_SETTING 要求 ZMCO00ZPOS/MPOS 从未烧录过。烧录时供电必须稳定5V 模式 4.5~5.5V3.3V 模式 3.25~3.35V。3.3V 烧录时 VDD3V3 需要外接 10µF 电容4.相关代码voidIic_Gpio_Init(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13);GPIO_InitStructure.GPIO_PinGPIO_Pin_12|GPIO_Pin_13;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13);}voidIIC_Start(void){IIC_SDA1;IIC_SCL1;delay_us(2);IIC_SDA0;delay_us(2);IIC_SCL0;delay_us(2);}voidIIC_Stop(void){IIC_SCL0;IIC_SDA0;delay_us(2);IIC_SCL1;delay_us(2);IIC_SDA1;delay_us(2);}u8IIC_Wait_Ack(void){u8 ucErrTime0;IIC_SDA1;IIC_SCL0;delay_us(2);IIC_SCL1;delay_us(2);while(READ_SDA){ucErrTime;if(ucErrTime250){IIC_Stop();return0;}}delay_us(2);IIC_SCL0;delay_us(2);return0;}voidIIC_Ack(void){IIC_SDA0;IIC_SCL0;delay_us(2);IIC_SCL1;delay_us(4);IIC_SCL0;delay_us(2);}voidIIC_NAck(void){IIC_SDA1;IIC_SCL0;delay_us(2);IIC_SCL1;delay_us(4);IIC_SCL0;delay_us(2);}u8IIC_Send_Byte(u8 txd){u8 t;IIC_SCL0;for(t0;t8;t){if((txd0x80)7)IIC_SDA1;elseIIC_SDA0;txd1;delay_us(2);IIC_SCL1;delay_us(4);IIC_SCL0;delay_us(2);}returnIIC_Wait_Ack();}u8IIC_Read_Byte(u8 ack){unsignedchari,receive0;IIC_SCL0;IIC_SDA1;for(i0;i8;i){delay_us(2);IIC_SCL1;delay_us(2);receive1;if(READ_SDA)receive;delay_us(2);IIC_SCL0;delay_us(2);}if(!ack)IIC_NAck();elseIIC_Ack();returnreceive;}u8I2C_Write(u8 dev_addr,u8 reg_addr,u8*data,u8 len){u8 i,result0;IIC_Start();//resultIIC_Send_Byte(dev_addr1);if(result!0)returnresult;//resultIIC_Send_Byte(reg_addr);if(result!0)returnresult;//for(i0;ilen;i){resultIIC_Send_Byte(data[i]);if(result!0)returnresult;}IIC_Stop();return0x00;}u8I2C_Read(u8 dev_addr,u8 reg_addr,u8*data,u8 len){uint8_tresult;IIC_Start();resultIIC_Send_Byte(dev_addr1);if(result!0)returnresult;//resultIIC_Send_Byte(reg_addr);if(result!0)returnresult;//IIC_Start();resultIIC_Send_Byte(dev_addr1|0x01);if(result!0)returnresult;//while(len){if(len1)*dataIIC_Read_Byte(0);else*dataIIC_Read_Byte(1);data;len--;}IIC_Stop();return0x00;}#ifndef__AS5600_H#define__AS5600_H#includestm32f10x.h/* AS5600 7位从机地址 */#defineAS5600_ADDR0x36/* 寄存器地址 */#defineAS5600_REG_ZMCO0x00#defineAS5600_REG_ZPOS0x01#defineAS5600_REG_MPOS0x03#defineAS5600_REG_MANG0x05#defineAS5600_REG_CONF0x07#defineAS5600_REG_STATUS0x0B#defineAS5600_REG_RAWANGLE0x0C#defineAS5600_REG_ANGLE0x0E#defineAS5600_REG_AGC0x1A#defineAS5600_REG_MAGNITUDE0x1B#defineAS5600_REG_BURN0xFF/* STATUS 位 */#defineAS5600_STATUS_MH(15)#defineAS5600_STATUS_ML(14)#defineAS5600_STATUS_MD(13)/* CONF 位段 */#defineAS5600_PM_NOM0x00#defineAS5600_PM_LPM10x01#defineAS5600_PM_LPM20x02#defineAS5600_PM_LPM30x03#defineAS5600_OUTS_ANALOG_FULL0x00#defineAS5600_OUTS_ANALOG_REDUCE0x01#defineAS5600_OUTS_PWM0x02/* 返回值 */#defineAS5600_OK0#defineAS5600_ERR1/* 角度换算12位 - 0.1度避免浮点 */#defineAS5600_RAW_TO_DEG(x)((float)(x)*360.0f/4096.0f)/* API */u8AS5600_Init(void);u8AS5600_GetRawAngle(u16*angle);u8AS5600_GetAngle(u16*angle);u8AS5600_GetStatus(u8*status);u8AS5600_GetAGC(u8*agc);u8AS5600_GetMagnitude(u16*mag);u8AS5600_GetZMCO(u8*zmco);u8AS5600_GetZPOS(u16*zpos);u8AS5600_SetZPOS(u16 zpos);u8AS5600_GetMPOS(u16*mpos);u8AS5600_SetMPOS(u16 mpos);u8AS5600_GetMANG(u16*mang);u8AS5600_SetMANG(u16 mang);u8AS5600_GetCONF(u16*conf);u8AS5600_SetCONF(u16 conf);u8AS5600_BurnAngle(void);u8AS5600_BurnSetting(void);u8AS5600_ReloadOTP(void);#endif#includeAll_Header.hexternu8I2C_Write(u8 dev_addr,u8 reg_addr,u8*data,u8 len);externu8I2C_Read(u8 dev_addr,u8 reg_addr,u8*data,u8 len);/* ------------------------------------------------------------------ *//* 基本读写 *//* ------------------------------------------------------------------ *//* 写单个字节 */staticu8AS5600_WriteByte(u8 reg,u8 data){returnI2C_Write(AS5600_ADDR,reg,data,1);}/* 读单个字节 */staticu8AS5600_ReadByte(u8 reg,u8*data){returnI2C_Read(AS5600_ADDR,reg,data,1);}/* 读16位大端高字节在前低字节在后 */staticu8AS5600_ReadU16(u8 reg,u16*val){u8 buf[2];if(I2C_Read(AS5600_ADDR,reg,buf,2)!0)returnAS5600_ERR;*val((u16)buf[0]8)|buf[1];returnAS5600_OK;}/* 写16位大端 */staticu8AS5600_WriteU16(u8 reg,u16 val){u8 buf[2];buf[0](u8)(val8);buf[1](u8)(val0xFF);returnI2C_Write(AS5600_ADDR,reg,buf,2);}/* ------------------------------------------------------------------ *//* 初始化只检查通信 读状态 *//* ------------------------------------------------------------------ */u8AS5600_Init(void){u8 status0;if(AS5600_GetStatus(status)!AS5600_OK)returnAS5600_ERR;returnAS5600_OK;}/* ------------------------------------------------------------------ *//* 角度读取 *//* ------------------------------------------------------------------ *//* 读原始角度12位0~4095 */u8AS5600_GetRawAngle(u16*angle){u16 v;if(AS5600_ReadU16(AS5600_REG_RAWANGLE,v)!AS5600_OK)returnAS5600_ERR;*anglev0x0FFF;returnAS5600_OK;}/* 读缩放后角度受 ZPOS/MPOS/MANG 影响 */u8AS5600_GetAngle(u16*angle){u16 v;if(AS5600_ReadU16(AS5600_REG_ANGLE,v)!AS5600_OK)returnAS5600_ERR;*anglev0x0FFF;returnAS5600_OK;}/* ------------------------------------------------------------------ *//* 状态 / 诊断 *//* ------------------------------------------------------------------ */u8AS5600_GetStatus(u8*status){returnAS5600_ReadByte(AS5600_REG_STATUS,status);}u8AS5600_GetAGC(u8*agc){returnAS5600_ReadByte(AS5600_REG_AGC,agc);}u8AS5600_GetMagnitude(u16*mag){returnAS5600_ReadU16(AS5600_REG_MAGNITUDE,mag);}u8AS5600_GetZMCO(u8*zmco){u8 v;if(AS5600_ReadByte(AS5600_REG_ZMCO,v)!AS5600_OK)returnAS5600_ERR;*zmcov0x03;returnAS5600_OK;}/* ------------------------------------------------------------------ *//* 配置寄存器 *//* ------------------------------------------------------------------ */u8AS5600_GetZPOS(u16*zpos){returnAS5600_ReadU16(AS5600_REG_ZPOS,zpos);}u8AS5600_SetZPOS(u16 zpos){returnAS5600_WriteU16(AS5600_REG_ZPOS,zpos0x0FFF);}u8AS5600_GetMPOS(u16*mpos){returnAS5600_ReadU16(AS5600_REG_MPOS,mpos);}u8AS5600_SetMPOS(u16 mpos){returnAS5600_WriteU16(AS5600_REG_MPOS,mpos0x0FFF);}u8AS5600_GetMANG(u16*mang){returnAS5600_ReadU16(AS5600_REG_MANG,mang);}u8AS5600_SetMANG(u16 mang){returnAS5600_WriteU16(AS5600_REG_MANG,mang0x0FFF);}u8AS5600_GetCONF(u16*conf){returnAS5600_ReadU16(AS5600_REG_CONF,conf);}u8AS5600_SetCONF(u16 conf){returnAS5600_WriteU16(AS5600_REG_CONF,conf);}/* ------------------------------------------------------------------ *//* OTP 烧录命令 *//* ------------------------------------------------------------------ */u8AS5600_BurnAngle(void){u8 cmd0x80;returnI2C_Write(AS5600_ADDR,AS5600_REG_BURN,cmd,1);}u8AS5600_BurnSetting(void){u8 cmd0x40;returnI2C_Write(AS5600_ADDR,AS5600_REG_BURN,cmd,1);}/* 依次写 0x01, 0x11, 0x10把 OTP 内容重新加载到寄存器 */u8AS5600_ReloadOTP(void){u8 c;c0x01;if(I2C_Write(AS5600_ADDR,AS5600_REG_BURN,c,1))returnAS5600_ERR;c0x11;if(I2C_Write(AS5600_ADDR,AS5600_REG_BURN,c,1))returnAS5600_ERR;c0x10;if(I2C_Write(AS5600_ADDR,AS5600_REG_BURN,c,1))returnAS5600_ERR;returnAS5600_OK;}/* 读原始角度 */AS5600_GetRawAngle(raw);/* 读缩放后角度 */AS5600_GetAngle(angle);/* 读状态和 AGC */AS5600_GetStatus(status);AS5600_GetAGC(agc);printf(RAW%4d ANGLE%4d DEG%.1f AGC%3d MD%d ML%d MH%d\r\n,raw,angle,AS5600_RAW_TO_DEG(raw),agc,(statusAS5600_STATUS_MD)?1:0,(statusAS5600_STATUS_ML)?1:0,(statusAS5600_STATUS_MH)?1:0);delay_ms(500);
返回列表