旋转编码器编程原理实例

合集下载

e11旋转编码器原理 -回复

e11旋转编码器原理 -回复

e11旋转编码器原理-回复旋转编码器是一种常见的输入设备,广泛应用于许多电子设备中,如数码相机、机器人、游戏手柄等。

它能够精确地感知和记忆旋转操作,并将其转化为数字信号,以便电子设备进行相应的处理。

本文将详细介绍旋转编码器的原理及其工作机制。

一、旋转编码器的基本原理旋转编码器主要由两部分组成:编码盘和旋钮。

编码盘是一个圆盘,上面分布有许多等距离排列的刻度,通常体现为虚线或数字。

旋钮是一个旋转的手柄,用户通过旋转旋钮来进行输入操作。

旋转编码器的原理在于,当用户旋转旋钮时,编码盘和旋钮之间的机械连接会导致编码盘相对于旋钮旋转。

同时,编码盘上的刻度也会相对于旋钮进行移动。

通过精确感知旋钮的旋转角度和刻度的变化,旋转编码器可以精确地记录下用户的输入操作。

二、旋转编码器的工作机制旋转编码器通过两种类型的输出信号来传递用户的旋转输入:增量式输出和绝对式输出。

1. 增量式输出增量式输出是旋转编码器最常见的输出方式。

它通过两个感应器来检测旋钮的方向和旋转的次数。

这两个感应器通常是光学或磁性的,并分别安装在编码盘的两侧。

当旋钮顺时针旋转时,一个感应器会检测到脉冲信号,表示旋转一次;而当旋钮逆时针旋转时,另一个感应器会检测到相反的脉冲信号,也表示旋转一次。

通过感知这些脉冲信号的数量和方向,电子设备可以判断出用户旋转的角度和方向。

2. 绝对式输出绝对式输出是一种特殊的输出方式,它能够直接提供旋钮的旋转角度。

绝对式输出通常有两种类型:光学和磁性。

光学绝对式输出采用了一种特殊的编码盘,通常是在刻度上涂层了一层特殊的材料。

旋钮上安装了一个光传感器,当用户旋转旋钮时,光传感器会感知到刻度涂层上的亮暗变化。

通过分析亮暗变化的模式,电子设备可以判断出旋钮的旋转角度。

磁性绝对式输出则利用了编码盘和旋钮上的磁性材料。

编码盘上有许多磁性柱,旋钮上安装了磁性传感器。

当旋钮旋转时,磁性传感器会感知到磁性柱的数量和位置,并将其转化为数字信号,表示旋钮的旋转角度。

ec11stm32例程

ec11stm32例程

ec11stm32例程EC11STM32是一种旋转编码器,常用于嵌入式系统中,可以用来获取旋转方向和计算旋转角度。

在STM32开发板上使用EC11STM32,需要进行相应的配置和编程。

本文将介绍EC11STM32的原理、使用方法以及编程实例。

EC11STM32工作原理:EC11STM32包含一个旋转编码器和一个按钮开关。

旋转编码器由两个光电传感器、一个LED和一个编码盘组成。

编码盘上有很多小刻度,每当旋转编码器旋转一格,编码盘上的刻度就会遮挡或透过光电传感器,从而产生一个脉冲信号。

根据脉冲信号的变化,我们可以判断旋转的方向和计算旋转的角度。

EC11STM32的使用方法:在STM32开发板上使用EC11STM32,首先需要将EC11STM32连接到正确的GPIO引脚上。

然后,我们可以通过读取GPIO引脚的状态来获取旋转和按下按钮的信息。

对于旋转编码器,我们可以使用两个引脚来获取旋转方向和计数。

对于按钮开关,我们可以使用一个引脚来获取按下和释放的状态。

编程实例:下面是一个使用EC11STM32的简单编程实例,用于获取旋转方向和计算旋转角度:```c#include "stm32f10x.h"#define CLK_GPIO GPIOA#define DT_GPIO GPIOB#define BTN_GPIO GPIOC#define CLK_PIN GPIO_Pin_0#define DT_PIN GPIO_Pin_1#define BTN_PIN GPIO_Pin_13int main(void){GPIO_InitTypeDef GPIO_InitStructure;//初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);//配置CLK引脚为输入GPIO_InitStructure.GPIO_Pin = CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(CLK_GPIO, &GPIO_InitStructure);//配置DT引脚为输入GPIO_InitStructure.GPIO_Pin = DT_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DT_GPIO, &GPIO_InitStructure);//配置BTN引脚为输入GPIO_InitStructure.GPIO_Pin = BTN_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BTN_GPIO, &GPIO_InitStructure);int count = 0;int last_state = 0;int curr_state = 0;while (1){//读取CLK和DT引脚的状态last_state = curr_state;curr_state = GPIO_ReadInputDataBit(CLK_GPIO, CLK_PIN) << 1 | GPIO_ReadInputDataBit(DT_GPIO, DT_PIN);if (last_state != curr_state){//根据旋转方向增加或减少计数if ((last_state == 0b00 && curr_state == 0b01) || (last_state == 0b11 && curr_state == 0b10))count++;else if ((last_state == 0b01 && curr_state == 0b00) || (last_state == 0b10 && curr_state == 0b11))count--;//打印计数值printf("Count: %d\n", count);}//检测按钮是否按下if (GPIO_ReadInputDataBit(BTN_GPIO, BTN_PIN) == 0){//按钮按下时执行的操作printf("Button pressed\n");}}}```通过上述代码,我们可以实现读取EC11STM32的旋转和按钮信息,并进行相应的操作。

