甲 旋转编码器 是一种输入装置,其帮助用户与系统进行交互。它看起来更像是一个无线电电位计,但是它输出一系列脉冲,这使其应用变得独一无二。旋转编码器的旋钮时,它会以小的步进形式旋转,这有助于将其用于步进/伺服电机控制,浏览菜单顺序以及增大/减小数字值等等。
在本文中,我们将了解旋转编码器的 不同类型及其工作原理。我们还将 其与PIC单片机PIC16F877A进行接口连接,并通过旋转编码器来控制整数值并将其值显示在16 * 2 LCD屏幕上。在本教程的最后,您将对项目使用旋转编码器感到满意。所以我们开始吧…
旋转编码器及其类型
旋转编码器通常称为轴编码器。它是一种机电转换器,意味着它将机械运动转换为电子脉冲,或者换句话说,它将角位置或运动或轴位置转换为数字或模拟信号。它由一个旋钮组成,旋钮在旋转时会逐步移动,并为每个步进产生一系列具有预定宽度的脉冲序列。
市场上有多种类型的旋转编码器,设计人员可以根据自己的应用选择一种。下面列出了最常见的类型
- 增量编码器
- 绝对编码器
- 磁性编码器
- 光学编码器
- 激光编码器
这些编码器基于输出信号和传感技术进行分类,增量编码器和绝对编码器根据输出信号进行分类,磁,光学和激光编码器根据传感技术进行分类。此处使用的 编码器是增量类型的编码器。
绝对编码器即使在断电后仍会存储位置信息,并且当我们再次为其供电时,位置信息将可用。
另一种基本类型,增量编码器在编码器更改其位置时提供数据。它无法存储位置信息。
KY-040旋转编码器的引脚排列和说明
KY-040增量型旋转编码器的引脚排列如下所示。在这个项目中,我们将把这种旋转编码器与微芯片上流行的微控制器PIC16F877A连接。
前两个引脚(接地和Vcc)用于为编码器供电,通常使用+ 5V电源。除了按顺时针和逆时针方向旋转旋钮外,编码器还具有一个开关(低电平有效),可以通过按下内部的旋钮来按下该开关。来自此开关的信号通过引脚3(SW)获得。最后,它具有两个输出引脚(DT和CLK),它们产生如下所述的波形。我们之前已经将此旋转编码器与Arduino接口。
旋转编码器如何工作
输出完全取决于内部铜垫,该铜垫提供了与GND和VCC与轴的连接。
旋转编码器有两个部分。轴轮,其与所述轴根据轴的旋转,以及连接和顺时针旋转或逆时针基,其中的电连接被完成。基座具有连接到DT或CLK的端口或点,以使轴旋转时,它将连接基点并在DT和CLK端口上提供方波。
输出将类似于轴旋转时-
两个端口提供方波,但时序略有不同。因此,如果我们接受输出为1和0,则只能有四个状态,即0 0、1 0、1 1、01。二进制输出的顺序决定了顺时针旋转还是逆时针旋转。例如,如果旋转编码器在空闲状态下提供1 0并在其后提供1 1,则意味着编码器将其位置沿顺时针方向更改了一个步骤,但是如果在空闲1 0之后提供了0 0,表示轴沿一个逆时针方向改变其位置。
所需组件
现在是时候确定我们需要将旋转编码器与PIC单片机接口了,
- PIC16F877A
- 4.7k电阻
- 1K电阻
- 1万锅
- 33pF陶瓷圆盘电容器– 2个
- 20Mhz晶体
- 16x2显示器
- 旋转编码器
- 5V适配器。
- 面包板
- 连接线。
PIC16F877A旋转编码器接口电路图
下图是根据电路图连接组件后的最终设置图:
我们使用一个1K电阻来代替LCD的对比度,而不是使用电位计。另外,请查看最后提供的完整的工作视频。
代码说明
该项目的结尾提供了完整的PIC代码,并带有演示视频,在这里我们将解释代码的一些重要部分。如果您不熟悉PIC单片机,请从头开始遵循我们的PIC教程。
如前所述,我们需要检查输出并区分DT和CLK的二进制输出,因此我们为该操作创建了 if-else 部分。
if(Encoder_CLK!= position){ if(Encoder_DT!= position){ // lcd_com(0x01); 计数器++; //增加计数器,该计数器将被打印在lcd lcd_com(0xC0)上; lcd_puts(“”); lcd_com(0xC0); lcd_bcd(1,counter); } else { // lcd_com(0x01); lcd_com(0xC0); 计数器 -; //减少计数器 lcd_puts(“”); lcd_com(0xC0); lcd_bcd(1,counter); // lcd_puts(“ Left”); } }
我们还需要在每个步骤中存储位置。为此,我们使用了一个变量 “ position” 来存储当前位置。
位置= Encoder_CLK; //将编码器时钟位置存储在变量中。可以是0或1。
除此之外,还提供了一个选项来通知LCD上的开关按下。
如果(Encoder_SW == 0){ sw_delayms(20); // 如果(Encoder_SW == 0){/ lcd_com(1); // lcd_com(0xC0); lcd_puts(“按下开关”); // itoa(counter,value,10); // lcd_puts(value);
该 system_init 函数被用于初始化销I / O操作,LCD和存储所述旋转编码器的位置。
void system_init(){ TRISB = 0x00; //端口B作为输出,该端口用于LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init(); //这将初始化LCD 位置= Encoder_CLK; //在while循环开始之前,将CLK位置设置在系统初始化中。 }
LCD函数写在lcd.c和lcd.h库中,其中声明了lcd_puts(),lcd_cmd()。
有关变量声明,配置位和其他代码段,请在下面找到完整的代码。