CN102609258B - 一种对旋转编码器识别的改进方法 - Google Patents
一种对旋转编码器识别的改进方法 Download PDFInfo
- Publication number
- CN102609258B CN102609258B CN201210023270.5A CN201210023270A CN102609258B CN 102609258 B CN102609258 B CN 102609258B CN 201210023270 A CN201210023270 A CN 201210023270A CN 102609258 B CN102609258 B CN 102609258B
- Authority
- CN
- China
- Prior art keywords
- encoder
- state
- scrambler
- rotary encoder
- linux
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及嵌入式Linux旋转编码器进行数据采集的方法,以及系统的软硬件设计、驱动程序开发和实际应用情况,得出了编码器进行数据采集的一种切实可行的方法。通过程序滤除和减少旋转编码器抖动带来的误操作。具体包括以下步骤:1)嵌入式Linux编译平台的搭建;2)编码器硬件电路:编码器采用一般的增量式旋转编码器;3)信号初始化及采集对比处理;4)信号传递:采集对比后的数据将会通过Linux编码器驱动传递到应用层;5)结束所有信号采集处理过程,等待下次动作。
Description
技术领域
本发明涉及嵌入式Linux旋转编码器进行数据采集的方法,具体涉及旋转编码器识别方式的改进。
背景技术
近年来,嵌入式技术发展迅速,嵌入式系统在各行各业得到了广泛的应用。然而,由于嵌入式计算机的专用性,系统的硬件,软件结构千差万别,其输入设备也不再像通用计算机那样单一。嵌入式计算机的输入没备一般有鼠标,键盘,触摸屏,按钮,旋钮等,而旋转编码器作为一种输入设备,由于其具有输入灵活,简单可靠等特点,因此特别适合应用在嵌入式仪器和手持式设备上,用光电编码器作为输入设备,必将大大增强系统的可靠性,使得人机接口更加人性化.但由于旋转编码器并不是Linux的标准输入设备,因此其驱动程序在嵌入式操作系统中并未给出,而且在其他平台下旋转编码器大多是通过状态机的方式进行识别,无法很精确的确定旋转编码器位置信息,为此需要解决旋转编码器在嵌入式Linux中应用的问题,并且需要一种行之有效的用旋转编码器进行数据采集的方法。
相关名词解释:
1、Linux:Linux是一种自由和开放源码的类Unix操作系统。
2、编译器:编译器是将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)。
发明内容
本发明的目的为了克服现有技术存在的上述问题,而提供一种基于嵌入式Linux旋转编码器进行数据采集的方法,按以下步骤进行:
一种对旋转编码器识别的改进方法,其特征在于包括以下步骤:
步骤一、搭建嵌入式Linux编译平台,并在Linux平台下,使用交叉编译工具进行交叉编译,生成在嵌入式平台上运行的目标代码;
步骤二、采用增量式旋转编码器搭建编码器硬件电路;
步骤三、采集信号数据,并对信号初始化及采集对比处理;
步骤四、采集对比后的数据将会通过Linux编码器驱动传递到应用层;
步骤五、结束所有信号采集处理过程,等待下次动作。
优选的,上述步骤三还包括:对编码器的端口进行初始化设置,并且在编码器信号的处理时需要对编码器的状态进行保存和对比。
优选的,上述步骤三具体包括:
(1)对编码器对应管脚及其中断方式进行初始化,给其一个预设的状态;
(2)等待中断,当有中断时,将会触发中断处理函数,开始整个处理过程;并开启一个定时器,定时器时间到时如果编码器没有中断触发则结束本次处理,如果在定时时间内又收到中断信号,则更新定时器,使其重新计时;
(3)判断计数器状态,如果计数器为0,则为第一次处理,对编码器的状态不做判断,只将其下次状态及其方向进行保存,并且计数器加一;若计数器不等于0,则需要将本次采集到的编码器的状态和上次的状态进行对比,如果对比结果一致,说明编码器工作正常,否则工作异常,并且需要置位异常状态标志;
(4)判断异常标志位,如果异常标志位不等0,说明上次操作出现异常,将本次状态及方向跟上次出现异常之前的方向作对比,如果一致则说明状态正常,清除异常标志位并预估下次状态;如果方向不同说明本次状态异常,保持编码器方向不变,继续下次状态采集。
本发明提供的对旋转编码器识别的改进方法是针对旋转编码器抖动带来的误操作的解决方法,较好地解决了旋转编码器抖动的问题,防止了误操作的产生,同时,方便了操作,提升了系统可靠性,改善了用户体验。
附图说明
图1为系统流程图;
图2为嵌入式开发操作方式图;
图3为编码器硬件电路;
图4为算法流程图。
具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合附图及具体实施方式对本发明作进一步的详细描述。
本发明的实现方式包括以下步骤和内容:
1)嵌入式Linux编译平台的搭建
嵌入式系统通常为一个资源受限的系统。直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。目前,一般采用的办法是,先在通用计算机上编写程序,然后,通过交叉编译,生成目标平台上可运行的二进制代码格式,最后下载到目标平台上的特定位置上运行。
嵌入式系统的交叉编译环境一般包括交叉编译器、交叉调试器和系统仿真器。其中交叉编译器用于在宿主机上生成能在目标机上运行的代码,而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试。在采用宿主机/目标机模式开发嵌入式应用软件时,首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件。然后通过串口或者以太网将交叉编译生成的目标代码传输并装载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试。最后目标机在特定环境下脱离宿主机单独运行。
建立交叉编译环境是进行嵌入式软件开发的第一步,目前常用的交叉编译环境主要有开放和商业两种类型。开放的交叉编译环境的典型代表是GNU工具链,目前已经能够支持X86,ARM,MIPS,PowerPC等多种处理器。商业的交叉开发环境则主要有Metroworks CodeWarrior,ARM SoftwareDevelopment Toolkit,SDS Cross compiler,WindRivernTornado,MicrosoftEmbeddedVisual C++等。
本文采用Red Hat Enterprise Linux 4作为软件开发平台,用GNU工具链作为交叉编译器,这些工具链包括如下组件:
(1)binutils:用于操作二进制文件的实用程序集合,包括诸如ar、as、objdump、objcopy这样的实用程序。
(2)gcc:GNU C编译器。
(3)Glibc:所有用户应用程序都将链接使用到的C库。
有两种方法可以用来建立工具链:一种方法是下载这些工具的软件包,自己编译这些源代码;另一种简单的方法就是直接从网上下载已经编译好的工具链。本文采用的第二种方法,具体步骤如下:
(1)下载所需开源文件cross-3.3.2.tar.bz2;
(2)终端下使用root用户登陆
#mkdir/usr/local/arm
#cp cross-3.3.2.tar.bz2/usr/local/arm
#tar jxvf cross-3.3.2.tar.bz2 -C/usr/local/ar
(3)添加环境变量:
Export PATH=/usr/local/arm/3.3.2/bin:$PATH
这样在该终端下就建立好交叉编译工具链了。
也可以将添加环境变量这个命令放到配置文件/etc/bashrc的最后,这样以后每个终端都能够使用该工具链。
2)编码器硬件电路
旋转编码器广泛应用于旋转角度的测量,以及可以将各种参数角度化的参数的测量,通过与各种机械结构的组合,可以测量多种物体的边缘形状、各种机械装置的结构偏差等。编码器电路如图3:
在图中,上拉电阻R14、R15、R46分别连接到旋转编码器的1、3、5管脚,ESD器件D3、D4、D6分别接到1、5、3管脚,电容C3、C4分别接到1、3管脚。
3)信号初始化及采集对比处理
整个处理流程如图1所示。
1:首先对编码器对应管脚及其中断方式进行初始化,给其一个预设的状态。
2:等待中断,当有中断时,将会触发中断处理函数,开始整个处理过程。并开启一个定时器,定时器时间到时如果编码器没有中断触发则结束本次处理,如果在定时时间内又收到中断信号,则更新定时器,使其重新计时。
3:判断计数器状态,如果计数器为0,则为第一次处理,对编码器的状态不做判断,只将其下次状态及其方向进行保存,并且计数器加一。若计数器不等于0,则需要将本次采集到的编码器的状态和上次的状态进行对比,如果对比结果一致,说明编码器工作正常,否则工作异常,并且需要置位异常状态标志。
4:判断异常标志位,如果异常标志位不等0,说明上次操作出现异常,将本次状态及方向跟上次出现异常之前的方向作对比,如果一致则说明状态正常,清除异常标志位并预估下次状态;如果方向不同说明本次状态异常,保持编码器方向不变,继续下次状态采集。
4)处理后的数据通过编码器驱动传递到应用层
把经过处理后的可靠的编码器数据通过编码器驱动传递给应用层,供应用层直接使用。
5)结束所有信号采集处理
整个过程处理完成后,会通过系统汇报函数对本次处理结果进行汇报,应用层根据收到的信息进行相应的处理。
以上所述,仅是用以说明本发明的具体实施案例而已,并非用以限定本发明的可实施范围,举凡本领域熟练技术人员在未脱离本发明所指示的精神与原理下所完成的一切等效改变或修饰,仍应由本发明权利要求的范围所覆盖。
Claims (1)
1.一种对旋转编码器识别的改进方法,其特征在于包括以下步骤:
步骤一、搭建嵌入式Linux编译平台,并在Linux平台下,使用交叉编译工具进行交叉编译,生成在嵌入式平台上运行的目标代码;
步骤二、采用增量式旋转编码器搭建编码器硬件电路;
步骤三、采集信号数据,并对信号初始化及采集对比处理;对编码器的端口进行初始化设置,并且在编码器信号的处理时需要对编码器的状态进行保存和对比;具体步骤为:(1)、对编码器对应管脚及其中断方式进行初始化,给其一个预设的状态;(2) 、等待中断,当有中断时,将会触发中断处理函数,开始整个处理过程;并开启一个定时器,定时器时间到时如果编码器没有中断触发则结束本次处理,如果在定时时间内又收到中断信号,则更新定时器,使其重新计时;(3)、判断计数器状态,如果计数器为0,则为第一次处理,对编码器的状态不做判断,只将其下次状态及其方向进行保存,并且计数器加一;若计数器不等于0,则需要将本次采集到的编码器的状态和上次的状态进行对比,如果对比结果一致,说明编码器工作正常,否则工作异常,并且需要置位异常状态标志;(4)、判断异常标志位,如果异常标志位不等于0,说明上次操作出现异常,将本次状态及方向跟上次出现异常之前的方向作对比,如果一致则说明状态正常,清除异常标志位并预估下次状态;如果方向不同说明本次状态异常,保持编码器方向不变,继续下次状态采集;
步骤四、采集对比后的数据将会通过Linux编码器驱动传递到应用层;
步骤五、结束所有信号采集处理过程,等待下次动作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210023270.5A CN102609258B (zh) | 2012-02-02 | 2012-02-02 | 一种对旋转编码器识别的改进方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210023270.5A CN102609258B (zh) | 2012-02-02 | 2012-02-02 | 一种对旋转编码器识别的改进方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102609258A CN102609258A (zh) | 2012-07-25 |
CN102609258B true CN102609258B (zh) | 2014-08-20 |
Family
ID=46526657
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210023270.5A Active CN102609258B (zh) | 2012-02-02 | 2012-02-02 | 一种对旋转编码器识别的改进方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102609258B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103984537B (zh) * | 2014-02-21 | 2017-04-19 | 北京神舟航天软件技术有限公司 | 一种sparc平台减少中断响应抖动的方法 |
KR101573908B1 (ko) * | 2014-10-01 | 2015-12-02 | 주식회사 에이디텍 | 로터리 엔코더의 디코딩 회로 |
CN105263189B (zh) * | 2015-09-14 | 2019-01-15 | 海能达通信股份有限公司 | 实现信道类型处理的方法和终端 |
CN112146686B (zh) * | 2019-06-27 | 2022-07-15 | 西安诺瓦星云科技股份有限公司 | 旋转信息获取方法、装置及系统和计算机可读存储介质 |
CN112000141B (zh) * | 2020-07-10 | 2023-07-14 | 惠州市德赛西威汽车电子股份有限公司 | 一种旋钮编码器去抖方法 |
CN113483802A (zh) * | 2021-07-19 | 2021-10-08 | 合肥哈工高创智能装备有限公司 | 一种防止装盒机机械传动异常的快速预警保护系统及方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1936753A (zh) * | 2006-10-19 | 2007-03-28 | 南京埃斯顿工业自动化有限公司 | 用于剪扳机、折弯机后挡料定位补偿的方法和系统 |
CN101910798A (zh) * | 2007-11-26 | 2010-12-08 | 堡盟霍普纳有限公司 | 具有内部的故障监控的旋转编码器以及相关的方法 |
-
2012
- 2012-02-02 CN CN201210023270.5A patent/CN102609258B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1936753A (zh) * | 2006-10-19 | 2007-03-28 | 南京埃斯顿工业自动化有限公司 | 用于剪扳机、折弯机后挡料定位补偿的方法和系统 |
CN101910798A (zh) * | 2007-11-26 | 2010-12-08 | 堡盟霍普纳有限公司 | 具有内部的故障监控的旋转编码器以及相关的方法 |
Non-Patent Citations (2)
Title |
---|
丁晓波.跨平台嵌入式Linux开发环境研究.《软件导刊》.2008,第7卷(第7期), |
跨平台嵌入式Linux开发环境研究;丁晓波;《软件导刊》;20080731;第7卷(第7期);144-146 * |
Also Published As
Publication number | Publication date |
---|---|
CN102609258A (zh) | 2012-07-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102609258B (zh) | 一种对旋转编码器识别的改进方法 | |
Zaddach et al. | AVATAR: A Framework to Support Dynamic Security Analysis of Embedded Systems' Firmwares. | |
Talebi et al. | Charm: Facilitating dynamic analysis of device drivers of mobile systems | |
Peng et al. | {X-Force}:{Force-Executing} binary programs for security applications | |
Zaddach et al. | Embedded devices security and firmware reverse engineering | |
Sun et al. | Hybrid firmware analysis for known mobile and iot security vulnerabilities | |
Banerjee et al. | Golden implementation driven software debugging | |
CN104834859A (zh) | 一种Android应用中恶意行为的动态检测方法 | |
Kothari et al. | Deriving state machines from TinyOS programs using symbolic execution | |
US20070079288A1 (en) | System and method for capturing filtered execution history of executable program code | |
Yun et al. | Fuzzing of embedded systems: A survey | |
Pustogarov et al. | Ex-vivo dynamic analysis framework for Android device drivers | |
Zhao et al. | {StateFuzz}: System {Call-Based}{State-Aware} Linux Driver Fuzzing | |
Li et al. | AppSpear: Automating the hidden-code extraction and reassembling of packed android malware | |
Simmonds | Mastering Embedded Linux Programming | |
Chen et al. | Syzgen: Automated generation of syscall specification of closed-source macos drivers | |
Zhou et al. | Ferry:{State-Aware} symbolic execution for exploring {State-Dependent} program paths | |
Eisele et al. | Fuzzing embedded systems using debug interfaces | |
CN113836023A (zh) | 一种基于体系结构交叉检查的编译器安全性测试方法 | |
Ning et al. | DexLego: Reassembleable bytecode extraction for aiding static analysis | |
US20120317440A1 (en) | Compiler internal fault handling and reporting | |
Cojocar et al. | Jtr: A binary solution for switch-case recovery | |
Li et al. | Inter-language static analysis for android application security | |
Gustafson et al. | Shimware: Toward Practical Security Retrofitting for Monolithic Firmware Images | |
Kim et al. | How’d Security Benefit Reverse Engineers?: The Implication of Intel CET on Function Identification |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |