AD2S1210的使用总结


前言

最近在做永磁电机的驱动项目,在电机设计中最重要的部分就是闭环控制,闭环控制中最主要的变量就是电机在运行过程反馈回来的状态信息。之前项目中使用的都是增量式编码器,由于一些需求,准备改用旋转变压器来测量位置,并利用AD2S1210芯片进行解算来得到电机的电角度和速度。该芯片与DSP之间的通信则只需要用SPI或者并行接口即可。


一、AD2S1210工作原理

AD2S1210是一款10位至16位分辨率旋变数字转换器,集成片上可编程正弦波振荡器,为旋变器提供正弦波激励。 转换器的正弦和余弦输入端允许输入3.15 V p-p ± 27%、频率为2 kHz至20 kHz范围内的信号。Type II伺服环路用于跟踪输入信号,并将正弦和余弦输入端的信息转换为输入角度和速度所对应的数字量。在编码器分辨率为10位时,跟踪速率最大,其最大跟踪速率为3125 rps。

1.旋变信号

首先介绍一下旋转变压器的工作原理。旋转变压格式信号是旋转变压器能工作的基础条件,
经典旋转变压器与可变磁阻旋转变压器

上图是经典旋转变压器与可变磁阻旋转变压器。旋变器是一种旋转变压器,通常配置是初级绕组位于转子上,两个次级绕组则位于定子上。不过,可变磁阻旋变器的转子上不存在绕组,如上图所示。初级绕组和次级绕组均位于定子上,但转子的特殊设计使得次级耦合随着角位置变化而发生正弦变化。无论何种配置,旋变输出电压(S3 − S1, S2 − S4)的计算公式均相同,如下面的公式所示。
在这里插入图片描述
其中:
θ为轴角,即转子的机械角度。
Sinωt为转子激励频率。
E0为转子激励幅度。

两个定子绕组机械错位90°。初级绕组采用交流基准源激励。随后在定子次级绕组上的耦合的幅度是转子(轴)相对于定子的位置的函数。因此,旋变产生由轴角的正弦和余弦调制的两个输出电压(S3 − S1, S2 − S4)。旋变格式信号是指从旋变输出获得的信号,如上述公式所示。下图是次级绕组输出的变化电压。
在这里插入图片描述
上图中的三个信号分别是,电机在旋转过程中产生的余弦电压和正弦电压,其相位差为90度,并随着转子的位置而周期的变化,最后一个是AD2S1210编程产生并经过缓冲放大电路产生的激励电源(基准电压)。
值得注意的是:这里的基准电压(REF),应该是R1-R2两端的电压。 横坐标指示的0-360°指的是电机的机械角度;以sin的电压波形为例,其在0-360°内产生两个周期的电压波形,这里的一个周期代表了电机旋转过程中电角度的0-360°,显然,这个例子中正弦变化的包络为一个周期,由此可以得出旋转变压器的极对数为 1 。即旋变的电角度=极对数*机械角度

2.旋变-数字转换

AD2S1210按照Type II跟踪闭环原理工作。输出连续跟踪旋变的位置角,而不需要外部转换和等待状态。当旋变的位置旋转了相当于最低有效位的角度时,输出更新1 LSB。 转换器产生输出角ϕ,反馈后与输入角θ进行比较,借此来达到跟踪轴角θ的目的;两个角度之差即为误差,如果转换器正确跟踪输入角,误差趋于0。为了测量误差,将S3-S1乘以cosϕ,并将S2-S4与sinϕ相乘。
在这里插入图片描述
二者的差值为:
在这里插入图片描述
利用内部产生的合成基准信号来解调该信号,得到下式:
在这里插入图片描述
公式3等效于E0sin(θ − ϕ);当θ − ϕ的值(角误差)较小时,E0sin(θ − ϕ)约等于E0(θ − ϕ)
E0(θ − ϕ)是转子的角度与转换器的数字角输出之间的差值。Type-II跟踪环路消除了误差信号,完成该操作后,ϕ等于旋转角θ 。
一个闭环系统由一个相位敏感的解调器、一些积分器和一个补偿滤波器形成,它可以将误差信号归零。当该目标得以实现时,在转换器的额定精度范围内,ϕ等于旋变器角度θ。之所以使用Type II跟踪环路,是因为它能跟踪恒定速度输入,而不存在固有误差。
综合以上的分析,下方给出了AD2S1210的工作原理图:

在经过滤波之后,得到的sin(θ − ϕ)实质上就是加速度信息,对其进行积分后可以得到速度信息,在对速度进行积分后可以得到位置信息。这是完整得工作流程,从滤波开始实质上就是TYPE-II跟踪环路的部分。下面将对TYPE-II跟踪环路进行讲解。

3.TYPE-II跟踪环路

大部分RDC使用Type-II跟踪环路计算位置和速度。Type-II环路采用二阶滤波器,确保静止或恒定速度输入信号的稳态误差为零。RDC对两路输入信号进行同步采样,为跟踪环路提供数字化数据。
相比Type-I环路,Type-II跟踪环路的优势是恒定速度下不会产生位置误差。然而,哪怕再完美平衡的系统中,加速度也会产生误差项。加速度产生的误差量由控制环路响应确定。下图显示AD2S1210 的环路响应。

