-
图文详情
-
产品属性
-
相关推荐
光电编码器简介
光电编码器(Optical Encoder)俗称“单键飞梭”,其外观好像一个电位器,因其外部有一个可以左右旋转同时又可按下的旋钮,很多设备(如显示器、示波器等)用它作为人机交互接口。
光电编码器原理
光电编码器是利用光栅衍射原理实现位移-数字变换,通过光电转换,将输出轴上的机械几何位移量转换成脉冲数字量的传感器.
常见的光电编码器由光栅盘,发光元件和光敏元件组成.光栅实际上是一个刻有规则透光和不透光线条的圆盘,光敏元件接收的光通量随透光线条同步变化,光敏元件输出波形经整形后,变为脉冲信号,没转一圈,输出一个脉冲.根据脉冲的变化,可以测量和控制设备位移量
光电编码器的应用电路
EPC-755A光电编码器的应用
EPC-755A光电编码用具备良好的使用性能,在角度丈量、位移丈量时抗干扰能力很强,并具有稳定可靠的输出脉冲信号,且该脉冲信号经计数后可得到被丈量的数字信号。因此,我们在研制汽车驾驶模拟器时,对方向盘旋转角度的丈量选用EPC-755A光电编码器作为传感器,其输出电路选用集电极开路型,输出分辨率选用360个脉冲/圈,考虑到汽车方向盘转动是双向的,既可顺时针旋转,也可逆时针旋转,需要对编码器的输出信号鉴相后才能计数。图2给出了光电编码器实际使用的鉴相与双向计数电路,鉴相电路用1个D触发器和2个与非门组成,计数电路用3片74LS193组成。
当光电编码器顺时针旋转时,通道A输出波形超前通道B输出波形90°,D触发器输出Q(波形W1)为高电平,Q(波形W2)为低电平,上面与非门打开,计数脉冲通过(波形W3),送至双向计数器74LS193的加脉冲输进端CU,进行加法计数;此时,下面与非门封闭,其输出为高电平(波形W4)。当光电编码器逆时针旋转时,通道A输出波形比通道B输出波形延迟90°,D触发器输出Q(波形W1)为低电平,Q(波形W2)为高电平,上面与非门封闭,其输出为高电平(波形W3);此时,下面与非门打开,计数脉冲通过(波形W4),送至双向计数器74LS193的减脉冲输进端CD,进行减法计数。
汽车方向盘顺时针和逆时针旋转时,其旋转角度均为两圈半,选用分辨率为360个脉冲/圈的编码器,其输出脉冲数为900个;实际使用的计数电路用3片74LS193组成,在系统上电初始化时,先对其进行复位(CLR信号),再将其初值设为800H,即2048(LD信号);如此,当方向盘顺时针旋转时,计数电路的输出范围为2048~2948,当方向盘逆时针旋转时,计数电路的输出范围为2048~1148;计数电路的数据输出D0~D11送至数据处理电路。
实际使用时,方向盘频繁地进行顺时针和逆时针转动,由于存在量化误差,工作较长一段时间后,方向盘回中时计数电路输出可能不是2048,而是有几个字的偏差;为解决这一题目,我们增加了一个方向盘回中检测电路,系统工作后,数据处理电路在模拟器处于非操纵状态时,系统检测回中检测电路,若方向盘处于回中状态,而计数电路的数据输出不是2048,可对计数电路进行复位,并重新设置初值。
光电编码器在重力丈量仪中的应用
采用旋转式光电编码器,把它的转轴与重力丈量仪中补偿旋钮轴相连。重力丈量仪中补偿旋钮的角位移量转化为某种电信号量;旋转式光电编码器分两种,尽对编码器和增量编码器。
增量编码器是以脉冲形式输出的传感器,其码盘比尽对编码器码盘要简单得多且分辨率更高。一般只需要三条码道,这里的码道实际上已不具有尽对编码器码道的意义,而是产生计数脉冲。它的码盘的外道和中间道有数目相同均匀分布的透光和不透光的扇形区(光栅),但是两道扇区相互错开半个区。当码盘转动时,它的输出信号是相位差为90°的A相和B相脉冲信号以及只有一条透光狭缝的第三码道所产生的脉冲信号(它作为码盘的基准位置,给计数系统提供一个初始的零位信号)。从A,B两个输出信号的相位关系(超前或滞后)可判定旋转的方向。由图3(a)可见,当码盘正转时,A道脉冲波形比B道超前π/2,而反转时,A道脉冲比B道滞后π/2。图3(b)是一实际电路,用A道整形波的下沿触发单稳态产生的正脉冲与B道整形波相‘与’,当码盘正转时只有正向口脉冲输出,反之,只有逆向口脉冲输出。因此,增量编码器是根据输出脉冲源和脉冲计数来确定码盘的转动方向和相对角位移量。通常,若编码器有N个(码道)输出信号,其相位差为π/ N,可计数脉冲为2N倍光栅数,现在N=2。图3电路的缺点是有时会产生误记脉冲造成误差,这种情况出现在当某一道信号处于‘高’或‘低’电平状态,而另一道信号正处于‘高’和 ‘低’之间的往返变化状态,此时码盘固然未产生位移,但是会产生单方向的输出脉冲。例如,码盘发生抖动或手动对准位置时(下面可以看到,在重力仪丈量时就会有这种情况)。
TD> TR> 增量光电编码器基本波形和电路图
四倍计数计数方式的波形和电路图
上图是一个既能防止误脉冲又能进步分辨率的四倍频细分电路。在这里,采用了有记忆功能的D型触发器和时钟发生电路。由图4可见,每一道有两个D触发器串接,这样,在时钟脉冲的间隔中,两个Q端(如对应B道的74LS175的第2、7引脚)保持前两个时钟期的输进状态,若两者相同,则表示时钟间隔中无变化;否则,可以根据两者关系判定出它的变化方向,从而产生‘正向’或‘反向’输出脉冲。当某道由于振动在‘高’、‘低’间往复变化时,将交替产生‘正向’和‘反向’脉冲,这在对两个计数器取代数和时就可消除它们的影响(下面仪器的读数也将涉及这点)。由此可见,时钟发生器的频率应大于振动频率的可能值。由图4还可看出,在原一个脉冲信号的周期内,得到了四个计数脉冲。例如,原每圈脉冲数为1000的编码器可产生4倍频的脉冲数是4000个,其分辨率为0.09°。实际上,目前这类传感器产品都将光敏元件输出信号的放大整形等电路与传感检测元件封装在一起,所以只要加上细分与计数电路就可以组成一个角位移丈量系统(74159是4-16译码器)。 本篇文章来由电子网收集整理转载请以链接形式注明出处 网址:https://dz.siaaa.com/read.php?tid-459715-fpage-1.html
光电编码器驱动程序的设计
光电编码器与S3C2410的硬件接口
光电编码器与S3C24lO的接口电路如图4所示。光电编码器的A、B相为集电极开路输出,由于S3C2410的I/O口电平为3.3 V,所以将其通过的EINT0和EINT1上;将Pl直接接到3.3V,P2通过电阻下拉到GND。当旋钮按下时,P2口输出为高电平,否则输出为低电平。
工作状态下,将EINTO、EINTl配置成上升沿和下降沿均触发的外部中断,将EINT2配置成上升沿触发的中断,旋钮按下时EINT2引脚产生上升沿触发中断。
外部中断初始化及中断服务程序的编写
首先必须完成CPU的I/O口和中断的初始化工作,然后再编写中断处理程序。具体分为4个步骤:
- 初始化I/O口。在Port[_]Init()函数中,将EINT0和EINTl初始化为上升沿和下降沿均触发的中断。将EINT2初始化为上升沿触发的中断。
- 添加中断号。在oalint.h下添加光电编码器中断向量的宏定义。代码为#define SYSINTR[_]OED(SYSINTR[_]FIRMWARE+20)
- 添加中断的初始化、禁止、复位等函数,分别在OEMInterruptEnable()、OEMInterruptDisable()、OEM-InterruptDone()等函数中加入相关代码。
- 返同中断标识,由OEMInterruptHandler()函数返回中断标识(SYSINTR[_]OED)。
编写流接口驱动程序
Windows CE.net把中断处理分成两个部分:中断服务程序(ISR)和中断服务线程(IST)。TSR通常要求越短、越快越好,它的任务就是返回中断标识。正由于ISR很小,只能做少量的处理,因此中断处理器就调用IST执行大多数的中断处理。中断服务线程(IST)在从waitForSingleObject()函数得到中断已经发生的信号前一直保持空闲;当接收到中断信号后,它就在本机设备驱动程序的PDD层调用子程序,这些程序反过来访问硬件以获得硬件的状态。IST使用InterruptInitialize()函数来注册自己,然后使用WaitForSingleObject()函数等待中断信号。如果这时中断信号到来,则应将光电编码器的状态记录下来,保存在变量OED[_]Status中。OED[_]Status=1表示旋钮按下,OED[_]Status=2表示旋钮逆时针旋转,OED[_]Status=3表示旋钮顺时针旋转。
这里还有一种比较简单的鉴相规则,具体步骤是,当创建线程时读出EINTl的电平状态并保存在变量PreEINTl中,每次中断到来时首先判断EINT2是否为高电平。如果为高电平,则说明按钮按下;如果EINT2为低电平,则判断EINTO电平是否与PreEINTl相同。如果相同,则说明旋钮逆时针旋转;反之,旋钮顺时针旋转,判断的流程如图5所示。
光电编码器鉴相流程框图
Windows CE流接口驱动程序模型要求驱动程序开发者编写10个接口函数,针对光电编码器的驱动主要应完成设备初始化和数据读取2个函数的编写。WindowsCE设备文件名前缀由3个大写字母组成,操作系统使用这3个字母来识别与流接口驱动程序相对应的设备。这里定义设备文件名前缀为“OED”(Optical Encoder),其中设备初始化函数OED[_]Init()在Windows CE装载驱动程序时用于创建中断事件和中断服务线程。在函数OED[_]Read()中将光电编码器的状态(OED[_]Status)返回。
封装驱动程序并加入到WinCE中
根据上述方法编译出动态链接库(DLL)还不够,因为它的接口函数还没有导出,还需要告诉链接程序输出什么样的函数,因此必须建立一个后缀名为def的文件。在本设计中为OpticalEnccder.def。下面是此文件的内容:
一个具体的流接口驱动程序和注册表是密不可分的。向WinCE内核添加注册表项的方法有两种:一种是直接修改Platform Builder下的reg文件;另一种是自己编写一个注册表文件,通过添加组件的方法将动态链接库文件添加到内核中。这里用第2种方法,将OpticalEncoder.dll添加到内核中。编写的注册表文件内容如下:
后编写一个CEC文件,完成对定制内核注册表部分的修改并将OpticalEncoder.dll添加到系统内核中去,然后在Platform Builder中就可以直接添加已经编写好的驱动程序了。