ESP32(IDF)EC11旋转编码器使用总结

  • 一、调试过程中遇到的问题
  • 二、硬件
  • 三、电路
    • 接线说明:
  • 四、工作原理
    • 正转波形
    • 反转波形
  • 五、判断正反转
    • 法一
      • 代码实现
      • 结果
    • 法二
    • 法三
      • 代码实现
      • 结果
  • 结语

一、调试过程中遇到的问题

1.正反转判断方法。
2.旋转一格,输出多个脉冲。

二、硬件

主控:ESP32-S2

EC11旋转编码器

三、电路

接线说明:

1.三脚的一边,中间脚接GND,两侧脚接中断I/O。
2.两脚一边,相当于一个按键,按下后两脚导通,所以一脚上拉接I/O,另一脚接GND,正常I/O为高电平,按下后变成低电平,由此来判断是否按下。

四、工作原理

旋转时,编码器会输出脉冲波形。正反转的波形时序不同,以此来判断正反转。

正转波形

黄色为5脚(DT),蓝色为3脚(CLK)

反转波形

五、判断正反转

法一

网上找的方法最简单的是,以DT或者CLK一脚的脉冲为中断信号,发生中断后去读另一脚的电平状态,通过另一脚的电平高低状态判断正反转。我也试了该方法。

我是以蓝色(CLK)作为中断信号,发生上升沿中断后去读黄色波形电平,黄色为高电平,则正转。黄色为低电平,则反转。

代码实现

