打印
[FPGA]

绝对式编码值转换为增量式脉冲数据

[复制链接]
2320|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andous|  楼主 | 2013-8-9 12:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
绝对式编码器原理
绝对型旋转光电编码器,因其每一个位置绝对唯一、抗干扰、无需掉电**,已经越来越广泛地应用于各种工业系统中的角度、长度测量和定位控制。
绝对编码器光码盘上有许多道刻线,每道刻线依次以2线、4线、8线、16线。。。。。。编排,这样,

  
在编码器的每一个位置,通过读取每道刻线的通、暗,获得一组从2的零次方到2的n-1次方的唯一的2进制编码(格雷码),这就称为n位绝对编码器。这样的编码器是由码盘的机械位置决定的,它不受停电、干扰的影响。绝对编码器由机械位置决定的每个位置的唯一性,它无需**,无需找参考点,而且不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置。这样,编码器的抗干扰特性、数据的可靠性大大提高了。
由于绝对编码器在定位方面明显地优于增量式编码器,已经越来越多地应用于工控定位中。绝对型编码器因其高精度,输出位数较多,如仍用并行输出,其每一位输出信号必须确保连接很好,对于较复杂工况还要隔离,连接电缆芯数多,由此带来诸多不便和降低可靠性,因此,绝对编码器在多位数输出型,一般均选用串行输出或总线型输出,德国生产的绝对型编码器串行输出最常用的是SSI(同步串行输出)。
旋转单圈绝对式编码器,以转动中测量光码盘各道刻线,以获取唯一的编码,当转动超过360度时,编码又回到原点,这样就不符合绝对编码唯一的原则,这样的编码器只能用于旋转范围360度以内的测量,称为单圈绝对式编码器。
如果要测量旋转超过360度范围,就要用到多圈绝对式编码器。

  
编码器生产厂家运用钟表齿轮机械的原理,当中心码盘旋转时,通过齿轮传动另一组码盘(或多组齿轮,多组码盘),在单圈编码的基础上再增加圈数的编码,以扩大编码器的测量范围,这样的绝对编码器就称为多圈式绝对编码器,它同样是由机械位置确定编码,每个位置编码唯一不重复,而无需**。

多圈编码器另一个优点是由于测量范围大,实际使用往往富裕较多,这样在安装时不必要费劲找零点,将某一中间位置作为起始点就可以了,而大大简化了安装调试难度。
多圈式绝对编码器在长度定位方面的优势明显,已经越来越多地应用于工控定位中。

FPGA逻辑设计方案
目录
1.       设计要求
2.       方案
1.       设计要求

板子资源主要有:
l  27M晶振;
l  FPGA ;
l  电平耦合电路;
l  电源部分;
27M晶振:
功能1:作为SPI接口参考时钟。
功能2:作为内部系统时钟。
功能3:倍频后作为ABZ的四倍频参考时钟。
编码器速率的计算:
SPI口 16位绝对数据的最大变化率为21.84533P/us(按编码器输出数据看,最高转速为20000转/分,一转2^16分辨率,则20000*2^16/60/10^6=21.84533P/us)。
则时钟要求是1us*1000/21.84533P = 45.77637ns。
ABZ需要四倍频,所有时钟周期最小45.77637/4 = 12ns
如果需要这个时钟,可以用FPGA内部的PLL倍频得到。
FPGA
以根据需要调整芯片。也可以用CPLD。相关芯片信息咨询Xilinx、Altera以及lattice等厂商。
电平耦合电路:FPGA芯片的IO电平标准是LVTTL或者LVCMOS33或者25, FPGA IO电平是3.3V或者2.5V。如果要转换成其他电平,这里需要耦合电路。
    电源部分:包括FPGAIO电压、辅助电压以及核电压。

1.       方案
FPGA设计结构图:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.gif
1SPI RX模块
FPGA接收是SPI接口,做个SPI slave模块,用来采集来自MCU的SPI数据。
当状态机接收到一帧SPI数据,状态机完成脉冲作为一次数据的更新。将采集的16位SPI数据传输给下一模块做处理。
2:缓冲模块RX_BUF
对接收的数据进行缓冲处理。缓冲三个数据以及相应的周期值。根据这些值和时钟的情况,计算出ABZ所占的脉宽。将这些信息输出给信息处理模块。
3:信息处理模块infm_proc
脉宽计算式
首先计算出两次SPI数据差的绝对值。
ABZ_COUNT= |data_pre - data_cur |
用ref_clk计算出,两次SPI更新的时间间隔,单位是ref_clk的周期。ref_count
那么脉宽W_ABZ= ref_count / ABZ_COUNT。
规定基点:
上次值数据Bit[15:14]是 2’b11 ,当前接收值是Bit[15:14]2’b00, 高位从11 变为 00.在这个范围内有“0”点。计数到0xffff时。输出Z相。
比如上次的值0xFFC0,当前接收的值是0x0087,在0xFFC0基础上,当输出到0XFFFF-0XFFC0个脉冲的时候,把Z相发出。
确定方向:
对数据进行比较,上一次数据计做data_pre,当前更新数据计做data_cur。
如果data_cur大于data_pre,则判断是顺时针。输出A比B前向90°
如果data_cur小于data_pre,则判断是逆时针。输出B比A前向90°
根据缓冲的数据,有得到的周期值,可以判断出AB相的宽度,这个宽度就是均匀分布的AB相的宽度。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.gif

4:ABZ编码器模块。
有PLL得到相应的时钟,根据ABZ编码器规则,生成ABZ编码器。
得到ABZ真值表.
  
顺时针
  
逆时针
  
AB
  
AB
  
11
  
11
  
01
  
10
  
00
  
00
  
10
  
01
    


相关帖子

沙发
ghs_2013| | 2013-8-9 18:19 | 只看该作者
楼主精辟的**啊,肯定做过了
我正在找这样的解决方案,收藏了。
ABZ编码器

使用特权

评论回复
板凳
ghs_2013| | 2013-8-9 18:20 | 只看该作者
楼主哪里啊?

使用特权

评论回复
地板
andous|  楼主 | 2013-8-12 12:44 | 只看该作者
是的,北京

使用特权

评论回复
5
andous|  楼主 | 2013-8-14 17:49 | 只看该作者
:)

使用特权

评论回复
6
y595906642| | 2013-8-15 11:16 | 只看该作者
做了一个和楼主类似的东西,并口编码器输入,AB相输出。

使用特权

评论回复
7
andous|  楼主 | 2013-8-15 13:09 | 只看该作者
:D呵呵,那应该差不多。
拿出来给大家分享。

使用特权

评论回复
8
andous|  楼主 | 2014-1-2 12:33 | 只看该作者
:(:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

275

帖子

8

粉丝