阳光总在风雨后708 2025-08-18 14:24 采纳率: 80%
浏览 4

没有SW引出的编码器该如何实现按键功能

​请问这个编码器没有SW引脚引出,那是怎么检测按键按下的呢?
看了好久是不是不旋转的情况下,SIGA是1;
按下按键后SW被拉低变成0,然后SA=0;
有因为SA引到了SIGA,所以SIGA变成0。
请大家帮我分析一下这样对不对呢?头大了555

img


img


这个是找到的一个例程,可以看到一般是有单独的SW引脚引出的:

img

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-18 14:25
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提到的这个问题非常典型,没有SW引出的编码器(即旋转编码器没有单独的按键引脚),确实会让人感到困惑。不过,这类编码器通常通过检测信号线之间的短路或电平变化来判断是否被按下。


    ✅ 一、问题分析

    1. 编码器结构

    旋转编码器一般有以下引脚:

    • A(SIGA)
    • B(SIGB)
    • SW(开关)(可选)

    如果SW引脚没有引出,说明这个编码器是机械式按键,其SW功能是通过内部结构实现的,而不是外部引脚。

    2. SW的实现原理

    在没有SW引脚的情况下,编码器的按键动作通常是通过A/B信号线之间的短路来检测的:

    • 未按下按键时,A和B信号线是独立的,分别输出高低电平。
    • 按下按键时,A和B引脚之间会被短接(或通过内部电路连接),导致A和B的电平发生变化,从而触发按键事件。

    ✅ 二、如何检测按键按下的方法

    1. 通过A/B信号线的逻辑变化判断按键

    你可以通过检测A和B信号线的逻辑组合来判断是否按键:

    | A | B | 状态 | 是否按键 | |---|---|------------|----------| | 0 | 0 | 无效状态 | 否 | | 0 | 1 | 正常旋转 | 否 | | 1 | 0 | 正常旋转 | 否 | | 1 | 1 | 按键状态 | 是 |

    注意: 不同型号的编码器可能有不同的逻辑,需要根据实际测试确定。


    ✅ 三、解决方案步骤(有序列表)

    1. 初始化两个GPIO引脚用于读取SIGA和SIGB的电平

      • 使用digitalRead()函数读取A和B的值。
    2. 定义一个变量保存上一次的状态

      • 用于比较当前状态与上次状态的变化。
    3. 读取当前A和B的值,并判断是否为“按键状态”(如A=1, B=1)

      • 如果是,则认为按键被按下。
    4. 添加去抖动处理

      • 使用延时或软件去抖动(如delay(50))防止误判。
    5. 记录按键事件并执行对应操作

      • 比如增加计数、切换模式等。

    ✅ 四、示例代码(Arduino)

    // 定义引脚
    #define SIGA_PIN 2
    #define SIGB_PIN 3
    
    // 上一次的状态
    int lastState = 0;
    
    void setup() {
      pinMode(SIGA_PIN, INPUT_PULLUP);
      pinMode(SIGB_PIN, INPUT_PULLUP);
      Serial.begin(9600);
    }
    
    void loop() {
      int a = digitalRead(SIGA_PIN);
      int b = digitalRead(SIGB_PIN);
    
      // 判断是否为按键状态(例如 A=1, B=1)
      if (a == HIGH && b == HIGH) {
        // 按键被按下
        Serial.println("按键被按下!");
        
        // 去抖动
        delay(50);
        
        // 再次确认按键状态
        a = digitalRead(SIGA_PIN);
        b = digitalRead(SIGB_PIN);
        
        if (a == HIGH && b == HIGH) {
          // 执行按键操作
          // 例如:增加计数器
        }
      }
    
      // 更新上次状态
      lastState = a << 1 | b;
      delay(10); // 避免过快读取
    }
    

    ✅ 五、关键点总结

    • 没有SW引脚的编码器,可以通过A/B信号线的逻辑组合来判断按键是否被按下。
    • 按键状态通常表现为A和B同时为高电平(具体需根据实际测试)。
    • 去抖动非常重要,否则容易误触发。
    • 不同编码器可能逻辑不同,建议先用示波器或逻辑分析仪观察信号变化。

    如果你能提供具体的编码器型号或数据手册,我可以进一步帮你分析它的按键逻辑

    评论

报告相同问题?

问题事件

  • 创建了问题 8月18日