汽车电子笔记之-013:旋变硬解码ADI芯片AD2S1210使用记录(从零开始到软件实现)

目录

1、概述

2、技术规格

3、芯片引脚

4、旋变信号格式

5、使用过程只是要点分析

5.1、程序注意点分析

5.1.1、SPI配置时序

5.1.2、问题一:SPI时序问题

5.1.3、问题二:SPI读取时序(配置模式)

5.1.4、问题三:SPI写入时序(配置模式)

5.1.5、问题四:初始化问题

5.1.6、问题五:SAMPLE管脚

5.1.7、问题六:故障寄存器0xFF、复位寄存器0xF0

5.1.8、问题七:普通模式

5.2、常见问题分析

5.2.1、变比问题

5.2.2、削波故障

5.2.3、锁相故障

5.2.4、SPI通信故障

5.2.5、故障寄存器读取问题

5.2.6、数据处理错误

5.2.7、硬件连接问题

6、代码链接


1、概述

        AD2S1210是一款10位至16位分辨率旋变数字转换器,集成片上可编程正弦波振荡器,为旋变器提供正弦波激励。

        转换器的正弦和余弦输入端允许输入3.15 V p-p ± 27%、频率为2 kHz至20 kHz范围内的信号。 Type II伺服环路用于跟踪输入信号,并将正弦和余弦输入端的信息转换为输入角度和速度所对应的数字量。最大跟踪速率为3125 rps。

        AD2S1210是做电机控制器常见的位置解析芯片,具备解析出绝对位置(机械角度)与速度,解析的方式可以通过串口SPI、并口IO口、ABZ传出需要的信息。

        最大跟踪速率: 3125 rps(10位分辨率)注意这里的单位是秒,也就是3125转每秒,日常使用已经足够了。

        精度±2.5弧分,意味着该设备在测量角度时,其输出值与实际输入值之间的最大误差为±2.5弧分。

        弧分(Arcminute):弧分是一个角度单位,1弧分等于1/60度。因此,±2.5弧分等于±2.5/60度,约等于±0.04167度。

        最大精度:这一参数表示在理想条件下(例如温度、供电电压等都在规定范围内),AD2S1210在测量时可能产生的最大误差。换句话说,设备的输出值可能在实际值的±2.5弧分范围内波动。

         功能框图如下:

产品特色:

        1、比率跟踪转换。 Type II跟踪环路能够连续输出位置数据,且没有转换延迟。它还可以抑制噪声,并提供参考和输入信号的谐波失真容限。

        2、系统故障检测。故障检测电路可以检测旋变的信号丢失、超范围输入信号、输入信号失配或位置跟踪丢失。各故障检测阈值可以由用户单独编程,以便针对特定应用进行优化。

        3、输入信号范围。正弦和余弦输入端支持3.15 V p-p ± 27%的差分输入电压。

        4、可编程激励频率。可以轻松地将激励频率设置为2 kHz至20 kHz范围内的多个标准频率。一般使用10KHz.

        5、3种格式位置数据。通过16位并行端口或4线串行接口可以访问10位至16位绝对角位置数据。增量式编码器仿真采用标准A-quad-B格式,并提供方向输出。

        6、数字速度输出。通过16位并行端口或4线串行接口可以访问10位至16位带符号的数字量速度。

2、技术规格

        除非另有说明, AVDD = DVDD = 5.0 V ± 5%, CLKIN = 8.192 MHz ± 25%, EXC频率 = 10 kHz至20 kHz(10位)、 6 kHz至20 kHz(12位)、3 kHz至12 kHz(14位)、 2 kHz至10 kHz(16位); TA = TMIN至TMAX1。

        一般来说按照芯片推荐使用的方式,初始化正确就行了,然后在普通模式下直接运行即可。

        正弦余弦的电压是有一定需求的

        正余弦的输入一般来源于旋转变压器,既然叫变压器,肯定有变比,一般来说AD2S1210的励磁信号输出为正负5V也就是峰峰值10V的样子,什么叫变比呢,细节概念不怎么懂,实际使用就是假设变比为0.5,那么sin+与sin-的差分信号为正负2.5V,这点很重要,关乎到故障问题。

        不过芯片推荐的为P-P7.2V

        手册里面有个注意点的,sin毕竟随着位置呈现正弦变化,幅值也会变。

        假设通过SPI通信的波特率是多少呢?如下所示,与电源相关性比较强。

        串口读取的时候需要注意的: 在串行回读期间内, A0和A1应保持不变。要回读8位故障信息和16位位置/速度数据,可能需要24个时钟周期。如果不需要故障信息,可以在16个时钟周期之后释放A0/A1。