其中,环路系数随分辨率、输入信号幅度和采样周期的变化而改变。AD2S1210 在每个CLKIN周期中进行两次采样。
其中各参数的意义如下:
k1:ADC增益
k2:误差增益
a:补偿器零点系数
b:补偿器极点系数
C:积分器增益
T:采样周期
第一个积分器产生一个与速度成比例的信号。补偿滤波器包含一个极点和一个零点,用于提供相位裕量并减小高频噪声增益。第二积分器与第一积分器相同,用于从速度信号产生位置输出。环路加速度常数Ka可以表示为:

加速度产生的跟踪误差便可计算如下:

二、程序设计部分

1.初始化

代码如下:

    //AD2S1210初始化设置
    void AD2S1210Init()
    {
    	GpioInit();//引脚初始化
    	AD2S1210Reset();//上电复位
        RegisterInit();//寄存器初始化
    }

初始化部分主要是引脚的初始化,上电复位(为了保证上电电压稳定,具体的时序图在手册中是有的,对于芯片的使用问题不大),寄存器的初始化(相对比较重要,包括分辨率的选择需要与外部的硬件电路相匹配,LOT,DOS等阀值的上下限,超调,失配的阀值等等).

2.向AD2S1210中写入数据

代码如下:

    void WriteToAD2S1210(unsigned char address, unsigned char data)
    {
        unsigned    char    buf;
        /*******************第一次写入,写入地址**************************/
        buf = address;
        SET_SCLK();
        delay(1);
        SET_CS();
        delay(1);
        CLR_CS();
        delay(1);
        SET_WR();
        delay(1);
        CLR_WR();
        delay(1);
        SPIWrite(1,&buf);
        SET_WR();
        delay(1);
        SET_CS();
        /*******************第二次写入,向寄存器写入数据**************************/
        buf = data;
        SET_SCLK();
        delay(1);
        SET_CS();
        delay(1);
        CLR_CS();
        delay(1);
        SET_WR();
        delay(1);
        CLR_WR();
        delay(1);
        SPIWrite(1,&buf);
        SET_WR();
        delay(1);
        SET_CS();
    }

以上是向AD2S1210写入八位数据的代码示例,首先写入8位的地址,在写入8位的数据,治得说明的是写入数据时需要提前进入配置模式,也就是将A0,A1的引脚电平抬高.SPIWrite(1,&buf)中的1是写入的9位数据个数,buf是函数内定义的无符号字符型数据,取其首地址开始的8位数据写入AD2S1210的寄存器.

3.从AD2S1210中读取数据

代码如下:

    //从AD2S1210寄存器中的读取数据
    //mode:读取的模式   address:需要读取的寄存器地址   buf:存储从寄存器读取出数据的数组
    void ReadFromAD2S1210(unsigned char mode, unsigned char address, unsigned char * buf)
    {
    	//如果读取的时候使用的是配置模式,那么需要写入对应的寄存器地址,再读取该寄存器的数据
        if (mode==CONFIG)
        {
        	SET_SPL();
            delay(1);
            CLR_SPL();
            delay(5);//更新输出寄存器
        	AD2S1210SelectMode(CONFIG); //寄存器初始化时选择配置模式,从而能向寄存器写入数据
            buf[0] = address;
            //写入寄存器的地址
            SET_SCLK();
            delay(1);
            SET_CS();
            delay(1);
            CLR_CS();
            delay(1);
            SET_WR();
            delay(1);
            CLR_WR();
            delay(1);
            SPIWrite(1,buf);
            buf[0]&=0x00;
            SET_WR();
            delay(1);
            SET_CS();
            //读取寄存器的数据8位
            SET_SCLK();
            SET_CS();
            SET_WR();
            delay(1);
            CLR_CS();
            delay(1);
            CLR_SCLK();
            delay(1);
            CLR_WR();
            delay(1);
            SPIRead(1,buf);
            SET_WR();
            delay(1);
            SET_CS();
        }
        }

以上是从AD2S1210读取八位数据的代码示例,我使用的是配置模式下读取数据.首先需要写入读取数据的寄存器地址,然后使用SPIRead(1,buf)函数读取一个数据到buf数组中,值得说明的是,配置模式下连续读取位置和速度寄存器的数据也需要更新输出缓冲器,即使得位置和速度数据转移到输出寄存器中.


总结

在实际的数据处理中,虽然我在DSP的程序中使用的数据读取和写入都是8位的无符号型,但是在CCS的观测器中观察该变量地址的数据时,依旧会出现8位以上数据的情况,但是在数据移位处理之后的情况下,数据反而是正常的(相对,因为无法验证是否正确).
举个例子:使用16位的编码器分辨率. 转子停止运行的时候,转子速度为0,使用CCS观测到的一个高8位的速度寄存器数据为01FE,低8位的速度寄存器的数据为0x1FC.但实际上我的数据应该是8位的才对,经过数据处理之后=>高八位给一个无符号16位的变量=>左移八位=>加上低八位组成的新的16位数据,其中第一位是方向位,其他15位为速度的补码形式.组合而成的数据为0xFFFD,非常接近0xFFFF,即接近于速度为0.这个结果是我愿意看到的.但是如果在数据转换过程中只看8位数据,即忽略那给高位的1,数据误差就很大了!!!