旋转编码器工作原理 __编码器

旋转编码器工作原理 __编码器

旋转编码器工作原理 __编码器旋转编码器工作原理编码器是一种常用于测量旋转运动的装置,它能够将旋转角度或位置转化为数字信号,用于控制和监测系统中的运动。

旋转编码器广泛应用于机械、自动化控制、仪器仪表等领域。

一、编码器的基本结构旋转编码器通常由光电传感器和编码盘组成。

编码盘上有一系列的刻线,光电传感器通过检测这些刻线的变化来测量旋转角度或位置。

光电传感器一般由发光二极管(LED)和光敏二极管(Photodiode)组成。

LED发出的光经过编码盘上的刻线反射回光敏二极管,光敏二极管会产生电流信号,根据刻线的变化情况,电流信号的强弱和频率也会有所变化。

编码盘上的刻线通常有两种类型:光栅和格雷码。

光栅刻线是等距离的黑白条纹,光电传感器通过检测黑白条纹的变化来测量旋转角度或位置。

格雷码刻线是一种特殊的二进制编码方式,相邻两个码之间只有一个位数发生变化,可以提高编码器的精度和稳定性。

二、编码器的工作原理当旋转编码器旋转时,编码盘上的刻线会引起光敏二极管接收到的光强度的变化。

根据光强度的变化,光敏二极管会产生不同的电流信号。

对于光栅刻线,光敏二极管接收到的光强度的变化会导致电流信号的强弱和频率的变化。

通过测量电流信号的强弱和频率,可以计算出旋转的角度或位置。

对于格雷码刻线,光敏二极管接收到的光强度的变化会导致电流信号的强弱和相位的变化。

通过测量电流信号的强弱和相位,可以计算出旋转的角度或位置。

为了提高编码器的精度和稳定性,通常会采用多通道的编码器,即在一个编码盘上设置多个刻线。

多通道编码器可以提供更高的分辨率和更精确的测量结果。

三、编码器的应用领域旋转编码器广泛应用于机械、自动化控制、仪器仪表等领域。

以下是一些常见的应用案例:1. 机械设备控制:编码器可以用于测量机械设备的旋转角度或位置,用于控制和监测机械系统的运动。

2. 机器人控制:编码器可以用于测量机器人关节的旋转角度或位置,用于控制和监测机器人的运动。

旋转编码器编程原理实例

旋转编码器编程原理实例

旋转编码器编程原理实例旋转编码器是一种常见的传感器设备,可以用于测量物体的旋转角度和方向。

它通常由光电转换器和代码盘组成,通过检测光电转换器接收到的光线来确定旋转方向和步数。

旋转编码器广泛应用于工控领域、机器人控制、汽车导航系统等。

1.硬件连接:首先,需要将旋转编码器与控制器板连接起来。

通常旋转编码器具有三个引脚:电源正极、电源负极和输出信号。

将正极连接到控制器板的电源输出引脚,负极连接到控制器板的地引脚,输出信号连接到控制器板的一些IO口。

2.编程环境设置:在编程环境中,需要导入旋转编码器的驱动库。

常见的编程语言如C、C++、Python等都有相应的驱动库可供选择。

导入驱动库后,可以使用库中提供的函数来操作旋转编码器。

3.初始化旋转编码器:在开始使用旋转编码器之前,需要初始化其参数。

这些参数包括旋转方向(顺时针或逆时针)、初始位置、步长等。

可以使用驱动库中提供的函数来设置这些参数。

4.监听旋转编码器信号:5.处理旋转编码器信号:在监听到旋转编码器的信号变化后,需要编写相应的处理函数来处理这些变化。

处理函数可以根据信号的变化来判断旋转方向和步数。

通常,顺时针旋转会使输出信号由低到高变化,逆时针旋转则相反。

6.更新位置数据:根据旋转编码器的信号变化和步数,可以更新物体的位置数据。

将每次旋转的步数加到当前位置上,就可以实时获取物体的旋转角度和方向。

通过以上步骤,就可以实现旋转编码器的编程原理。

