旋转编码器编程原理实例

旋转编码器编程原理实例
光电旋转编码器的原理及应用方法
时间:2012-03-13 21:33:37 来源: 作者:
WinCE下光电编码器的驱动程序设计
近年来,嵌入式技术发展迅速,嵌入式系统在各行各业得到了广泛的应用。然而,由于嵌入式计算机的专用性,系统的硬件、软件结构千差万别,其输入设备也不再像通用计算机那样单一。嵌入式计算机的输入没备一般有鼠标、键盘、触摸屏、按钮、旋钮等,而光电编码器(俗称单键飞梭)作为一种输入设备,由于其具有输入灵活,简单可靠等特点,因此特别适合应用在嵌入式仪器和手持式设备上,整个系统可以只用一个键作为输入。触摸屏由于其方便灵活、节省空间、界面直观等特点也备受青睐,但存在寿命短,长时间使用容易产生误差等缺点。如果用光电编码器辅助触摸屏作为输入设备,必将大大增强系统的可靠性,使得人机接口更加人性化。但由于光电编码器并不是WinCE的标准输入设备,因此其驱动程序在嵌入式操作系统Windows CE Platform Builder中并未给出。本文以三星公司S3C2410(ARM9芯片)
CPU的嵌入式系统开发板为平台,详细阐述了嵌入式操作系统WinCE下光电编码器驱动程序的设计方法,以供同行参考。
  1 光电编码器的工作原理
  光电编码器(OptICal Encoder)俗称单键飞梭,其外观好像一个电位器,因其外部有一个可以左右旋转同时又可按下的旋钮,很多设备(如显示器、示波器等)用它作为人机交互接口。下面以美国Greyhill公司生产的光电编码器为例,介绍其工作原理及使用方法。光电编码器的内部电路如图1所示,其内部有1个发光二极管和2个光敏三极管。当左右旋转旋钮时,中间的遮光板会随旋钮一起转动,光敏三极管就会被遮光板有次序地遮挡,AB相就会输出图2所示的波形;当按下旋钮时,23两脚接通,其用法同一般按键。
 
  当顺时针旋转时,光电编码器的A相相位会比B相超前半个周期;反之,A相会比B相滞后半个周期。通过检测AB两相的相位就可以判断旋钮是顺时针还是逆时针旋转,通过记录AB相变化的次数,就可以得出旋钮旋转的次数,通过检测23脚是否接通就可以判断旋钮是否按下。其具体的鉴相规则如下:
  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操作系统支持两种类型的驱动程序。一种为本地驱动程序,是把设备驱动程序作为独立的任务实现的,直接在顶层任务中实现硬件操作,因此都有明确和专一的目的。本地设备驱动程序适合于那些集成到Windows CE平台的设备,诸如键盘、触摸屏、音频等设备。另一种是具有定制接口的流接口驱动程序。它是一般类型的设备驱动程序。流接口驱动程序的形式为用户一级的动态链接库(DLL)文件,用来实现一组固定的函数称为流接口函数,这些流接口函数使得应用程序可以通过文件系统访问这些驱动程序。本文讨论的光电编码器就属于流接口设备。
  2.1 流设备驱动加载过程
  WinCE.NET系统运行时会启动负责流驱动的加载进程进程对驱动的加载是通过装载注册表列举器(RegEnum.dll)实现的。在WinCE.NET中,所有设备
的资源信息都由OAL负责记录在系统注册表中,RegEnum.dll一个一个扫描注册表项HEKY_LOCAL_MACHINEDriverBuiltIn下的子键,发现新设备就根据每个表项的内容进行硬件设备初始化。
  2.2 中断与中断处理
  如果一个驱动程序要处理一个中断,那么驱动程序需要首先使用CreateEvent函数建立一个事件,调用InterruptInitialize函数将该事件与中断标识绑定。然后驱动程序中的IST就可以使用WaitForSing|eObject函数来等待中断的发生。在一个硬件中断发生之后,操作系统进入异常处理程序,异常处理程序调用OALOEMInterruptHandler函数,该函数检测硬件并将中断标识返回给系统;系统得到该中断标识便会到该中断标识对应的事件,并唤醒等待相应事件的线程(IST),然后IST进行中断处理。处理完成之后,IST需要调用InterruptDone函数来告诉操作系统中断处理结束,操作系统再次调用OAL中的OEMInterruptDone函数,最后完成中断的处理。图3WinCE.NET中断处理的流程框图。
 
3 光电编码器驱动程序的设计
  3.1 光电编码器与S3C2410的硬件接口
  光电编码器与S3C24lO的接口电路如图4所示。光电编码器的AB相为集电极开路输出,由于S3C2410I/O口电平为3.3 V,所以将其通过电阻上拉到3.3V后再分别接到CPUEIN
T0EINT1;Pl直接接到3.3VP2通过电阻下拉到GND。当旋钮按下时,P2口输出为高电平,否则输出为低电平。
 
  工作状态下,将EINTOEINTl配置成上升沿和下降沿均触发的外部中断,将EINT2配置成上升沿触发的中断,旋钮按下时EINT2引脚产生上升沿触发中断。
  3.2 外部中断初始化及中断服务程序的编写
  首先必须完成CPUI/O口和中断的初始化工作,然后再编写中断处理程序。具体分为4个步骤:
  初始化I/O增量式光电编码器口。在Port_Init()函数中,将EINT0EINTl初始化为上升沿和下降沿均触发的中断。将EINT2初始化为上升沿触发的中断。
  添加中断号。在oalint.h下添加光电编码器中断向量的宏定义。代码为#define SYSINTR_OED(SYSINTR_FIRMWARE+20)
  添加中断的初始化、禁止、复位等函数,分别在OEMInterruptEnable()OEMInterruptDisable()OEM-InterruptDone()等函数中加入相关代码。
  返同中断标识,由OEMInterruptHandler()函数返回中断标识(SYSINTR_OED)
  3.3 编写流接口驱动程序
  Windows CE把中断处理分成两个部分:中断服务程序(ISR)和中断服务线程(IST)T
SR通常要求越短、越快越好,它的唯一任务就是返回中断标识。正由于ISR很小,只能做少量的处理,因此中断处理器就调用IST执行大多数的中断处理。中断服务线程(IST)在从waitForSingleObject()函数得到中断已经发生的信号前一直保持空闲;当接收到中断信号后,它就在本机设备驱动程序的PDD层调用子程序,这些程序反过来访问硬件以获得硬件的状态。IST使用InterruptInitialize()函数来注册自己,然后使用WaitForSingleObject()函数等待中断信号。如果这时中断信号到来,则应将光电编码器的状态记录下来,保存在变量OED_Status中。OED_Status=1表示旋钮按下,OED_Status=2表示旋钮逆时针旋转,OED_Status=3表示旋钮顺时针旋转。

本文发布于:2024-09-21 22:14:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/353363.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   设备   驱动程序   编码器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议