终于发现这个问题的原因了,是因为我使用的是模拟SPI读取SDO引脚的状态电平,读取八次后放在了一个8位变量中,但是由于在最后一个读取完成后,8位变量依旧进行了左移一位的操作,导致FF的8位数据变成了1FE,虽然变量是8位的,但实际存储的地址上的数据格式是16位的,所以第9位上也就产生了数据。 之前怀疑过,是否是寄存器读取的问题,但没考虑到是赋值时候出了问题,还考虑过是否寄存器本身读取出来就是这样的,以及CCS观测时显示的是16位的补码,但在一次次的实践中,都排除了这些可能性。最终回归代码发现了这个问题。 另外还有一点值得说明的是,在普通模式下连续读取8位数据时,每次读完一次8位数据,WR引脚都需要产生脉冲以读取下一个8位数据。

2022年3月8日补充

距离这条博客写完已经一年多了,期间非常多的朋友向我询问硬件以及软件的相关要点,出于利益和保护没有告知。
经过一段时间的硬件和软件设计,目前的旋变使用更加稳定和可靠,硬件和软件都可以出售,毕竟涉及到一些问题,所以不是开源的。有需要的朋友可以跟我私聊咨询。
另外可以通过硬创社或者CSDN的资源购买相关原理图和代码资源。
硬创社:https://x.jlc.com/platform/detail/639d0ff472064d869af2ba935c8c0029
附上一些板子的图片。
在这里插入图片描述
在这里插入图片描述


2022年3月31日补充

最近也是接到了很多人的一些咨询,比较多的人有一种应用方向是把AD2S1210作为一个解调芯片,然后实际解算位置信息并不是通过与该芯片通讯读取寄存器的方式,而是直接读取芯片的ABZ信号。当然了,这也是官方给出的一种应用方式。那么理想的情况就是设计好解调芯片的电路后,上电就去直接读取ABZ信号,这里会有两个小问题:
1.官方是给了可以修改ABZ的分辨率的,同样也分为10位、12位、14位、16位,分别对应256线、1024线、4096线、16384线。我们可以通过通讯芯片来配置编码器的分辨率,但是这个分辨率不得高于数字输出的分辨率。如果想直接上电就用,也就是不对芯片进行通讯配置,一切按默认的走,那么这个频率又是多少呢?目前我在实际使用的情况下,数字分辨率为12位、14位以及16位时,编码器的分辨率都是16位,也就是16384线。这种情况与通过通讯配置有点不同,不过也是自己直接测试得到的,并没有官方的理论依据,大家可以做个参考。当然,实际的线数与你的旋变具体的型号,类型也是有关系的。
2.AD2S1210解算出来的ABZ信号是单端的,并不是我们常见的差分信号,如果将单端信号经过差分转单端的芯片,例如AM26LV32是存在问题的,其逻辑变换会由于差分的负端一直为0而造成问题,这点要尤其注意。
在这里插入图片描述

  • 49
    点赞
  • 327
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 54
    评论
AD2S1210C是一款具有高精度的模拟到数字转换器(ADC),主要用于测量角度和速度。要配置AD2S1210C,需要完成以下几个步骤。 首先,连接AD2S1210C到单片机或其他控制器。将AD2S1210C的引脚与控制器的相应引脚连接,确保连接正确并稳固。 接下来,打开控制器的编程环境,并创建一个新的工程。在工程中,包含AD2S1210C的驱动程序或库文件。 初始化AD2S1210C的配置寄存器。通过读写相应的寄存器,设置AD2S1210C的工作模式和参数。例如,可以设置采样率、信号增益、滤波器的带宽等。 配置ADC的输入选择。AD2S1210C可以选择不同的输入引脚,用于测量不同的角度或速度信号。通过配置寄存器设置所需的输入引脚。 设置测量范围和分辨率。AD2S1210C具有可调的测量范围和分辨率,可以根据应用需求进行配置。通过设置寄存器,选择适当的测量范围和分辨率。 配置数据输出格式。AD2S1210C可以以二进制补码、二进制直接码等格式输出测量结果。通过设置寄存器选择所需的输出格式。 校准AD2S1210C。为了确保测量结果的准确性和稳定性,需要对AD2S1210C进行校准。可以使用标准信号或基准器进行校准,并根据校准结果进行相应的校准参数设置。 最后,启动AD2S1210C的测量功能。通过设置相应的寄存器,启动AD2S1210C开始进行测量。 配置完成后,可以通过读取AD2S1210C的输出寄存器,获取测量结果。根据应用需求,可以将测量结果进行进一步处理和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LEODWL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值