FOC系列(三)----AS5600磁编码器

一、 关于AS5600

1.1 芯片内部框图和引脚功能介绍

   具体的内容大家可以查看数据手册:AS5600数据手册,在这里只是对一下重要的地方进行说明。
   系统框图如下:
在这里插入图片描述
   电源设计选项,我在设计时选择的是第二种电源方案,但是采用此方案,一定要将VDD5V和VDD3V3接在一起。
在这里插入图片描述
   下图是引脚的说明,AS5600可以将测得的角度信息通过IIC或者OUT口读取:
在这里插入图片描述
  后续会有对PGO口和OUT口的介绍。

1.2 IIC总线

在这里插入图片描述
在这里插入图片描述
   上图是IIC的时序图以及各时序的时间,其中关于的时序的时间一定要保证符合要求,否则将导致无法读写数据,所以为了保证能正常使用IIC,建议还是使用IO口模拟的IIC。
   AS5600有两个地址,一个是从地址(0x36);另一个是寄存器地址,在读写事件中确定往哪里读写。地址这个东西也很好理解,你给某个人家送快递,你得知道这户人家在哪栋楼(从地址),住在这栋楼的第几层(寄存器地址),这样清楚知道后才会把东西交到正确的人手上;找到错误的地址,你就无法把东西交给正确的人。关于IIC的地址会在STM32系列博客中进行细致的讲解,大家可以订阅我的专栏,不久就能更新到IIC的知识了。
   有一些特殊的寄存器: ANGLE, RAW ANGLE 和MAGNITUDE 寄存器,它们在读取时禁止地址指针的自动增加,因此重新读取这些寄存器不需要I²C写命令来重新加载地址指针。注意:对指针的这种特殊处理仅在地址指针设置为寄存器的高字节时有效。
  只有当总线不忙时(因为有时候一个IIC上不光挂一个器件,可能并联多个IIC器件,所以在某一时刻可能存在某个器件正在读写数据,即总线忙;当某个器件结束读写,总线不忙了,才可以读写这个器件),才可以开始数据传输。在数据传输过程中,当SCL高时,数据线必须保持稳定(这也是为什么IIC必须要加上拉电阻的原因)。当SCL高时,数据线的变化被解释为START或STOP条件。
  下面就是一些总线空闲、起始、停止、数据传输、应答的介绍,这些算是IIC的基础内容,在这就不再进行详细介绍了。

1.3 AS5600从模式

1.3.1 写模式

在这里插入图片描述
   在起始条件之后,主机发送从地址(0x36),再接一个读写指令(0–写;1–读);AS5600确认是从地址正确,会返回一个应答(A)。紧接着主机再发送寄存器地址,如果AS5600确认寄存器地址正确,则返回应答(A);之后主机开始发送要写入的数据,AS5600从寄存器地址开始,地址指针会自动增加,将数据写入对应的寄存器中。注意:无论寄存器地址是否正确,在每传输一个字节之后都会自增。

1.3.2 读模式

在这里插入图片描述
  和写模式差不多,从地址+1(读),AS5600返回一个应答(A),然后,AS5600开始从地址指针指向的寄存器地址开始传输数据。如果在开始读事务之前没有写地址指针,那么读到的第一个地址就是存储在地址指针中的最后一个地址。AS5600必须收到一个不确认(NACK)来结束读事假。
   这个地方很奇怪,数据手册的格式里面没有说在哪写寄存器地址,但是这又是必须的,我没太看明白这个地方。

1.3.2 用地址指针重新加载读取数据

在这里插入图片描述
   这个才是正确的读操作的格式,后面的读取数据都是使用这个模式。

1.4 寄存器

1.4.1 配置寄存器

在这里插入图片描述
   ZMOC:表示了ZPOS和MPOS被永久写入的次数
   ZPOS、MPOS、MANG :这些寄存器用于配置起始位置(ZPOS)和停止位置(MPOS)或更窄角度范围的最大角度(MANG)。角度范围必须大于18度。在角范围变窄的情况下,分辨率不会缩放到变窄的范围。
   CONF:
在这里插入图片描述

1.4.2 输出寄存器

在这里插入图片描述
   RAW ANGLE寄存器包含未缩放和未修改的角度。缩放后的输出值在ANGLE寄存器中可用。
  

1.4.3 状态寄存器

在这里插入图片描述
   STATUS:
在这里插入图片描述
  AGC:AS5600在闭环中使用自动增益控制来补偿由于温度变化,IC和磁铁之间的气隙以及磁铁退化而引起的磁场强度变化。AGC寄存器表示增益。为了获得最稳健的性能,增益值应该位于其范围的中心。物理系统的气隙可通过调节来达到此值。
  MAGNITUDE:表示内部CORDIC的幅度值

1.4.4 Burn指令

