极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22100|回复: 0

【更好用的单片机】Stduino学习(七)旋转编码器模块

[复制链接]
发表于 2020-8-14 20:13:21 | 显示全部楼层 |阅读模式
关键词:51 stm32 arduino stduino 单片机 stduino UNO&Nano 旋转编码传感器模块

说明:
旋转编码器可通过旋转来计数(即可从0开始不但加一或者减一,计数范围没有限制),实现精确数字的调节。电机角度等需要特别精确调节的元器件可以利用编码器来实现精细控制。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。

依照内部数字读取办法,编码器能够分为机械式和非机械式两种:机械式选用电刷输出,电刷接触到导电区则引脚输出高电平,接触到绝缘区则为低电平;非机械式的承受灵敏元件是光敏元件或磁敏元件,选用光敏元件时以透光区和不透光区来表明输出是“高”还是“低”。
目前常用的增量式编码器全部为机械式编码器,优点在于好用且成本低,高端的一般为非机械光电式的。我们采用的模块也使用得机械式。


如果你手上有一个旋转编码器,你可以试着拧一下:并不是连续旋转,而是拧的得时候会明显感受到不连续,一下一下的。因此,我们可以实现精确的计数,这与电位器是不同的
那么问题来了,怎么计数呢?我们可以做以下规定:
以顺时针方向为正,凡往顺势针方向转一下,则计数加一,同理转N下,则计数加n。反之,如果向逆时针转一下,则计数减一,同理转N下,则计数减n。
逆时针同理。
现在问题又来了,旋转编码器怎么告诉微处理器,我的旋转方向是什么呢?这些我们打开旋转编码器的微观结构:
实际上旋转编码器内部结构如下所示。基本上由绝缘圆盘(灰色)和放置在圆盘顶部的导电垫(蓝色)组成。
这些导电垫分离放置,因此当旋转旋钮时,旋转一单位,原先空着的部分会被导电垫填充,而导电垫离开的位置则重新恢复绝缘。因此,当导电垫通过A和B输出引脚时,引脚会输出高电平信号,反之则不会输出高电平。因此只要判断引脚信号与上一次是否相同,就能得知是否发生了旋转。
如下图,每一次旋转的时候,当顺时针旋转,A总是先比B接触到导电垫,或者离开导电垫,因此A总是比B先改变电平输出状态,此时当A发生变化后一定与B信号不同。下图为两次顺时针旋转时,A、B电平变化(红色为输出高电平信号)

而当逆时针旋转时,B先于A转换电平,因此当检测到A发生变化时,此时B已经完成了信号转换,此时A、B信号相同。

实验目的:
利用旋转编码器实现计数。

器材:
StduinoUno/Nano;杜邦线;旋转编码器模块。

电路连接:


代码展示:
  1. #define outputA 8
  2. #define outputB 7
  3. int counter = 0;
  4. int aState;
  5. int aLastState;  
  6. void setup()
  7. {
  8.    pinMode (outputA,INPUT);
  9.    pinMode (outputB,INPUT);
  10.    
  11.    Serial.begin (9600);
  12.    
  13.    aLastState = digitalRead(outputA);   
  14. }
  15. void loop()
  16. {
  17. aState = digitalRead(outputA); // 读取当前A电平
  18. //如果当前A电平与上一次(初始)A电平不同,说明发生了旋转
  19. if (aState != aLastState)
  20. {     
  21. // 如果A\B电平不同,说明A先于B变化,因此是顺时针旋转。顺时针旋转则计数加一;反之则减一
  22. if (digitalRead(outputB) != aState)
  23. {
  24. counter ++;
  25. } else
  26. {
  27.       counter --;
  28.      }
  29.     Serial.print("Position: ");
  30.     Serial.println(counter);
  31.   }
  32.   aLastState = aState; //更新aLastState状态的记录
  33. }
复制代码

实验效果:
当顺时针旋转的时候,计数数目逐次加一;当逆时针旋转时,技术数目逐次减一。下面所示为顺时针旋转八个单位的过程中串口输出情况。


Stduino IDE是一款面向32位处理器快速入门学习的集成开发平台,目前已经支持Arduino_Core_STM32框架,集聚快捷、高效、免费、开源、易得于一身,软件还集成了GDB调试功能。IDE当前支持的功能有:

    GDB调试
    封装库下载安装
    代码自动补全提示
    中英文模式
    UTF-8\GBK编码格式
    代码快速格式化
    SWD\串口程序下载&调试(已验证)
    DFU程序下载方式(待验证)
    USB HID程序下载方式(待验证)
    maple DFU程序下载方式(待验证)
    maple DFU2程序下载方式(待验证)
    MassStorage程序下载方式(待验证)

更多功能细节请点击图片上水印显示的网址进行了解

已经支持的芯片&板型列表:

    Stduino UNO&Nano
    Nucleo 144 boards
    Nucleo 64 boards
    Nucleo 32 boards
    Discovery boards
    Eval boards
    STM32MP1 series coprocessor boards
    Generic STM32F0 boards
    Generic STM32F1 boards
    Generic STM32F3 boards
    Generic STM32F4 boards
    Generic STM32H7 boards
    Generic STM32L0 boards
    3D printer boards
    LoRa boards
    Electronic Speed Controller boards
    Generic flight controllers
    Garatronics boards
    Midatronics boards

更多功能集成正在进行中~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 10:17 , Processed in 0.042729 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表