attachInterrupt()

描述

挂载编码器介面的中断服务函式。

在不同工作模式下,可以触发中断的条件也不同:

  1. Pulse/DIR、CW/CCW、A/B Pulse 模式:有 index 讯号中断(由 setIndexReset() 设定)、比较器中断(由 setComparator() 设定)。
  2. PWM 脉波捕捉模式:有脉波由 LOW 变 HIGH 的边缘触发中断与由 HIGH 变 LOW 的边缘触发中断。
  3. SSI 模式:没有中断触发条件。

语法


Enc0.attachInterrupt(isr)
Enc1.attachInterrupt(isr)
Enc2.attachInterrupt(isr)
Enc3.attachInterrupt(isr)

参数

Enc0、Enc1、Enc2、Enc3:分别对应 ENC0、ENC1、ENC2、ENC3 编码器介面。

isr:中断服务函式。此函式必须有一个 int 型别的参数,用来接收触发中断的事件类型,共有以下 8 种:

  1. INTR_COMPARE:代表发生比较器中断事件。
  2. INTR_INDEX:代表发生index 讯号中断事件。
  3. INTR_A_PULSE_LOW:代表 A 针脚上发生脉波由 LOW 变 HIGH 的边缘触发中断事件。
  4. INTR_A_PULSE_HIGH:代表 A 针脚上发生脉波由 HIGH 变 LOW 的边缘触发中断事件。
  5. INTR_B_PULSE_LOW:代表 B 针脚上发生脉波由 LOW 变 HIGH 的边缘触发中断事件。
  6. INTR_B_PULSE_HIGH:代表 B 针脚上发生脉波由 HIGH 变 LOW 的边缘触发中断事件。
  7. INTR_Z_PULSE_LOW:代表 Z 针脚上发生脉波由 LOW 变 HIGH 的边缘触发中断事件。
  8. INTR_Z_PULSE_HIGH:代表 Z 针脚上发生脉波由 HIGH 变 LOW 的边缘触发中断事件。

上面第1、2类型只会出现在 Pulse/DIR、CW/CCW、A/B Pulse 工作模式下;第3~8类型只会出现在 PWM 脉波捕捉模式下。

回传

无回传值

范例

#include <Encoder.h>

volatile unsigned long num1 = 0L;
volatile unsigned long num2 = 0L;
void encoder_isr(int flag) { // ISR 函式
    if(flag == INTR_COMPARE)
      num1++; // 若发生计数值符合指定值的话,变数加一
    else if(flag == INTR_INDEX)
      num2 ++; // 若马达转一圈,变数加一
}

void setup() {
  Serial.begin(9600);
  Enc0.begin(MODE_AB_PHASE);
  Enc0.setIndexReset(); // 设定当 index 讯号发生时(即 Z 针脚电位变为 HIGH),触发中断来呼叫 ISR 函式
  Enc0.setComparator(20L); // 设定计数值达到 20 时,触发中断来呼叫 ISR 函式
  Enc0.attachInterrupt(encoder_isr); // 挂载 ISR 函式并启动中断功能
}

void loop() {
  Serial.print("Pulse number: ");
  Serial.print(Enc0.read()); // 读取 pulse 数
  Serial.print("    ");
  Serial.print("index: ");
  Serial.print(num1); // 印出旋转编码器所转的总圈数
  Serial.print("    ");
  Serial.print("trigger: "); // 印出计数值为 20 的总次数
  Serial.println(num2);
  delay(100);
}

See also

begin()
setIndexReset()
setComparator()


函式库参考主页面

The text of the 86Duino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.