旋转编码器编程原理实例.pdf

上传人:tbuqq 文档编号:4644431 上传时间:2019-11-23 格式:PDF 页数:7 大小:712.84KB
返回 下载 相关 举报
旋转编码器编程原理实例.pdf_第1页
第1页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《旋转编码器编程原理实例.pdf》由会员分享,可在线阅读,更多相关《旋转编码器编程原理实例.pdf(7页珍藏版)》请在三一文库上搜索。

1、旋转编码器编程原理实例 光电旋转编码器的原理及应用方法 时间: 2012-03-13 21:33:37 来源:作者: WinCE下光电编码器的驱动程序设计 近年来, 嵌入式技术发展迅速,嵌入式系统在各行各业得到了广泛的应用。然而, 由于 嵌入式计算机的专用性,系统的硬件、 软件结构千差万别,其输入设备也不再像通用计算机 那样单一。嵌入式计算机的输入没备一般有鼠标、键盘、触摸屏、按钮、旋钮等,而光电编 码器 ( 俗称“单键飞梭” ) 作为一种输入设备,由于其具有输入灵活,简单可靠等特点,因此 特别适合应用在嵌入式仪器和手持式设备上,整个系统可以只用一个键作为输入。触摸屏由 于其方便灵活、 节省空

2、间、 界面直观等特点也备受青睐,但存在寿命短,长时间使用容易产 生误差等缺点。如果用光电编码器辅助触摸屏作为输入设备,必将大大增强系统的可靠性, 使得人机接口更加人性化。但由于光电编码器并不是WinCE的标准输入设备,因此其驱动程 序在嵌入式操作系统Windows CE Platform Builder中并未给出。本文以三星公司 S3C2410(ARM9 芯片 ) 为 CPU的嵌入式系统开发板为平台,详细阐述了嵌入式操作系统WinCE 下光电编码器驱动程序的设计方法,以供同行参考。 1 光电编码器的工作原理 光电编码器 (OptICal Encoder)俗称“单键飞梭”,其外观好像一个电位器,

3、因其 外部有一个可以左右旋转同时又可按下的旋钮,很多设备 (如显示器、 示波器等 ) 用它作为人 机交互接口。下面以美国Greyhill公司生产的光电编码器为例,介绍其工作原理及使用方 法。光电编码器的内部电路如图1所示,其内部有1个发光二极管和2个光敏三极管。当左右 旋转旋钮时, 中间的遮光板会随旋钮一起转动,光敏三极管就会被遮光板有次序地遮挡,A、 B相就会输出图2所示的波形 ; 当按下旋钮时,2、3两脚接通,其用法同一般按键。 当顺时针旋转时,光电编码器的A相相位会比B 相超前半个周期; 反之,A相会比 B 相滞后半个周期。通过检测A、B两相的相位就可以判断旋钮是顺时针还是逆时针旋转,通

4、 过记录 A 或 B相变化的次数,就可以得出旋钮旋转的次数,通过检测 2、3脚是否接通就可以 判断旋钮是否按下。其具体的鉴相规则如下: A为上升沿, B=0时,旋钮右旋 ; B为上升沿, A=l 时,旋钮右旋 ; A为下降沿, B=1时,旋钮右旋 ; B为下降沿, A=O时,旋钮右旋 ; B为上升沿, A=0时,旋钮左旋 ; A为上升沿, B=1时,旋钮左旋 ; B为下降沿, A=l 时,旋钮左旋 ; A为下降沿, B=0时,旋钮左旋。 通过上述方法, 可以很简单地判断旋钮的旋转方向。在判断时添加适当的延时程序, 以消除抖动干扰。 2 WinCE 提供的驱动模型 WinCE操作系统支持两种类型

5、的驱动程序。一种为本地驱动程序,是把设备驱动程 序作为独立的任务实现的,直接在顶层任务中实现硬件操作,因此都有明确和专一的目的。 本地设备驱动程序适合于那些集成到Windows CE 平台的设备,诸如键盘、触摸屏、音频等 设备。 另一种是具有定制接口的流接口驱动程序。它是一般类型的设备驱动程序。流接口驱 动程序的形式为用户一级的动态链接库(DLL) 文件,用来实现一组固定的函数称为“流接口 函数”, 这些流接口函数使得应用程序可以通过文件系统访问这些驱动程序。本文讨论的光 电编码器就属于流接口设备。 2.1 流设备驱动加载过程 WinCE.NET系统运行时会启动负责流驱动的加载进程DEVICE

6、.exe。DEVICE.exe 进 程对驱动的加载是通过装载注册表列举器(RegEnum.dll)实现的。在WinCE.NET中,所有设 备的资源信息都由OAL负责记录在系统注册表中,RegEnum.dll 一个一个扫描注册表项 HEKY_LOCAL_MACHINEDriverBuiltIn 下的子键, 发现新设备就根据每个表项的内容进行硬件 设备初始化。 2.2 中断与中断处理 如果一个驱动程序要处理一个中断,那么驱动程序需要首先使用CreateEvent函数 建立一个事件, 调用 InterruptInitialize函数将该事件与中断标识绑定。然后驱动程序中 的 IST 就可以使用 Wa

