摘 要:介绍了一种基于FPGA的圆光栅编码器数据采集系统的设计方法。通过分析圆光栅的实际工作情况,将系统分为三大模块,详细阐述了滤波模块实现消除高频信号干扰,计数模块实现四倍频、辨向与脉冲计数,以及数据通信模块实现跨时钟域数据传输功能的具体方法。最后通过Modelsim仿真验证了系统设计的可行性与可靠性。本系统具有高集成、可扩展、便于移植的特点,可广泛应用于相关领域。
关键词:现场可编程门阵列;圆光栅;数字滤波;脉冲计数;跨时钟域
光电式旋转编码器是检测转速或转角的元件,旋转编码器与电动机相连,当电动机转动时,带动编码器旋转,产生转速或转角信号。旋转编码器可分为绝对式和增量式两种[1]。
圆光栅作为增量式光电编码器的一种,以其体积小、精度高、响应速度快、价格相对较低以及性能稳定等优点,被广泛应用到光电经纬仪、机器人、数控机床和高精度闭环调速系统等诸多领域。
现场可编程门阵列FPGA(Field Programmable Gate Array)是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物[2],它既继承了ASIC的大规模、高集成度及高可靠性的优点,又克服了普通ASIC设计周期长、成本大和灵活性差的特点,可以方便地实现对电路的重新设计或修改、完成复杂的时序和组合逻辑电路功能,增强了系统的灵活性、通用性和可靠性。
本文以FPGA为开发平台,设计了一种圆光栅数据采集系统,并详细介绍了该系统的实现方法。该方法充分利用FPGA大规模逻辑资源、高集成度、高稳定性且易编程的特点,完成了对圆光栅输出信号的滤波、计数及数据传输功能。
1 系统相关原理及结构
增量式圆光栅编码器一般有A相、B相及Z相3个输出。A相、B相信号包含了圆光栅编码器的旋转方向、旋转速率等信息。当圆光栅编码器被检测对象带动旋转时,会输出相位差为90°的A相和B相两路数字脉冲信号[3],如图1所示。当圆光栅编码器顺时针正向旋转时,A相信号的相位超前B相信号90°;当圆光栅编码器逆时针反向旋转时,则B相信号超前A相信号90°。A相和B相输出的脉冲个数与被测角位移变化量成线性关系。Z相信号功能主要是用于测量的同步或调零,光电角度编码器每旋转一圈,输出一个Z相脉冲信号[4]。利用Z相信号,可以矫正系统的计数数据,有效地消除系统的累计误差。
本文根据圆光栅编码器的工作原理,采用自顶向下的设计思想,设计了一种有效的圆光栅编码器脉冲信号数据采集系统。其结构原理图如图2所示,系统分为滤波模块、计数模块及数据通信模块三大模块。其中,滤波模块的主要功能是消除高频干扰脉冲对系统计数的影响,保证计数的准确性;计数模块主要完成4倍频、辨向和计数功能;数据通信模块主要负责将数据传输到FPGA外部其他数据处理芯片,避免跨时钟域数据传输带来的各种不利影响。
2 系统设计
2.1 滤波模块的设计
由于工业现场存在各种不确定性因素,圆光栅数据输出容易受到干扰,其中最显著的是运动过程中的机械振动和现场环境中的电磁干扰。这两者均会使圆光栅编码器的输出脉冲产生高频脉冲毛刺,导致脉冲计数错误,从而严重影响测量精度[5]。图3给出了干扰波形的示意图,这种干扰一般发生在A相信号或者B相信号的电平发生改变时。从图3中正转干扰图可以看到,当圆光栅正转时,A相信号和B相信号先后从低电平跳变为高电平,且B相信号落后90°。此时,由于机械振动,A相信号产生了高频脉冲输出,即A相信号的电平在相对较短的时间内变化了5次。根据编码器信号输出关系可知,第1、3、5次电平变化代表了圆光栅编码器正转;而2、4次电平变化则代表着圆光栅编码器的反转,这些高频干扰脉冲影响了计数和测量的正确性。
由于干扰所产生的脉冲频率一般都远高于圆光栅正常工作时所输出的脉冲频率,因此本文采用了一种高频数字计数滤波方法。即在已知系统最高转速的情况下,根据所使用圆光栅的刻线数,计算出最高转速下圆光栅输出的脉冲频率,并以此频率为临界点,将频率高于这个临界点的脉冲视为干扰脉冲滤除。
例如,电机带动圆光栅转动的最高速度为20 r/min,圆光栅输出信号经过读数头处理后,每转输出6×106个脉冲,有效脉冲最高频率应为2 MHz。FPGA工作时钟设定为50 MHz,则一个光栅信号有效脉冲的高电平或者低电平至少应持续12个FPGA工作时钟。持续时间低于12个工作时钟的脉冲超出了最高转速所能产生的脉冲频率,因此被视为干扰脉冲并予以滤除;持续时间大于等于12个工作时钟的脉冲将被输送到FPGA的脉冲计数单元。利用这种方法可有效去除高频脉冲干扰对计数的影响,保证系统的测量精度。
2.2 计数模块的设计
目前,常见的增量式光电编码器数据采集系统均采用4倍频或二倍频的方法来提高测量精度。而一般系统所采取的方法是将A相信号与B相信号进行异或运算,所得的结果即为经过二倍频的信号;若要得到4倍频,则需要再进行一步异或运算。该方法的优点是实现简单,而缺点是对器件和编码器输出信号有比较苛刻的要求。在时序逻辑上,A相信号和B相信号必须满足器件建立和保持的时间要求,这样就限制了器件所能实现的工作频率,影响了整个系统的实时性。
而在辨识编码器转动方向上,一般系统都是将A相信号(或者B相信号)作为基准信号,在其电平变化的时刻判断B相信号(或者A相信号)电平的正负,以此来进行方向辨识与脉冲计数。这种方法抗干扰能力差,外界干扰所产生的脉冲会很容易使方向判别错误,同时导致脉冲计数错误,产生随机误差,对整个系统的精度和准确度造成巨大影响。
本系统充分分析了增量式圆光栅编码器信号输出的逻辑关系,设计了一种以有限状态机为核心的计数模块,来完成对编码器输出信号的4倍频、方向辨识及脉冲计数。如图4所示,将圆光栅输出信号A和B的正负用1和0表示,则A相信号和B相信号一共有A1B1、A1B0、A0B1、A0B0这4个状态组合。当圆光栅编码器输出状态按照A0B0→A1B0→A1B1→A0B1→A0B0这个顺序变化时,代表圆光栅编码器正转;当圆光栅编码器输出状态按照A0B1→A1B1→A1B0→A0B0→A0B1顺序时,代表圆光栅编码器反转。
计数模块内部利用两个寄存器分别存储当前状态和下一状态,当前状态和下一状态值相同时,状态机处在等待的状态且不进行任何操作;当圆光栅编码器输出信号A、B发生变化时,计数模块会将其存储到下一状态寄存器中。由于圆光栅编码器可能在任意时刻改变转动方向,而有限状态机也可以根据A相及B相信号相应的逻辑关系及两个寄存器中的状态值来判断出当前的状态变化所代表的编码器的转动方向,并进行相应的加或减运算。然后将下一状态寄存器中的值赋给当前状态寄存器,此时,两个寄存器中值再次相同,有限状态机等待下一次A或B信号的改变触发下一次操作。至此,完成了编码器转动方向的辨识和脉冲计数。
由于A相信号和B相信号的电平变化均会引起有限状态机中两个状态寄存器的值不一致,从而触发状态机进行相应的操作,即在A相信号和B相信号的一个周期内,有限状态机会触发4次操作,完成了将信号进行4倍频的功能,这种方法不仅提高了系统的精度,还避免了将A相信号和B相信号进行异或运算所带来的问题。
2.3 数据通信模块的设计
本文采用IP核,将FPGA片内RAM资源生成的双端口RAM作为缓存,完成FPGA与其他处理芯片的数据交换[6]。必要时可以方便地修改IP核的一些参数,避免了修改硬件给系统带来的影响。此外,利用双端口RAM作为数据通信的缓存,可以有效克服跨时钟域数据传输过程中出现的问题,避免在数据传输过程中由亚稳态造成的数据传输错误。
在通信过程中,双端口RAM分为上下两个部分,上半部分为外部芯片数据流向FPGA;下半部分为FPGA数据流向外部芯片,数据流向图如图5所示。利用一个同步时钟来控制数据的传输,在同步时钟上升沿,触发FPGA内部逻辑模块和外部芯片分别向双端口RAM的上下部分同时写入数据;在同步时钟的下降沿,FPGA内部的读写逻辑模块和外部芯片分别读取上下双端口RAM中的数据。利用同步时钟控制数据的读写,能够防止因外部芯片和内部逻辑模块同时对双端口RAM的同一个存储单元进行操作所带来的数据冲突。
3 系统仿真实现与结果分析
本设计在ISE软件环境下进行,使用的芯片为Xilinx公司Spartan-3E系列的XC3S500E,利用Xilinx提供的IP核生成了双端口RAM。
采用Verilog HDL语言开发了滤波模块和脉冲计数模块,同时采用Synplify Pro综合工具进行综合并用Modelsim进行仿真验证。这样,系统可以方便地移植到其他器件平台上,提高了系统的通用性。
利用系统经过Synplify Pro综合后的RTL模块,可以在不修改模块间传输信号的情况下,单独对某一模块的修改不会造成整个系统的变动,同时还可以根据需要,充分利用FPGA并行处理的特性来扩展系统的其他功能。
图6为滤波模块利用Modelsim软件仿真得到的结果。其中,clk为系统工作时钟,其经过二分频后得到滤波模块的采样时钟out_sample;in_a与in_b为滤波模块的输入,out_a与out_b为模块输出。从图6中可以看到,输入信号in_a的上升沿触发了模块内部count_a_p进行采样计数。但在一些上升沿处,输入信号in_a发生了抖动,高电平时间没有持续6个采样时钟out_sample周期,因此抖动产生的上升沿无法引起模块输出信号out_a输出高电平。只有当输入信号in_a抖动结束且高电平持续了6个采样周期后,输出信号out_a才会输出高点平。同样,通过这种采样计数的方式,将输入信号in_b的下降沿处的抖动滤除。模块最终输出波形out_a及out_b符合正确计数的要求。尽管该方法输出相对于输入有12个时钟周期的延时,但这可以通过适当减少电平检验时钟数来降低。
图7和图8为计数模块的仿真波形图。从图7中可以看到,输入信号A、B电平的改变会引起计数模块中nstate_reg寄存器和state_reg中的状态值改变,模块根据相应的逻辑关系判断出圆光栅正转并进行+1操作。而当计数模块累加到设定的上限值2×106时,系统将不再增加计数,同时将信号add_limit置1,起到限位的作用。由图8中可以看到,圆光栅编码器从正转切换到反转,并且反向转动速度为正向转动的两倍时(信号A和信号B的频率增加了一倍),计数模块可以正确判断转向并进行计数。
本文以FPGA为平台设计了圆光栅编码器数据采集及传输一体化系统,仿真结果表明,该系统能够有效滤除干扰脉冲,准确无误地进行计数、辨向及数据传输。本文设计的数据采集系统可以极大地提高系统的集成度和灵活性,并可以便捷地进行功能扩展。同时,利用FPGA内部资源完成数据在芯片间的传输,保证了系统的稳定性和准确性。该方法可以推广应用到其他领域。
参考文献
[1] 阮毅,陈伯时.电力拖动自动控制系统[M].北京:机械工业出版社,2009.
[2] 覃松,梁庆.英国雷尼绍RENISHAW圆光栅测量原理及应用[J].轻工科技,2012(4):60,65.
[3] 王诚,吴继华,范丽珍,等.Altera FPGA/CPLD设计(基础篇)[M].北京:人民邮电出版社,2005.
[4] 王彩霞,李梅.基于FPGA的增量式光电角度编码器信号处理系统[J].微计算机信息,2010(23):125-126.
[5] 蓝箭.基于FPGA的光电编码器干扰消除方法[EB/OL].中国科技论文在线,2010-09-25.
[6] 张伟,包乌日吐,闫玉娥.FPGA内部块RAM的应用技巧[J].微处理机,2006(6):20-21.