配置上升沿中断,启动一个任务一直等待检测消息队列中是否有新事件,中断函数中向消息队列添加事件。
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#define EC11_GPIO_SCL 10
#define EC11_GPIO_DAT 11
static xQueueHandle gpioEventQueue = NULL;static void IRAM_ATTR gpio_isr_handler(void* arg)
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpioEventQueue, &gpio_num, NULL);
}static void gpio_task_example(void* arg)
{uint32_t io_num;for(;;) {if(xQueueReceive(gpioEventQueue, &io_num, portMAX_DELAY)) {if(gpio_get_level(EC11_GPIO_DAT)){printf("+ turn\n");}elseprintf("- turn\n");          }
}void app_main(void)
{printf("Hello EC11!\n");gpio_config_t gpio_10 = {//IO配置为中断.pin_bit_mask = 1ULL << EC11_GPIO_SCL,.mode = GPIO_MODE_INPUT,.intr_type = GPIO_INTR_POSEDGE,//上升沿.pull_up_en = 1,//上拉};gpio_config(&gpio_10);//配置gpioEventQueue = xQueueCreate(10, sizeof(uint32_t));xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 1, NULL);    gpio_install_isr_service(0);gpio_isr_handler_add(EC11_GPIO_SCL, gpio_isr_handler, (void*)EC11_GPIO_SCL);while(1){vTaskDelay(5000 / portTICK_PERIOD_MS);}
}

结果

正反转不能准确判断,个人觉得是因为发生中断后去读另一个io电平不够及时。黄色(DT)脉冲低电平只持续2ms,而中断发生后是向消息队列中写事件,然后再在事件处理任务中检测正反转,这期间的任务切换估计花费的时间较长,导致读取到的电平不准确。(完全个人凭经验猜测,如果不对,请指正)

法二

不用消息队列,在中断函数中直接去读取电平。(貌似是中断函数中不能打印log,才使用消息队列的),因为我没有其他外设来展现正反转,所以必须打印,该方法没有亲自实验,如果有大佬实验了,请告知是否可行。

法三

我使用的另一种方法是,两脚都接中断,检测下降沿,根据两引脚中断的先后顺序,判断正反转。

代码实现

创建一个定时清标志位的任务,既可以复位标志,又可以控制旋转检测的频率(转好几格都按一次处理)。
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#define EC11_GPIO_SCL 10
#define EC11_GPIO_DAT 11
static u_int8_t count = 0;
static xQueueHandle gpioEventQueue = NULL;static void time_out_task(void *arg)
{vTaskDelay(200 / portTICK_PERIOD_MS);count = 0;vTaskDelete(NULL);
}static void IRAM_ATTR gpio_isr_handler(void* arg)
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpioEventQueue, &gpio_num, NULL);
}static void gpio_task_example(void* arg)
{uint32_t io_num;for(;;) {if(xQueueReceive(gpioEventQueue, &io_num, portMAX_DELAY)) {// printf("GPIO[%d] intr, val: %d\n", io_num, gpio_get_level(io_num));if(io_num == EC11_GPIO_SCL){                if(count == 1){count = 3;printf("+ turn\n");}else if(count == 0){count = 2;xTaskCreate(time_out_task, "time_out_task", 2048, NULL, 2, NULL);}                                  } else if(io_num == EC11_GPIO_DAT){if(count == 2){count = 3;printf("- turn\n");}else if(count==0){count = 1;xTaskCreate(time_out_task, "time_out_task", 2048, NULL, 2, NULL);}}           }}
}void app_main(void)
{printf("Hello EC11!\n");gpio_config_t gpio_10 = {.pin_bit_mask = 1ULL << EC11_GPIO_SCL,.mode = GPIO_MODE_INPUT,.intr_type = GPIO_INTR_NEGEDGE,.pull_up_en = 1,};gpio_config_t gpio_11 = {.pin_bit_mask = 1ULL << EC11_GPIO_DAT,.mode = GPIO_MODE_INPUT,.intr_type = GPIO_INTR_NEGEDGE,.pull_up_en = 1,};gpio_config(&gpio_10);gpio_config(&gpio_11);gpioEventQueue = xQueueCreate(10, sizeof(uint32_t));xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 1, NULL);    gpio_install_isr_service(0);gpio_isr_handler_add(EC11_GPIO_SCL, gpio_isr_handler, (void*)EC11_GPIO_SCL);gpio_isr_handler_add(EC11_GPIO_DAT, gpio_isr_handler, (void*)EC11_GPIO_DAT);while(1){vTaskDelay(5000 / portTICK_PERIOD_MS);}
}

结果


判断非常准确,快速旋转时,可能转好几格都只按一次旋转处理了,可以调超时任务的处理周期解决。

结语

如果该文章对你有所帮助,希望能一件三连。

ESP32(IDF)EC11旋转编码器使用总结相关推荐

  1. ESP32蓝牙+EC11旋转编码器实现对电脑音量控制

    ESP32蓝牙 + EC11旋转编码器实现对电脑音量控制 ✨本项目基于Arduino开发框架下功能实现.

  2. 松下EC11旋转编码器(奥迪旋钮)

    松下EC11旋转编码器(奥迪旋钮) 1. 背景介绍: 一直都很喜欢奥迪旋钮的质感做工,在淘宝上看见A6的旋转编码器,想购入装到DIY设备上. 由于找不到MMI大旋钮的旋转编码器型号,因此选购了音量调节 ...

  3. EC11旋转编码器驱动程序

    EC11驱动程序 不多做介绍,百度上很多相关的介绍 首先,放上参考文档 代码有正转.反转.按下正转.按下反转.单机.双击.长按和长安松手检测,有什么问题可以在下方留言 我是对该文档代码进行一些修改,偏 ...

  4. 使用Arduino开发板连接ec11旋转编码器

    使用Arduino开发板连接ec11旋转编码器 因为最近要用到旋转编码器,从网上花了好长时间找了好多关于arduino使用旋转编码器的资料,总是找不到合适的,最后总结了一下(部分内容有借鉴,仅作分享, ...

  5. 认识EC11旋转编码器编写驱动程序

    前言 抛开工作,以电子爱好者的身份,单片机玩多了都会想着在单片机的外围设备玩出一些花样来. 这其中首先想到的就是"升级"输入输出设备. 这里先说一说我们常给单片机使用的输入设备. ...

  6. STM32F103 + 0.96/1.3“ I2C OLED + EC11旋转编码器多级菜单demo

    STM32F103 + 0.96/1.3" I2C OLED + EC11旋转编码器多级菜单demo

  7. linux4.6 EC11旋转编码器的驱动

    最近项目使用了旋转编码器EC11,遍查内核,发现并没有它的驱动,查了查CSDN,终于找到一篇有用的.根据自己的需要和对最基础的gpio_key.c的理解,我改写出了一份EC11的专用驱动. 感谢下面博 ...

  8. EC11旋转编码器,stm32f103驱动程序

    EC11旋转编码器,stm32f103驱动程序 1.EC11手册的要点 手册中推荐的电路(已含有RC滤波): 输出波形特点: 2.硬件电路 3.驱动程序关键点 4.输出现象 1.EC11手册的要点 注 ...

  9. STM32CubeMX EC11旋转编码器开发心路历程(encode模式 外部中断模式 普通IO口模式 定时器模式探索)

    文章目录 ENCODE模式探索 普通IO口探索 定时器使用 外部中断探索 编码器开关的理解 最后的实现方案 这篇文章主要还是记录整个过程以及想法的不断改进,对于一些实际的操作还有代码,我准备都分开写到 ...

最新文章

  1. cv2.inrange()用法
  2. Cordova error:npm install -g ios-deploy
  3. 所长不会用计算机,梅州市公安局: 两派出所所长不会电脑被停职
  4. c语言标准io中可读可写,C语言标准IO: [先读再feof] VS [先feof再读]
  5. 为什么浏览器不能跨域
  6. 生成器作为(快速失败)状态机
  7. java jolt tuxedo_java通过jolt调用tuxedo服务.xls
  8. mysql 默认page大小_Innodb优化之修改页大小
  9. Linux Cpu 利用率计算
  10. WPF 美化界面,样式的使用
  11. 值得收藏的30道Python练手题(附详细答案)
  12. WebRtc与P2P
  13. 网页中的一键加QQ群、唤起QQ群聊天窗口
  14. 房地产项目开发流程参考
  15. linux alarm函数clock,linux c之alarm函数的使用,定时器的实现
  16. android 小米角标,关于 小米手机 角标的问题
  17. redis 内存分析工具 RMA 使用
  18. 20191008_1308使用Node.js对文件进行批量重命名
  19. Go Mod引用私有库
  20. 骨传导运动耳机哪个牌子好,四大品牌骨传导运动耳机推荐

热门文章

  1. cdr软件怎么绘制立体图?cdr绘制立体图形的教程
  2. 谈笑间 樯橹灰飞烟灭
  3. Android使用json和Http实现与服务器的简单交互
  4. 微信小程序:2048小游戏
  5. 51单片机LED与数码管的学习
  6. 四大开源分布式存储_开源软件丨网易开源分布式存储系统 Curve
  7. Java程序设计 北京大学 Week3互评作业
  8. 【MATLAB基础】MATLAB与Word互联(3)
  9. 视频配音篇,如何使用百度翻译将文本转换为mp3语音?
  10. 笔记本硬盘数据清除之后如何找回