下面是一个使用Python编写的旋转编码器示例程序:```pythonimport RPi.GPIO as GPIO#定义旋转编码器的IO口A_PIN=17B_PIN=18#初始化GPIOGPIO.setmode(GPIO.BCM)GPIO.setup(A_PIN, GPIO.IN)GPIO.setup(B_PIN, GPIO.IN)#记录旋转方向和步数direction = 0count = 0#定义旋转编码器的信号回调函数def encoder_callback(channel):global direction, countA = GPIO.input(A_PIN)B = GPIO.input(B_PIN)if A == B:direction = 1 # 顺时针旋转count += 1else:direction = -1 # 逆时针旋转count -= 1#监听旋转编码器的信号变化GPIO.add_event_detect(A_PIN, GPIO.BOTH, callback=encoder_callback)GPIO.add_event_detect(B_PIN, GPIO.BOTH, callback=encoder_callback)#主程序if __name__ == "__main__":try:while True:print("Direction:", direction)print("Count:", count)except KeyboardInterrupt:pass#清理GPIO资源GPIO.cleanup```以上程序示例了如何使用树莓派的GPIO接口来读取旋转编码器的信号,并实时获取旋转方向和步数。

旋转编码器工作原理

旋转编码器工作原理

旋转编码器工作原理
旋转编码器是一种常见的用于测量物体旋转角度的装置。

其工作原理基于两个主要的部件:光源和光传感器。

首先,光源通常是一个发光二极管(LED),它会发出一束光束。

这束光将通过某种调制方式,如光栅或光薄片。

接下来,光传感器通常是一个光敏电阻或光二极管。

当旋转编码器的轴转动时,光束会通过光栅或光薄片,并被传感器接收。

对于光栅编码器,光栅上有许多细小的凹槽或凸起。

当光源照射在光栅上时,光束会在凹槽和凸起之间产生反射或散射。

光传感器会检测到这些反射或散射的变化,从而得知轴的角度变化。

对于光薄片编码器,光薄片上有一系列的透明和不透明区域。

当光源照射在光薄片上时,光束会透过透明区域或被阻挡在不透明区域。

光传感器会测量到通过光薄片的光束强度的变化,并据此计算轴的旋转角度。

通过检测光源和光传感器之间的反射或透射变化,旋转编码器可以精确地测量轴的旋转角度。

这样,它可以广泛应用于各种领域,例如机器人技术、工厂自动化以及航空航天等。

旋转编码器音量旋钮原理AD接键原理PPT课件

旋转编码器音量旋钮原理AD接键原理PPT课件

编码器内部的工作原理
此接口为编码器按下 的检测脚,软件通过 检测它的电平变化来 判断是否按下
编码器的内部构造其实 就是3个开关
下图为实物编码器内部 构造图
ห้องสมุดไป่ตู้
第1页/共9页
3.软件处理的逻辑通过编码器输出波形图可知每个运动周期
的时序
顺时针运动 逆时针运动
AB
AB
11
11
01
10
00
00
10
01
(1)MCU通过判断A,B输出的两个状态,就可以轻易的得出角度码盘的运动 方向。 (2)当编码器按下时,编码器上的KEY脚为低电平(常态为高电平), MCU判断其管脚被拉低来做出它相应的动作。 (3)我司大屏机的编码器硬件上A、B两端口是接在一起,分别串了10K和 20K电阻,MCU通过识别其不同的电压值变化还判断编码器旋转的方向。
初始状态此两接口的电平是一致的可能是高戒低电平编码器在旋转的时候它俩的电平会随旋转的角度和方向发生变化此接口为编码器按下的检测脚软件通过检测它的电平变化来判断是否按下编码器的内部构造其实就是3个开关编码器内部的工作原理下图为实物编码器内部构造图3
初始状态此两接口的 电平是一致的,可能 是高或低电平,编码 器在旋转的时候它俩 的电平会随旋转的角 度和方向发生变化
AD按键,MCU通过先采集好AD数据,并对采集到的 每一个电压赋予其功能,然后存储在程序当中,MCU 通过不断的扫描,一识别到AD数据,通过与保存的数 据做对比,就能轻易的识别出被按下的按键。
MCU有时在识别按键会出现两个按键的功能一样,但两 个按键的电压不一样,出现这种情况,大多是因为这两个按 键的电压相差的太近了造成的,比如方控,MCU可通过选择 不同的上拉或更改其电压的采集范围来避免此问题。我们目 前使用的3.3V的MCU一般是识别某个电压的+/-150mv范围内 为有效,5V的MCU则是在+/-200mv以内,针对没有可选上拉 的AD电路,我们在设计AD按键时,3.3V的MCU每个按键之 间的电压必须大或等于300mv,5V的MCU每个按键之间的电 压需大或等于400mv,否则可能会造成串键的现象。

