EC11 旋转编码器的使用

您所在的位置:网站首页 aic2863一5引脚图 EC11 旋转编码器的使用

EC11 旋转编码器的使用

2023-09-10 16:03| 来源: 网络整理| 查看: 265

EC11 参数 脉冲数:20个 带开关:有 操作寿命:50000次 最大额定:10mA 5V DC 轴型:半轴柄/梅花柄

EC11 原理图

EC11 一共有5个引脚:

S1 按钮引脚1 S2 按钮引脚2 A A相引脚 B B 相引脚 C 是 A和B的公共引脚。

3个10K电阻是上拉电阻,默认三个引脚都输出高电平;3个470电阻是输出电阻,也可以 不要。

旋转编码器正转时的时序波形

旋转编码器正反转判断

通过编码器旋转时的波形可以看到,如果 A 下降沿时,判断B的电平高低,如果为高是一个方向如果是低则为另一个方向。

分享一个国外的EC11 硬件消抖方案

博客网址:Strömlinge: Rotary Encoder Debouncer (stroemlinge.blogspot.com)

方案文档下载:EC11 debouncer - Google 云端硬盘

这个方案用到的两个芯片为非门反相器集成电路,一个一路的一个两路的。

由于该方案用到了反相器,所以默认3个IO口输出为低电平。单片机外部中断要设置成上升沿触发。

原理图

分享一个国外的EC11软件消抖解决方案

YouTube 地址: Coding a KY-040 Rotary Encoder on a Raspberry Pi Pico - Detailed Explanation & Step by Step Code

GitHub 地址:gurgleapps/rotary-encoder: Code to drive a rotary encoder in micropython (github.com)

该项目用的硬件是树莓派这里来分析下代码实现:

rotary.py12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667import machineimport utime as timefrom machine import Pinimport micropythonclass Rotary: ROT_CW = 1 # 顺时针旋转 ROT_CCW = 2 # 逆时针旋转 SW_PRESS = 4 # 中键按下 SW_RELEASE = 8 # 中键弹起释放 def __init__(self,dt,clk,sw): # 一下3行为指定连接的硬件接口 self.dt_pin = Pin(dt, Pin.IN) self.clk_pin = Pin(clk, Pin.IN) self.sw_pin = Pin(sw, Pin.IN) # 默认 dt 和 clk 都为1 ,dt 左移一位结果为 2(二进制10),再与 1 按位相或运算最后结果为 3(二进制11) # (self.dt_pin.value() 100) { if(SW_State == RESET) { ec11_1.sw_mode_flag = 3; // 双击 ec11_1.sw_down_time = 0; ec11_1.sw_down_flag = 0; ec11_1.sw_down_count = 0; } else { ec11_1.sw_mode_flag = 1; // 单击 ec11_1.sw_down_time = 0; ec11_1.sw_down_flag = 0; ec11_1.sw_down_count = 0; } } // 长按 if(ec11_1.sw_mode_flag == 2) { // 指定多少毫秒加1 if(ec11_1.sw_long_press_time == LED_AUTO_SETP) { test_number = 0; ec11_1.sw_long_press_time = 0; } FlagStatus sw_state_temp = gpio_input_bit_get(ENCODER_SW_GPIO_PORT, ENCODER_SW_PIN); if(sw_state_temp == SET) { ec11_1.sw_mode_flag = 0; } } // 单击 if(ec11_1.sw_mode_flag == 1) { // test_number++; ec11_1.sw_mode_flag = 0; } // 双击 if(ec11_1.sw_mode_flag == 3) { // test_number += 10; ec11_1.sw_mode_flag = 0; } /* 旋转方向处理 */ if(ec11_1.clk_rotate_flag == 1) { FlagStatus clk_value = gpio_input_bit_get(ENCODER_CLK_GPIO_PORT, ENCODER_CLK_PIN); FlagStatus dt_value = gpio_input_bit_get(ENCODER_DT_GPIO_PORT, ENCODER_DT_PIN); uint8_t dt_temp = (uint8_t)dt_value; uint8_t clk_temp = (uint8_t)clk_value; rotary_chanage(dt_temp, clk_temp); if(ec11_1.directron == 1) { test_number++; ec11_1.directron = 0; ec11_1.clk_rotate_flag = 0; } if(ec11_1.directron == 2) { test_number--; ec11_1.directron = 0; ec11_1.clk_rotate_flag = 0; } } }static void rotary_chanage(uint8_t clk, uint8_t dt){ ec11_1.new_status = (dt 900为长按 */ uint8_t sw_mode_flag; /* 单击(1),长按(2),双击(3),未知(0)*/ uint8_t sw_down_flag; /* SW 下降沿标志,下降沿触发时为:1,用完后在适当的时候设置为:0 */ uint8_t sw_down_count; /* 下降沿计数,用户判断状态的临时计数值 */ uint16_t sw_long_press_time; /* sw 长按时间,用于判断长按时多长时间执行一次相应代码 */ uint8_t clk_flag; /* 旋转标志 */ uint8_t directron; /* 1: 顺时针 2:逆时针 0:默认 */ uint16_t clk_count;} EC11_t;// 创建结构体并初始化EC11_t ec11_1 = { .sw_down_count = 0, .sw_down_flag = 0, .sw_down_time = 0, .sw_long_press_time = 0, .sw_mode_flag = 0, // 方向判断 .clk_flag = 0, .directron = 0, .clk_count = 0,};

gd32f1x0_it.c

123456789101112131415161718192021222324252627282930/******************************************************************************* * @brief 0-1中断 * @brief CLK 与 DT ******************************************************************************/void EXTI0_1_IRQHandler(void){ FlagStatus clk_value = gpio_input_bit_get(ENCODER_CLK_GPIO_PORT, ENCODER_CLK_PIN); FlagStatus dt_value = gpio_input_bit_get(ENCODER_DT_GPIO_PORT, ENCODER_DT_PIN); // 触发外部中断 CLK if(SET == exti_interrupt_flag_get(ENCODER_CLK_EXTI_LINE) && clk_value == RESET && ec11_1.clk_count == 0) { ec11_1.clk_flag = 0; if(dt_value) ec11_1.clk_flag = 1; ec11_1.clk_count = 1; exti_interrupt_flag_clear(ENCODER_CLK_EXTI_LINE); } if(SET == exti_interrupt_flag_get(ENCODER_CLK_EXTI_LINE) && clk_value == SET && ec11_1.clk_count == 1) { if(dt_value ==0 && ec11_1.clk_flag == 1) test_number++; if(dt_value && ec11_1.clk_flag == 0) { test_number--; } ec11_1.clk_count = 0; exti_interrupt_flag_clear(ENCODER_CLK_EXTI_LINE); }}


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3