在这里插入图片描述
   Burn_Angle Command (ZPOS, MPOS):主控制器可以用BURN_ANGLE命令对ZPOS和MPOS进行永久编程。要执行BURN_ANGLE命令,请将值0x80写入寄存器0xFF。BURN_ANGLE命令最多可以执行3次。ZMCO显示了ZPOS和MPOS被永久写入的次数。该命令只能在检测到磁铁存在的情况下执行(MD = 1)。
  Burn_Setting Command (MANG, CONFIG):主控制器可以使用BURN_SETTING命令执行MANG和CONFIG的永久写入。要执行BURN_SETTING命令,将值0x40写入寄存器0xFF。只有当ZPOS和MPOS从未被永久写入(ZMCO = 00)时,才可以写入MANG。BURN_ SETTING命令只能执行一次。

二、 代码实现

   目前使用的IIC读取寄存器的值,来获取角度等信息,所以对OUT口读取数据不再介绍,后续如果使用到的话会再次更新该博客。
  目前使用的是模拟IIC读取数据,下面是有关模拟IIC实现读取角度的代码:
   IIC读命令:

uint8_t I2C_Read8(uint8_t moni_dev_addr, uint8_t moni_reg_addr, uint8_t moni_i2c_len, uint8_t *moni_i2c_data_buf)
{I2C1_START();I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Transmitter);I2C1_Wait_Ack();I2C1_SendByte(moni_reg_addr);I2C1_Wait_Ack();//Sim_I2C1_STOP();I2C1_START();I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Receiver);I2C1_Wait_Ack();while (moni_i2c_len){if (moni_i2c_len==1) *moni_i2c_data_buf =I2C1_ReceiveByte();else *moni_i2c_data_buf =I2C1_ReceiveByte_WithACK();moni_i2c_data_buf++;moni_i2c_len--;}I2C1_STOP();return 0x00;
}

   IIC写命令:

int8_t I2C1_Write8(uint8_t moni_dev_addr, uint8_t moni_reg_addr, uint8_t moni_i2c_len, uint8_t *moni_i2c_data_buf)
{uint8_t i;I2C1_START();I2C1_SendByte(moni_dev_addr << 1 | I2C1_Direction_Transmitter);I2C1_Wait_Ack();I2C1_SendByte(moni_reg_addr);I2C1_Wait_Ack();//Sim_I2C1_START();for (i=0; i<moni_i2c_len; i++){I2C1_SendByte(moni_i2c_data_buf[i]);I2C1_Wait_Ack();}I2C1_STOP();	return 0;
}

   读取两个字节:

uint16_t readTwoBytes(uint8_t in_adr_hi, uint8_t in_adr_lo)
{uint16_t retVal = -1;uint8_t low=0,high=0;/* Read Low Byte */low = readOneByte(in_adr_lo);/* Read High Byte */  high = readOneByte(in_adr_hi);//printf("high:%d,low:%d  ",high,low);retVal = high << 8;retVal = retVal | low;//printf("retVal:%d\r\n",retVal);return retVal;
}

   读取单个字节:

uint8_t readOneByte(uint8_t in_adr)
{uint8_t retVal = -1;I2C_Read8(AS5600_Address,in_adr,1,&retVal);I2C1_NOP;return retVal;
}

   IIC获取原始角度:

int16_t getRawAngle(void)
{return readTwoBytes(_raw_ang_hi, _raw_ang_lo);
}

   原始角度信息转换为真实角度:

float convertRawAngleToDegrees(int16_t newAngle)
{/* Raw data reports 0 - 4095 segments, which is 0.087 of a degree */    float retVal = newAngle * 0.087;return retVal;
}

  效果展示:
在这里插入图片描述
  原理图和PCB:
在这里插入图片描述
在这里插入图片描述

二、往期回顾

FOC系列(一)----DRV8301芯片的学习
FOC系列(二)----继续学习DRV8301芯片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐6款交互设计软件,助你事半功倍!

交互软件可以帮助设计师从“可用性”和“用户体验”的角度优化他们的作品。如果设计师想创建一个令人满意的交互设计作品&#xff0c;一个方便的交互设计软件是必不可少的。当然&#xff0c;交互软件只是我们实现目标的一种手段。根据设计师的个人喜好和方便&#xff0c;选择易…

可以免费使用的Axure在线版来了

Axure作为一种功能强大的原型设计工具&#xff0c;一直受到设计师的青睐。然而&#xff0c;其高昂的价格可能成为一个门槛&#xff0c;限制了一些设计师的选择。但不用担心&#xff0c;现在有一个免费的Axure在线工具即时设计&#xff0c;功能更完整&#xff0c;更划算&#xf…

基于字面的文本相似度计算和匹配搜索

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

基于PaddleOCR银行卡识别实现(三)

前言 基于PaddleOCR银行卡识别实现&#xff08;一&#xff09; 基于PaddleOCR银行卡识别实现&#xff08;二&#xff09; 前两篇文章讲了检测模型和识别模型的实现&#xff0c;这一篇文章姗姗来迟&#xff0c;将讲解下两个模型的串联应用和PaddleOCR的源码精简&#xff0c;下面…