单片机操作旋转编码器

单片机操作旋转编码器

.最近做了一个关于旋转编码器的项目,在网上查阅了很多资料,然后又是进行了诸多的实验,分享给大家。

1 旋转编码器原理(借用一下别的文档里的图片)5脚的旋转编码开关具有左转,右转,按下三个功能。

2脚接地,1,3脚接上拉电阻。

4脚,5脚是按下功能的两个脚,可以根据需求自己接线。

检查方向时,通常采用两种做法.的上升沿或下跳沿,在中断程序中,检测此时另外获取(1)中断法:A或B相为高电平一相的电平。

例如上图中,A相上跳沿,相为低电平则为顺时针转动;BB 二者为逆时针方向转动。

不相同时,则能判,BAB)电平法:同时检测A相和相的电平,当出现2 (B相的电平,则能判断出转动的方向。

定发生了转动,根据前一时刻A相和硬件电路2本设计在PIC16单片机上进行开发,采用中断法。

旋转编码开关输出上拉,之后采用RC 滤波器对信号进行先一步滤波,此处的RC滤波器的元器件大小可以适当调整。

中断源采用的是捕捉模块(CCP2)的捕捉中断(外部中断用于别处)。

3 C代码中断响应函数:void interrupt ISR(void){if(CCP2IF){CCP2IF=0;Change();}// 程序中CCP2设置成捕捉下跳沿void Change(){...unsigned int t2=2000;if(RC3)// 高电平{while((!RC1)&&(t2--))//等待RC1的低电平持续完{Delay();}的电平,以确认转动发生if(!RC3)//判断此时RC3{// 增或减操作}else{while((!RC1)&&(t2--))//等待RC1的低电平持续完{Delay();}RC3if(RC3)//判断此时的电平,以确认转动发生{// 增或减操作}}}注意事项:4滤波电路,延迟时间等均需要根据具体的旋转开关进行调整。

一般的单片机程序中,并不建议在中断中添加延迟函数,但应视具体情况而定。

旋转编码器工作原理 __编码器

旋转编码器工作原理 __编码器

旋转编码器工作原理 __编码器旋转编码器工作原理编码器是一种常见的传感器设备,用于测量和记录物体的位置、速度和方向等信息。

旋转编码器是一种特殊类型的编码器,主要用于测量旋转物体的角度和转速。

一、基本原理旋转编码器的基本原理是利用光电或磁电效应来感知旋转物体的运动。

它由一个固定的部分和一个旋转的部分组成。

固定部分通常被安装在固定的支架上,而旋转部分则与被测量的物体连接在一起。

二、光电编码器工作原理光电编码器是一种常见的旋转编码器,它利用光电传感器来感知旋转物体的运动。

光电编码器包括一个光源和一个光电传感器。

1. 光源:光源通常是一颗发光二极管(LED),它会发出光束。

2. 光电传感器:光电传感器通常由一个发光二极管和一个光敏二极管组成。

光敏二极管可以感知光的强度,并将其转化为电信号。

当旋转物体转动时,光源会照射到旋转物体上的光栅或编码盘上。

光栅或编码盘上通常有一些透明和不透明的条纹,这些条纹会使光线被遮挡和透过。

当光线透过透明的条纹时,光敏二极管会感知到光的强度增加;当光线被不透明的条纹遮挡时,光敏二极管会感知到光的强度减小。

通过检测光敏二极管输出的电信号的变化,我们可以确定旋转物体的角度和转速。

三、磁电编码器工作原理磁电编码器是另一种常见的旋转编码器,它利用磁电传感器来感知旋转物体的运动。

磁电编码器包括一个磁场发生器和一个磁电传感器。

1. 磁场发生器:磁场发生器通常是一个磁铁或磁体,它会产生一个磁场。

2. 磁电传感器:磁电传感器通常是霍尔元件,它可以感知磁场的变化,并将其转化为电信号。

当旋转物体转动时,磁场发生器会产生一个磁场,而磁电传感器会感知到磁场的变化。

通过检测磁电传感器输出的电信号的变化,我们可以确定旋转物体的角度和转速。

四、编码器的输出信号旋转编码器的输出信号通常有两种类型:增量式和绝对式。

1. 增量式编码器:增量式编码器的输出信号是一系列脉冲,每个脉冲对应于旋转物体转过的一个固定角度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何使用旋转编码器、编码开关,旋转编码开关、编码器的原理在电子产品设计中,经常会用到旋转编码开关,也就是所说的旋转编码器、数码电位器、Rotary Encoder 。

它具有左转,右转功能,有的旋转编码开关还有按下功能。

为了使刚接触这种开关的朋友了解旋转开关的编程,我来介绍下它的原理和使用方法:以我厂生产的EC11型编码开关为例:如图1:三只脚:1 2 3脚一般是中间2脚接地,1、3脚上拉电阻后,当左转、右转旋转时,在1、3脚就有脉冲信号输出了。

两只脚:为按压开关,按下时导通,回复时断开。

在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,如图2。

由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转;当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转。

所以,在单片机编程时只需要判断当输出1为高电平时,输出2当时的状态就可以判断出是左旋转或是右旋转了。

旋转编码开关(Rotary Encoder switch)我前面介绍的2篇文章:“自己动手做收音机(LC72131)”和“电脑USB接口LCD液晶显示板(LCD Smartie)”都使用了这种旋转编码开关(Rotary Encoder switch),一个使用3脚的,后面一个使用5脚的,大家可能对这种玩意都不是很了解,但涉及到有调整的地方,这个玩意使用真是很爽,我弄了2个,研究了一下,供大家参考~5脚的ALPS:<-- ALPS Incremental Encoder (EC11 series)具有左转,右转,按下三个功能。

4、5脚是中间按下去的开关接线 1 2 3脚一般是中间2脚接地,1、3脚上拉电阻后,当左转、右转旋纽时,在1、3脚就有脉冲信号输出了。

这是标准资料:在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,见下图:由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转; 当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转.所以,在单片机编程时只需要判断当输出1为高电平时,输出2当时的状态就可以判断出是左旋转或是右旋转了。

还有另外一种3脚的,除了不带按钮开关外,和上面是一样的使用。

---------------------- 我是分隔线----------------------编码器总结(类似音响上的音量调节旋钮)1.要求旋转速度快,调节就快,速度慢,,调节就慢2.机械的编码器要24脉冲/每转,勉强可以分辨3到4种速度(每隔100ms计算一次速度),,机械的缺点是有毛刺,,寿命短,,通常在1万转左右,,不过bounce的号称20万转3.希望编码器每转的脉冲愈多愈好,霍尔的编码器和光电的编码器脉冲都很多,,但是价格都很高,,唉4.cui的编码器最好了,啥都有,按钮功能也有,,配套的旋钮也有,,完美,,可是国内没有卖的---------------------- 我是分隔线----------------------旋转编码器检测转动方向的电路---------------------- 我是分隔线----------------------旋转编码器的抗抖动计数电路摘要:旋转编码器应用于角度定位或测量时,由于旋转轴的晃动可能引起编码器输出波形的,从而引发误计数现象。

介绍了一个抗抖动计数电路,滤除了旋转编码器因抖动而造成的误计数。

关键词:旋转编码器抗抖动电路数字电路旋转编码器应用于角度定位或测量时,通常有A、B、Z三相输出。

旋转编码器的输出波形见图1。

A相和B相输出占空比为50%的方波。

编码器每转一周,A相和B相输出固定数目的脉冲(如100个脉冲)。

当编码器正向旋转时,A相比B相超前四分之一个周期;当编码器反向旋转时,B 相比A相超前四分之一个周期。

A相和B相输出方波的相位差为90°。

编码器每转一周,Z相输出一个脉冲。

由于编码器每转一周,A相和B相输出固定数目的脉冲,则A相或B相每输出一个脉冲,表示编码器旋转了一个固定的角度。

当Z相输出一个脉冲时,表示编码器旋转了一周。

因此旋转编码器可以测量角位移及位移方向。

问题出在伺服系统停止工作时,若无锁定,则旋转轴受外力(如风力影响)可能自由晃动,因而引起编码器输出波形抖动,如图2所示,从而引起误计数。

在这种情况下,就不能对波形进行正确计数。

虽然可以通过软件设置标志状态,用记录历史状态的变化来滤除误计数,但是程序耗费颇大。

因此,本人设计了一个抗抖动计数电路。

它能够自动消除抖动造成的误计数。

1 抗抖动计数电路原理图图3是抗抖动计数电路原理图。

此电路滤除了旋转编码器输出波形的抖动现象。

该电路分为四个部分:译码电路U4A;互锁电路U5A、U5B;正旋计数链J1、J3、J5和反旋计数链J2、J4、J6。

U4A为二四译码器,U5A、U5B为与门,J1~J6为D触发器。

正旋计数链负责对编码器正向旋转的计数,反旋计数链负责对编码器反向旋转的计数。

2 抗抖动计数电路工作分析图4为二四译码器输出的波形。

译码器产生d、a、b、c四种不同的状态。

在图3中当B=0、A=0时,译码器Q0输出为d状态,d状态为高电平。

当B=0、A=1时,译码器Q1输入为a状态,a状态为高电平。

当B=1、A=1时,译码器Q2输出为b状态,b状态为高电平。

B状态不影响计数和方向确定,在图3电路中没有使用。

当B=1、A=0时,译码器Q3输出为c状态,c状态为高电平。

当旋转编码器正向旋转时,译码器输出的状态顺序为d、a、b、c、d、a、b、c……。

如图4所示。

当B=0、A=0时,进入d状态,与门U5A的Pin2=a=0(Pin是管脚的意思),于是U5A的输出Pin3=0。

D触发器J1的R=d=1、S=0,因此J1被清0.与门U5B的Pin5=c=0,于是U5B的输出Pin4=0。

D触发器J2的R=d=1、S=0,因此J2也被清0。

这时J1、J2的Q端都为1,与门U5的Pin1=Pin6=1,U5A和U5B都处于等待开门状态。

当进入状态a时,Q1=a=1,U5A的Pin2=a=1。

由于c=0,所以J2的Q端仍为1,U5A的Pin1=1,U5A的输出Pin3=1.J1的R=d=0、S=1,因此J1被置1。

J1的Q=1,Q=0。

J1的Q=1,正旋标志送到了J3的D端。

时J1的Q端关闭了U5B。

在下一个d出现之前,所有的c脉冲都不会改变J2的状态。

这就说,J1、J3、J5组成的正旋计数链被打开,J2、J4、J6组成的反旋计数链被阻断。

U5A、U5B、J1、J2完成互锁的功能。

在进入状态a时,J3的R=a=1、S=0,J3被清0,J5的R=a=1、S=0,J5被清0.在进入状态c前,J3的R=a=0、S=0、D=1,J3处于待触发状态。

J3的CLK=c,当c脉冲上升沿过后,D=1被打入J3的Q端,正旋标志送到了J5的D端。

在进入状态d前,J5的R=a=0、S=0,J5处于待触发状态。

J5的CLK=d,当d脉冲上升沿过后,D=1被打入J5的Q端,正旋标志送到了正旋计数输出端。

正旋计数输出端由低电平变为高电平。

到此为止,完成了一次正旋计数。

当由状态d进入状态a时,J5的R=a=1、S=0,J5被清0,正旋计数输出端由高电平变为低电平。

由此可知,当旋转编码器正向旋转时,对应A相B相的每一个完整周期,正旋计数输出端都会产生相应的一个脉冲。

A的出现抢到了正旋计数权。

只有在d重新出现后,脉冲c才可能有机会抢到反旋计数权。

从而保证了一旦进入正旋计数状态,不全完成这一过程,就进入不了反旋计数状态。

运行时有可能从状态a返回状态d,结果这只不过释放正旋计数权。

因这时正旋标志还只在J3输入端上,a出现时已把J3清0。

D状态只会把0送给J5的Q端,因此不会产生误计数。

当旋转编码器反向旋转时,译码器输出的状态顺序为d、c、b、a、d、c、b、a……。

这种情况的分析方法与正向旋转的分析方法相同,这里不再叙述。

这就好比接力赛。

在一个只允许上一个人的封闭的环形跑道上依次均匀设d、a、b、c、四个站,立四个裁判员。

d点为起止点、出入口,持棒运动员沿环形跑道一站站往下跑。

D裁判长的职责是:运行员往a去(顺行),告示:“有人,正向”;往c去(逆行),告示:“有人,反相”。

其他裁判员的职责是给到达本站的运动员发签证(计数标志),往回跑,撤销签证。

d裁判长的计分规则是:凭其他裁判的签证齐全加牌示,正,加一分,反,减一分,然后撤销签证。

签证不齐到d,则不计分,撤销签证。

运行员在跑道内来回跑或坐时,d裁判视而不见。

例如在图2中,当从状态d进入状态a时,正旋标志送到J3的D端。

此后的a、b、a、b、a、b 都不起作用,只是把J3和J5反复清0.当从状态c进入状态d时,正旋标志到正旋计数输出端,同时J1和J2被清零。

在从状态d进入状态c后,反旋标志送到J4的D端。

同时,D=0被打入J3的Q端,这时J5的D端为零。

在从状态c回到状态d后,反旋计数权被释放。

但是,由于J5的D端为零,虽然这里再次出现状态d,该d脉冲不会发生计数,这就是抗抖动。

图5为抗抖动计数电路的输出波形。

此电路计数频率可达10MHz。

A相和B相输入前应予整形,必要时还要进行电隔离。

本人把此电路用于对在线云台角度的定位与测量。

天线云台有两个旋转角度,俯仰角从0~90度,方位角从0~354度。

旋转编码器用的是OMROM公司的E6A2。

此编码器每转一周,A相或B 相输出一百个脉冲。

由此可得,抗抖动计数电路每输出一个脉冲,编码器旋转的角度是3.6度。

如果加上变速齿轮将会提高角度测量精度。

把抗抖动电路的正旋计数输出和反旋计数输出接到单片机的中断管理上,其下降沿时给单片机发中断。

单片机把处理的角度信息送到显示屏上显示出来,从而完成了对天线云台角度的定位与测量。

这套天线角度显示系统在实际使用中运行一直很稳定,没有出现过误计数现象。

---------------------- 我是分隔线----------------------1mm Size Metal Shaft Encoder EC11 Series (Incremental Encoder)DetailPart number E C11E09204A4Structure VerticalActuator configuration FlatActuator length 20mmTorque 10±7mN·mNumber of detent 18Number of pulse 9Operating direction VerticalPush-on switch WithoutOperating life 15,000 cyclesMinimum order unit (pcs.) 1,200Operating temperature range -30℃to +85℃Maximum operating current (Resistive load) 10mAElectrical performance Ratings 10mA 5V DCOutput signalOutput of A and B signals,proportionate to phasedifferenceInsulation resistance 100MΩ min. 250V DC Voltage proof 300V AC for 1 minuteMechanical performance Push-pull strength 100NResistance tosoldering heatManualsoldering350℃max. 3s max.Durability Operating life 15,000 cyclesEnvironmental performance Cold -40±3℃for 240hDry heat 85±3℃for 240hDamp heat 60±2℃, 90 to 95%RH for 240hPhotoDimensionsMounting Hole DimensionsViewed from mounting side. Output WaveSliding NoiseAt R=5kΩ Chattering: 3ms max. Bounce: 2ms max.Product VarietiesSingle-shaft Type1) Knourled Type Unit : mm Style (Shaft diameter : φ6)2) Flat Type Unit : mm Style (Shaft diameter : φ6)Style (Shaft diameter : φ6)Notes are common to this series/models.•This site catalog shows only outline specifications. When using theproducts, please obtain formal specifications for supply.•Please place purchase orders per minimum order unit (integer).•Products other than those listed in the above chart are also available.Please contact us for details.•This products can be used in vehicles.Although these products are designed to perform over a wide operatingtemperature range, please ensure that you receive and read the formaldelivery specifications before use.I nquiries about ProductsFor more information please contact: Products Information Center.1-7, Yukigaya-otsukamachi, Ota-ku, Tokyo, 145-8501, JapanPhone: +81 (3) 5499-8154Series 288 Encoder 16 mm Rotary EncoderLow cost, robust design Miniature 16mm styleBushing mountedPC terminals, with shaft parallelor perpendicular to PC board2 bit, 4 bit Gray and 4 bitHexidecimal codesavailable Continuous rotationAvailable with 16 detentsOptional momentary switchElectrical and Mechanical SpecificationsPower Rating 100 milliwattsVoltage Rating Operating maximum 50 VACOperating Temperature Standard: -25°C to +100°CContact Resistance 5,000 ohms static closed circuit maximum---------------------- 我是分隔线----------------------按键旋转编码器(涡轮)程序51:void polling_volume_sw(void){BYTE bSWValue=0;static BYTE iLastData=0;static BYTE iSWTempData = 0;#if defined(SUPPORT_USE_SW_SCANF_CODER) ||defined(SUPPORT_USE_SW_SCANF_LEVEL)polling_check_vfdsw();return;#elif defined(VOLUME_SW_USE_IO)GPIO_M_SET(13,1); //GAME DIGPIO_M_SET(14,1); //GAME DOGPIO_E_SET(13,0);GPIO_E_SET(14,0);bSWValue =( (GPIO_I_GET(14)<<1) | (GPIO_I_GET(13) )); #endifif(bSWValue != iSWTempData)iSWTempData = bSWValue;else{switch(bSWValue){case 0:if(iLastData ==2)iLastData ++;break;case 1:if(iLastData ==1)iLastData++;else if(iLastData ==3){call_ir_func(IRC_VOLUME_UP);iLastData = 0;}break;case 2:if(iLastData ==1)iLastData ++;else if(iLastData == 3){call_ir_func(IRC_VOLUME_DN);iLastData = 0;}break;case 3:iLastData =1;break;default:break;}}#endif}sunplus(dvd) 环境:需源程序支持://// generic GPIO operations//#define GPIO_I_GET(a) ((regs0->gpio_in[a/16] >> (a%16)) & 0x01)#define GPIO_O_SET(a,d) ((d) ? (regs0->gpio_out[a/16] |= (1<<(a%16))) \: (regs0->gpio_out[a/16] &= ~(1<<(a%16))) )#define GPIO_E_SET(a,d) ((d) ? (regs0->gpio_oe[a/16] |= (1<<(a%16))) \: (regs0->gpio_oe[a/16] &= ~(1<<(a%16))) )#define GPIO_M_SET(a,d) ((d) ? (regs0->gpio_master[a/16] |= (1<<(a%16))) \: (regs0->gpio_master[a/16] &= ~(1<<(a%16))) )#ifdef SUPPORT_XINZENYU_JOB_VOLUME //Refee 080905BYTE volume_a_buf = 0;BYTE volume_b_buf = 0;void Check_Job_Volume_Key(void){GPIO_M_SET(13,1); //Pin62 Game_D0GPIO_M_SET(14,1); //Pin63 Game_D1GPIO_E_SET(13,1);GPIO_E_SET(14,1);GPIO_O_SET(13,1);GPIO_O_SET(14,1);volume_a_buf = volume_a_buf<<1;if(!GPIO_I_GET(13)) volume_a_buf++;volume_b_buf = volume_b_buf<<1;if(!GPIO_I_GET(14)) volume_b_buf++;volume_a_buf = volume_a_buf & 0x7;volume_b_buf = volume_b_buf & 0x7;if(volume_a_buf == 0x04){if(volume_b_buf >= 0x06)call_ir_func(IRC_VOLUME_DN);elsecall_ir_func(IRC_VOLUME_UP);volume_a_buf = 0;volume_b_buf = 0;}}#endif---------------------- 我是分隔线----------------------这段不是很好,对于质量很差的编码器就问题较大了,需要加一些处理:void Check_Job_Volume_Key(void){static unsigned char last_gpio1=0;static unsigned char last_gpio2=0;static unsigned char last_gpio3=0;static unsigned char last_gpio4=0;static unsigned char last_gpio5=0;static unsigned char last_gpio2_1=0;unsigned char gpio1;unsigned char gpio2;regs0->gpio_first[1]|= (0x1<<5); //Set pin9 as GPIO21regs0->gpio_first[1]|= (0x1<<13); //Set Pin52 as GPIO29GPIO_M_SET(21,1);GPIO_M_SET(29,1);GPIO_E_SET(21,0);GPIO_E_SET(29,0);//GPIO_O_SET(21,1);//GPIO_O_SET(29,1);gpio1=GPIO_I_GET(21);gpio2=GPIO_I_GET(29) ;if((gpio1)&&(last_gpio1)&&(last_gpio2)&&(!last_gpio3)&&(!last_gpio4)&&(!last_gpi o5)){if (gpio2&&last_gpio2_1)call_ir_func(IRC_VOLUME_DN);else if ((!gpio2)&&(!last_gpio2_1))call_ir_func(IRC_VOLUME_UP);}last_gpio2_1=gpio2;last_gpio5=last_gpio4;last_gpio4=last_gpio3;last_gpio3=last_gpio2;last_gpio2=last_gpio1;last_gpio1=gpio1;}参考:#include "reg51.h"#define uint unsigned intsbit CodingsWitch_A=P1_1;sbit CodingsWitch_B=P1_2;uint CodingsWitchPolling()//{static Uchar Aold,Bold; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平static Uchar st; //定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态uint tmp = 0;if(CodingsWitch_A&&CodingsWitch_B)st = 1; //if(st) //如果st为1执行下面的步骤{if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果当前编码开关的两个引脚都为底电平执行下面的步骤{if(Bold) //为高说明编码开关在向加大的方向转{st = 0;tmp++; //}if(Aold) //为高说明编码开关在向减小的方向转{st = 0;tmp--; //设返回值}}}Aold = CodingsWitch_A; //Bold = CodingsWitch_B; //储return tmp; //}//编码器计数程序void encoder_cnt(void){uchar temp;temp = PIND; //取端口D管脚信号couch_clr = (temp & 0x08); //取编码器清零信号if(couch_clr != false) //有编码器清零信号{couch_num = 0; //水平床码清零}else{if(encoder_cnt_en == false) //编码器计数模块没有启动{pr_couch_ba = temp & 0x03; //取编码器A、B相电平信号 }else{couch_ba = temp & 0x03; //取编码器A、B相电平信号if(pr_couch_ba == 0x00){if(couch_ba == 0x01){couch_num++; //水平床码加1 }else if(couch_ba == 0x10){couch_num--; //水平床码减1 }}else if(pr_couch_ba == 0x01){if(couch_ba == 0x11){couch_num++; //水平床码加1 }else if(couch_ba == 0x00){couch_num--; //水平床码减1 }}else if(pr_couch_ba == 0x10){if(couch_ba == 0x00){couch_num++; //水平床码加1 }else if(couch_ba == 0x11){couch_num--; //水平床码减1 }}else if(pr_couch_ba == 0x11){if(couch_ba == 0x10){couch_num++; //水平床码加1 }else if(couch_ba == 0x01){couch_num--; //水平床码减1 }}}pr_couch_ba = couch_ba;}}旋转编码器的检测程序(MCS51)//旋转编码器检测程序,A/B信号分别接在了INT0和INT1上//程序作者:BG4UVR//2005年1月15用KEIL编译、硬件测试通过//注意:编码器的信号,程序未做消抖处理。

相关文档
最新文档