attachInterrupt()

描述

掛載編碼器介面的中斷服務函式。

在不同工作模式下,可以觸發中斷的條件也不同:

  1. Pulse/DIR、CW/CCW、A/B Pulse 模式:有 index 訊號中斷(由 setIndexReset() 設定)、比較器中斷(由 setComparator() 設定)、計數器溢出中斷(由 setRange() 設定)、計數器回捲中斷(由 setRange() 設定)。
  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 型別的參數,用來接收觸發中斷的事件類型,共有以下 10 種:

  1. INTR_COMPARE:代表發生比較器中斷事件。
  2. INTR_INDEX:代表發生 index 訊號中斷事件。
  3. INTR_OVERFLOW:代表發生計數溢出中斷事件。(需要 86Duino Coding 105 以後的版本)
  4. INTR_UNDERFLOW:代表發生計數回捲中斷事件。(需要 86Duino Coding 105 以後的版本)
  5. INTR_A_PULSE_LOW:代表 A 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。
  6. INTR_A_PULSE_HIGH:代表 A 針腳上發生脈波由 HIGH 變 LOW 的邊緣觸發中斷事件。
  7. INTR_B_PULSE_LOW:代表 B 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。
  8. INTR_B_PULSE_HIGH:代表 B 針腳上發生脈波由 HIGH 變 LOW 的邊緣觸發中斷事件。
  9. INTR_Z_PULSE_LOW:代表 Z 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。
  10. INTR_Z_PULSE_HIGH:代表 Z 針腳上發生脈波由 HIGH 變 LOW 的邊緣觸發中斷事件。

上面第 1 ~ 4 類型只會出現在 Pulse/DIR、CW/CCW、A/B Pulse 工作模式下;第 5 ~ 10 類型只會出現在 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 ++; // 若 Z 針腳由 LOW 變 HIGH,變數加一
}

void setup() {
  Serial.begin(9600);
  Enc0.begin(MODE_AB_PHASE);
  Enc0.setIndexReset(); // 設定當 index 訊號發生時(即 Z 針腳電位由 LOW 變 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); // 印出 Z 針腳由 LOW 變 HIGH 的總次數
  Serial.print("    ");
  Serial.print("trigger: "); // 印出計數值為 20 的總次數
  Serial.println(num2);
  delay(100);
}

See also

detachInterrupt()
setRange()
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.