陪诊系统:基于自然语言处理的患者沟通创新

医疗领域的数字化转型正日益引入创新技术&#xff0c;其中基于自然语言处理&#xff08;NLP&#xff09;的陪诊系统成为提升患者沟通的一项关键技术。本文将深入研究这一领域&#xff0c;介绍陪诊系统如何借助NLP实现患者沟通的创新&#xff0c;并提供一个简单的Python代码示例…

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

onnx快速部署YOLO模型

1、准备和环境 首先需要将yolov5模型训练好的最佳权重文件转化为.onnx格式以备使用。不会的小伙伴可以参考yolov5的官方文档&#xff0c;使用yolov5官方的 export.py 脚本进行转换&#xff0c;或者参考一些博客链接&#xff0c;这里不做详细解析。  基本环境配置&#xff0c;相…

谱方法学习笔记-上(超详细)

谱方法学习笔记&#x1f4d2; 谱方法学习笔记-下(超详细) 声明&#xff1a;鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式&#xff0c; KaTeX \KaTeX KATE​X 与 L a T e X LaTeX LaTeX 不同&#xff0c;不支持直接的交叉引用命令&#xff0c;如\label和\eqref。 KaTeX \KaT…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型&#xff1a; Test1&#xff1a;STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request&#xff08;没有设置任何属性&#xff09;。STUN Server收到该请求后&#xff0c;通过端口{IP-S1:Port-S1}把…

【区块链】产品经理的NFT初探

常见的FT如比特币&#xff08;BTC&#xff09;&#xff0c;以太币&#xff08;ETH&#xff09;等&#xff0c;两个代币之间是完全可替换的。而NFT具有唯一性&#xff0c;不可以互相替换。本文作者对NET的发展现状、相关协议、应用场景等方面进行了分析&#xff0c;一起来看一下…

论如何让Spring Boot在高压力环境下依然与众不同

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容调优线程池优化线程池配置多样化设备支持分布式控制同步编程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客…

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址&#xff1a;An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本&#xff0c;但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此&#xff0c;…

HTTP协议,Web框架回顾

HTTP 请求协议详情 -请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本 -请求头---》key:value形式 -referer&#xff1a;上一次访问的地址 -user-agenet&#xff1a;客户端类型 -name&#xff1a;lqz -cookie&…

500元价位开放式耳机哪款好用、百元价位开放式耳机推荐

经常佩戴入耳式耳机的朋友应该都遇到过耳朵肿胀的感觉&#xff0c;这个时候&#xff0c;就是耳朵在告诉你&#xff0c;该休息一会了。如果耳朵里经常塞着耳机听歌&#xff0c;时间久了很容易引起听力衰退等问题&#xff0c;这是不可逆的伤害。各位朋友如果和我一样每天都戴着耳…

1120:最值交换

题目描述 有一个长度为n的整数序列。请写一个程序&#xff0c;先把序列中的最小值与第一个数交换&#xff0c;再把最大值与最后一个数交换。输出转换好的序列。 分别编写两个函数MinIndex()和MaxIndex()来计算最小值下标和最大值下标。 int MinIndex(int a[], int n); //函数返…

C++基础 -12- 拷贝构造(浅拷贝)

系统会自动生成浅拷贝&#xff0c;就相当于直接赋值 #include "iostream"using namespace std;class base { public:base(int a, int b) : a(a), b(b){}int a;int b; }; int main() {base newbase1(10, 20);base newbase2 newbase1;cout << newbase1.a <…

数据库的增删查改(CRUD)基础版

CRUD: create增加、retrieve查询、update更新、delete删除 注意一点&#xff1a;MySQL对大小写是不敏感的 目录 新增&#xff08;create&#xff09; 全列插入 指定列插入 多行插入 查询&#xff08;Retrieve&#xff09; 列查询 全列查询 指定列查询 表达式查询 …

wsl 命令详解

WSL 简介 WSL全称 Windows Subsystem for Linux &#xff0c;是微软开发的一个运行在Windows上的兼容层&#xff0c;它允许开发人员和用户直接在Windows上运行原生Linux二进制文件&#xff0c;而无需配置或修改系统。 WSL命令是用于管理和操作WSL子系统的工具。 常用WSL命令…

系统设计概念:生产 Web 应用的架构

在你使用的每个完美应用程序背后&#xff0c;都有一整套的架构、测试、监控和安全措施。今天&#xff0c;让我们来看看一个生产就绪应用程序的非常高层次的架构。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保我们的代码从存储库经过一系列测试…

Java核心知识点整理大全22-笔记

目录 19.1.14. CAP 一致性&#xff08;C&#xff09;&#xff1a; 可用性&#xff08;A&#xff09;&#xff1a; 分区容忍性&#xff08;P&#xff09;&#xff1a; 20. 一致性算法 20.1.1. Paxos Paxos 三种角色&#xff1a;Proposer&#xff0c;Acceptor&#xff0c;L…