7、itForSing|eObject函数来等待中断的发生。在一个硬件中断发生之后, 操作系统进入异常处理程序,异常处理程序调用OAL的 OEMInterruptHandler函数,该函数 检测硬件并将中断标识返回给系统; 系统得到该中断标识便会找到该中断标识对应的事件, 并唤醒等待相应事件的线程(IST) ,然后 IST 进行中断处理。处理完成之后,IST 需要调用 InterruptDone函数来告诉操作系统中断处理结束,操作系统再次调用OAL中的 OEMInterruptDone函数,最后完成中断的处理。图3为 WinCE.NET中断处理的流程框图。 3 光电编码器驱动程序的设计 3.1 光

8、电编码器与S3C2410的硬件接口 光电编码器与S3C24lO 的接口电路如图4所示。光电编码器的A、B相为集电极开路 输出, 由于 S3C2410 的 I/O 口电平为 3.3 V,所以将其通过电阻上拉到3.3V 后再分别接到CPU 的 EINT0和 EINT1上; 将 Pl 直接接到 3.3V ,P2通过电阻下拉到GND 。当旋钮按下时,P2口输 出为高电平,否则输出为低电平。 工作状态下, 将 EINTO、EINTl 配置成上升沿和下降沿均触发的外部中断,将 EINT2 配置成上升沿触发的中断,旋钮按下时EINT2引脚产生上升沿触发中断。 3.2 外部中断初始化及中断服务程序的编写 首先

9、必须完成CPU的 I/O 口和中断的初始化工作,然后再编写中断处理程序。具体 分为 4个步骤: 初始化 I/O 口。在 Port_Init()函数中,将EINT0和 EINTl 初始化为上升沿和下降 沿均触发的中断。将EINT2初始化为上升沿触发的中断。 添加中断号。在oalint.h下添加光电编码器中断向量的宏定义。代码为#define SYSINTR_OED(SYSINTR_FIRMWARE+20) 添加中断的初始化、禁止、复位等函数,分别在OEMInterruptEnable()、 OEMInterruptDisable()、 OEM-InterruptDone()等函数中加入相关代码。

10、 返同中断标识,由OEMInterruptHandler()函数返回中断标识(SYSINTR_OED) 。 3.3 编写流接口驱动程序 Windows CE.net把中断处理分成两个部分:中断服务程序(ISR) 和中断服务线程 (IST) 。TSR通常要求越短、越快越好,它的唯一任务就是返回中断标识。正由于ISR 很小, 只能做少量的处理, 因此中断处理器就调用IST 执行大多数的中断处理。中断服务线程 (IST) 在从 waitForSingleObject()函数得到中断已经发生的信号前一直保持空闲; 当接收到中断 信号后, 它就在本机设备驱动程序的PDD层调用子程序, 这些程序反过来访问

11、硬件以获得硬 件的状态。 IST 使用 InterruptInitialize()函数来注册自己,然后使用 WaitForSingleObject()函数等待中断信号。如果这时中断信号到来,则应将光电编码器的 状态记录下来,保存在变量OED_Status 中。 OED_Status=1表示旋钮按下,OED_Status=2表 示旋钮逆时针旋转,OED_Status=3表示旋钮顺时针旋转。 这里还有一种比较简单的鉴相规则,具体步骤是, 当创建线程时读出EINTl 的电平 状态并保存在变量PreEINTl中,每次中断到来时首先判断EINT2是否为高电平。如果为高 电平,则说明按钮按下; 如果 EI

12、NT2为低电平,则判断EINTO电平是否与PreEINTl相同。如 果相同,则说明旋钮逆时针旋转; 反之,旋钮顺时针旋转,判断的流程如图5所示。 Windows CE 流接口驱动程序模型要求驱动程序开发者编写10 个接口函数,针对光电编 码器的驱动主要应完成设备初始化和数据读取2 个函数的编写。WindowsCE 设备文件名前 缀由 3 个大写字母组成,操作系统使用这3 个字母来识别与流接口驱动程序相对应的设备。 这里定义设备文件名前缀为“OED ”(OptICal Encoder),其中设备初始化函数OED_Init() 在 Windows CE 装载驱动程序时用于创建中断事件和中断服务线程

13、。在函数OED_Read()中将 光电编码器的状态(OED_Status)返回。 3.4 封装驱动程序并加入到WinCE中 根据上述方法编译出动态链接库(DLL) 还不够,因为它的接口函数还没有导出,还 需要告诉链接程序输出什么样的函数,因此必须建立一个后缀名为def 的文件。 在本设计中 为 OpticalEnccder.def。下面是此文件的内容: 一个具体的流接口驱动程序和注册表是密不可分的。向 WinCE内核添加注册表项的 方法有两种: 一种是直接修改Platform Builder下的 reg 文件 ; 另一种是自己编写一个注册 表文件,通过添加组件的方法将动态链接库文件添加到内核中。这里用第2种方法,将 OpticalEncoder.dll添加到内核中。编写的注册表文件内容如下: 最后编写一个CEC文件,完成对定制内核注册表部分的修改并将 OpticalEncoder.dll添加到系统内核中去,然后在Platform Builder中就可以直接添加已 经编写好的驱动程序了。 结语 本文主要介绍了光电旋转编码器的原理及应用方法,并详细介绍了WinCE驱动程序 的结构, 成功地开发出了光电编码器在嵌入式操作系统WinCE下的驱动程序。实验证明, 该 方法正确可行,程序运行稳定可靠。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1