3、芯片引脚

        着重注意的引脚如下

引脚名称

说明

RES1

分辨率选择1。逻辑输入。利用RES1和RES0,可以对AD2S1210的分辨率进行编程,

CS

片选。低电平有效逻辑输入。 CS保持低电平时,器件使能。

SOE

串行输出使能。逻辑输入。该引脚使能并行或串行接口。 SOE引脚保持低电平时,选择串行接口; SOE引脚保

持高电平时,选择并行接口。

SAMPLE

采样结果。逻辑输入。 SAMPLE信号发生高电平至低电平转换后,数据从位置和速度积分器传输到位置和速度寄存器,故障寄存器也会进行更新。(与初始化上电有关)

RESET

复位。逻辑输入。 AD2S1210需要一个外部复位信号使RESET输入保持低电平,直到VDD达到规定的工作电压范围4.75 V至5.25 V以内。

A0

模式选择0。逻辑输入。

A1

模式选择1。逻辑输入。

RES0

分辨率选择0。逻辑输入。利用RES1和RES0,可以对AD2S1210的分辨率进行编程,

4、旋变信号格式

      

旋变的电信号如下

5、使用过程只是要点分析

5.1、程序注意点分析

5.1.1、SPI配置时序

本次SPI采用的是S32K3x系列的芯片实现的,先将SPI的时序列举出来再描述坑点。

属性

描述

波特率

5MHZ

CS空闲状态

Low

数据转换边沿

CPHA =1

下降沿,第二个边沿

时钟空闲状态

CPOL = 0

Low

数据传输宽度

8bit

数据传输方向

MSB

配置参考图

5.1.2、问题一:SPI时序问题

        一定要注意CPOL = 0、CPHA =1当这一项配置有问题的时候,A0 = 1,A1=1的配置模式下会出现读取的SPI数据D7位一直为1,也就是最终数据为0x80,如下图所示。

错误时序如下

        上述时序乍一看与手册里面描述是一致的,但是手册图示有个坑点的,注意时钟与片选低电平的位置,正确理解是时钟开始的时候是低电平,不是高电平,数据转换在上升沿也就是前沿,数据读取在后沿也就是下降沿,千万别被迷惑了。注意如下图所示。

      正常时序如下

5.1.3、问题二:SPI读取时序(配置模式)

        读取数据的时候注意点有以下两个,1、SPI传输需要先将OLD DATA传出来。2、读取只能以8bit传输一次,不能通过SPI一次读取n个字节的方式。下图串行接口读取时序—配置模式里面有明确指示。

伪代码如下

#define Register1   	0x88
#define Register2		0x89
#define Register3   	0x8A
#define Register4		0x8B
#define Register5   	0x8C
#define Register6		0x8D
(void)ReadAD2S1210(Register1);	/*将OLD DATA传出来不要,所以void了函数*/
For(i = 0; i<6;i++)
{
if(i <5)
{
Buff[i] = ReadAD2S1210(Register_i); /*正常读取0-5寄存器数据*/
}
else
{Buff[i] = ReadAD2S1210(Register1);  /*将Register6数据传出来*/
}
}

5.1.4、问题三:SPI写入时序(配置模式)

        写入时序与读取时序类似只是以16bit为一次串口数据传输,一定要注意传入的值第一次是无效的。

5.1.5、问题四:初始化问题

        初始化是有严格的时序的,如果没有正确控制上电复位时序,可能会导致位置指示不正确。

        初始化时序图如下

        正常通过逻辑分析仪测试出来的波形如下图,注意一下tTRACK,这个时间参数很重要,直接影响了采样分辨率。

5.1.6、问题五:SAMPLE管脚

        采样管脚的下降沿用于锁存位置,产生下降沿之后,只有用SPI读取了位置信息才会再次进行更新。

5.1.7、问题六:故障寄存器0xFF、复位寄存器0xF0

        故障寄存器0xFF与复位寄存器0xF0是例外,故障寄存器0xFF不遵从问题二,复位寄存器0xF0问题三的规则,故障寄存器只需要用读取8bit数据0xFF即可实现读取故障,复位寄存器只需要写入8bit数据0xF0即可实现复位。

