ZBLOG

arduino调用中断1-4读取编码器

在Arduino中,可以使用外部中断来读取编码器的信号。以下是一个示例,展示如何使用四个外部中断(INT0、INT1、INT2和INT3)来读取两个编码器的旋转脉冲。

硬件连接

  • 编码器的输出引脚连接到Arduino的外部中断引脚上。
    • 假设您将编码器A连接到pin 2(对应INT0),pin 3(对应INT1)。
    • 编码器B连接到其他两个引脚,例如: pin 4(对应 INT2),和 pin 5(对应 INT3)。

示例代码

// 定义编码器引脚
#define ENCODER_A_A_PIN 2 // 编码器 A 输出 A 引脚 (通常为 INT0)
#define ENCODER_A_B_PIN 3 // 编码器 A 输出 B 引脚 (通常为 INT1)
#define ENCODER_B_A_PIN 4 // 编码器 B 输出 A 引脚 (通常为 INT2)
#define ENCODER_B_B_PIN 5 // 编码器 B 输出 B 引脚 (通常为 INT3)

// 全局变量用于存储计数
volatile int encoderACount = 0;
volatile int encoderBCount = 0;

// 上一次编码器的状态
volatile bool lastStateA = false;
volatile bool lastStateB = false;

void setup() {
    Serial.begin(9600);
    
    // 设置编码器引脚为输入并启用内部上拉电阻
    pinMode(ENCODER_A_A_PIN, INPUT_PULLUP);
    pinMode(ENCODER_A_B_PIN, INPUT_PULLUP);
    pinMode(ENCODER_B_A_PIN, INPUT_PULLUP);
    pinMode(ENCODER_B_B_PIN, INPUT_PULLUP);

    // 附加中断处理程序
    attachInterrupt(digitalPinToInterrupt(ENCODER_A_A_PIN), encoderAISR, CHANGE);  
    attachInterrupt(digitalPinToInterrupt(ENCODER_B_A_PIN), encoderBISR, CHANGE);  
}

void loop() {
    // 打印当前计数,每500ms打印一次
    static unsigned long lastPrintTime = millis();
    
    if (millis() - lastPrintTime >= 500) {
        Serial.print("Encoder A Count: ");
        Serial.println(encoderACount);
        
        Serial.print("Encoder B Count: ");
        Serial.println(encoderBCount);

        lastPrintTime = millis();
    }
}

// 中断服务程序 (ISR) for Encoder A
void encoderAISR() {
    bool currentStateA = digitalRead(ENCODER_A_B_PIN); 
    if (currentStateA != lastStateA) { 
        if (currentStateA == HIGH) { 
            encoderACount++; 
        } else { 
            encoderACount--; 
        }
    }
    lastStateA = currentStateA;  
}

// 中断服务程序 (ISR) for Encoder B
void encoderBISR() {
    bool currentStateB = digitalRead(ENCODER_B_B_PIN); 
    if (currentStateB != lastStateB) {  
        if (currentStateB == HIGH) {  
            encoderBCount++;  
        } else {  
            encoderBCount--;  
        }
    }
    lastStateB = currentStateB;   
}

注意事项:

  1. 去抖动:确保你的编码器硬件设计能够抵消机械抖动影响,必要时可以考虑软件去抖动策略。
  2. 方向计算:以上代码假设你在每次读取状态变化时可以得知旋转方向,根据具体编码器类型,可能需要进一步调整。
  3. 可调参数:根据应用需求,可以选择不同的方法来处理编码信号,例如实现速度测量等功能。

此示例简单地通过外部中断来监测两个不同的旋转编码器,并在串行监视窗口打印当前计数。如果您有任何疑问或其他需求,请随时告诉我!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19269

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?