5.1.8、问题七:普通模式

        普通模式下,通过IO口A0与A1进行设置的,如下图选择

        普通模式下输出速度或者位置信息,包含故障信息,此时无需写入寄存器地址,通过SPI的读取函数传输16bit的任意数据得到的是速度或者位置信息,若是24bit的任意数据则是包含8bit的故障信息,一般来说使用16bit毕竟节省时间,DOS与LOT管脚会指示故障,当指示了故障再进入配置模式读取8bit的故障寄存器即可,毕竟故障只是少数时间内产生。

5.2、常见问题分析

5.2.1、变比问题

        EXC+与EXC-两者属于差分信号,两者的峰峰值在项目里面一般是正负5V,通过变比出来的sin+-,cos+-应该在手册给定的范围内。

        EXC+、 EXC-输出

  

        给到AD2S1210的信号电压峰峰值应该在下图范围内,超过的话就会报警了。

        在实际调试的时候一定要注意变比的问题。

5.2.2、削波故障

        **问题描述**:削波故障通常是因为输入信号的单端信号低于0.15V或高于4.8V,导致芯片无法正确处理信号。

削波故障如下图

        **解决方法**:确保输入信号的差分峰峰值在2.3V至4V之间。如果测量的峰峰值为2.4V,检查电路设计是否正确,确保信号在规定的范围内。

5.2.3、锁相故障

        - **问题描述**:锁相故障通常表现为角度值跳动范围大,可能由于激励信号滤波、旋转变压器或SIN/COS输入滤波器导致的延迟超出了44°。

        - **解决方法**:检查并调整激励信号滤波器的截止频率,确保其不会对信号造成过大的相移。如果系统中滤波器的截止频率对10KHz的信号相移过大,建议将截止频率放宽到50KHz左右,并进行实际仿真以观察延迟。

5.2.4、SPI通信故障

        - **问题描述**:在读取SPI数据时,与预期结果不符,可能由于时序问题或配置错误。

        - **解决方法**:检查SPI通信的时序设置,确保数据的读取和写入时序正确。如果问题依旧存在,检查GPIO配置是否正确,特别是采样保持次数的配置(针对DSP28335之类的芯片)。

5.2.5、故障寄存器读取问题

        - **问题描述**:在读取故障寄存器时,可能遇到读取数据不正确的情况。

        - **解决方法**:按照正确的时序和方法读取故障寄存器。例如,使用配置模式下读取故障寄存器,确保按照正确的步骤操作,如先写入控制寄存器地址,然后读取控制寄存器的值。参见5.1.3章节。

5.2.6、数据处理错误

        - **问题描述**:在处理从AD2S1210读取的数据时,可能出现数据处理错误。

        - **解决方法**:确保在软件中正确处理数据,包括位移操作和数据组合。例如,对于16位编码器分辨率,可能需要将高8位和低8位的数据组合成一个完整的16位数据。取出来的数据选择高位,别忘记移位操作。完整的16位数据。取出来的数据选择高位,别忘记移位操作。

5.2.7、硬件连接问题

        - **问题描述**:硬件连接错误或不稳固可能导致故障。

        - **解决方法**:检查所有硬件连接,包括旋转变压器的连接、AD2S1210的电源连接以及SPI通信接口的连接。确保所有连接正确无误,并且牢固可靠。

6、代码链接

        此代码属于在网上搜集的,包含了官方的与GitHub上收藏量比较高的,代码很原始,查看其实现逻辑比较重要,里面有五个文件夹分别对应五个例子。

AD2S1210例程(官方与GitHub)

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

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

相关文章

削峰+限流:秒杀场景下的高并发写请求解决方案

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,一个29岁、活泼积极、热衷分享技术的码农。今天和大家聊一聊应对高并发的写请求这个主题,尤其是在大促、秒杀这种场景下,系统…

非线性规划及其MATLAB实现

目录 引言 非线性规划的基本模型 非线性规划的求解方法 非线性规划的MATLAB实现 例子&#xff1a;多目标优化问题的非线性规划求解 表格总结&#xff1a;MATLAB常用非线性规划函数 实例&#xff1a;使用MATLAB求解非线性投资决策问题 结论 引言 非线性规划&#xff08;…

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录 全面掌握&#xff1a;JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

GAN的损失函数和二元交叉熵损失的对应及代码

以下解释为GPT生成 这里有个问题&#xff0c;使用二元交叉熵&#xff0c;的时候生成器的损失如何体现 看代码 import torch import torch.nn as nn import torch.optim as optim# 设置设备为GPU或CPU device torch.device("cuda" if torch.cuda.is_available() el…

EndnoteX9安装及使用教程

EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码&#xff1a;5210 解压完成后&#xff0c;如下所示&#xff1a; 1.2 安装 双击右键进行安装 安装比较简单…

【C++11 —— 线程库】

C11 —— 线程库 thread类介绍线程函数参数原子性操作库(atomic)lock_guard与unique_lockmutex的种类lock_guardunique_lock 两个线程交替打印奇偶数 thread类介绍 在C11之前&#xff0c;涉及到多线程的问题&#xff0c;都是和平台相关的&#xff0c;比如windows和Linux下各有…

AI 时代程序员的应变之道

一、AI 浪潮来袭&#xff0c;编程界风云变幻 随着 AIGC 大语言模型如 ChatGPT、Midjourney、Claude 等的涌现&#xff0c;AI 辅助编程工具日益普及&#xff0c;程序员的工作方式正经历着深刻的变革。 分析公司 OReilly 日前发布的《2023 Generative AI in the Enterprise》报告…

【Linux基础】冯诺依曼体系结构操作系统的理解

目录 前言一&#xff0c;冯诺依曼体系1. 为什么有内存结构?2. 对硬件中数据流动的再理解 二&#xff0c;操作系统(Operator System)1. 概念2. 操作系统结构的层状划分3. 操作系统对硬件管理的理解4. 用户与操作系统的关系的理解5. 系统调用和库函数的关系6. 为什么要有操作系统…

策略路由与路由策略的区别

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 一、主体不同 二、方式不同 三、规则不同 四、定义和基本概念 一、主体不同 1、路由策略&#xff1a;是为了改…

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图&#xff1a;这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢&#xff0c;安装过一版最新的android studio&#xff0c;然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候&#xff0c;就报错了&#xff1a; Execution failed…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0916)

接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http://big-event-vue-api-t.itheima.net 本项目的技术栈 本项目技术栈基于 ES6、vue3、pinia、vue-router 、vite 、axios 和 element-plus http:/…

RabbitMQ(高阶使用)死信队列

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 一、什么是死信队列&#xff1f; 二、死信队列使用场景 三、死信队列如何使用 四、打车超时处理 1.打车超时实现 以下是本篇文章正文内容 一、什么是死信队列&#xff1f; 先从概念解释上搞…

idea插件推荐之Cool Request

Cool Request是一款基于IDEA的HTTP调试工具&#xff0c;可以看成是轻量版的postman&#xff0c;它会自动扫描项目代码中所有API路径&#xff0c;按项目分组管理。一个类被定义为Controller且其中的方法被RequestMapping或者XXXMapping注解标注以后就会被扫描到。 对应方法左侧会…

智能硬件从零开始的设计生产流程

文章目录 市场分析团队组建ID设计结构设计pcba设计软件开发手板EVT开模DVTPVTMP 智能硬件研发是一个复杂的过程, 当然一件事要发出萌芽必须得有人, 有一天,几个合伙人凑在一起,说一起开发个智能硬件产品吧,于是故事开始了. 市场分析 合伙人: 万物互联的时代, 智能音箱已经成为…

LDR6020,单C口OTG,充放一体新潮流!

PD&#xff08;Power Delivery&#xff09;芯片实现单Type-C接口输入和输出OTG&#xff08;On-The-Go&#xff09;功能&#xff0c;主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释&#xff1a; 一、PD芯片基础功能 …

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)

前言 我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用&#xff08;text2sql&#xff09;》 利用langchain 中create_sql_agent 创建一个数据库代理智能体&#xff0c;但是实测中发现&#xff0c;使用 create_sql_agent 在对话中&#x…

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

七、垃圾收集器ParNewCMS与底层三色标记算法详解

文章目录 垃圾收集算法分代收集理论标记-复制算法标记-清除算法标记-整理算法 垃圾收集器1.1 Serial收集器(-XX:UseSerialGC -XX:UseSerialOldGC)1.2 Parallel Scavenge收集器(-XX:UseParallelGC(年轻代),-XX:UseParallelOldGC(老年代))1.3 ParNew收集器(-XX:UseParNewGC)1.4 C…