attachInterrupt()
描述
掛載編碼器介面的中斷服務函式。
在不同工作模式下,可以觸發中斷的條件也不同:
- Pulse/DIR、CW/CCW、A/B Pulse 模式:有 index 訊號中斷(由 setIndexReset() 設定)、比較器中斷(由 setComparator() 設定)、計數器溢出中斷(由 setRange() 設定)、計數器回捲中斷(由 setRange() 設定)。
- PWM 脈波捕捉模式:有脈波由 LOW 變 HIGH 的邊緣觸發中斷與由 HIGH 變 LOW 的邊緣觸發中斷。
- SSI 模式:沒有中斷觸發條件。
語法
Enc0.attachInterrupt(isr)
Enc1.attachInterrupt(isr)
Enc2.attachInterrupt(isr)
Enc3.attachInterrupt(isr)
參數
Enc0、Enc1、Enc2、Enc3:分別對應 ENC0、ENC1、ENC2、ENC3 編碼器介面。
isr:中斷服務函式。此函式必須有一個 int 型別的參數,用來接收觸發中斷的事件類型,共有以下 10 種:
INTR_COMPARE:代表發生比較器中斷事件。INTR_INDEX:代表發生 index 訊號中斷事件。INTR_OVERFLOW:代表發生計數溢出中斷事件。(需要 86Duino Coding 105 以後的版本)INTR_UNDERFLOW:代表發生計數回捲中斷事件。(需要 86Duino Coding 105 以後的版本)INTR_A_PULSE_LOW:代表 A 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。INTR_A_PULSE_HIGH:代表 A 針腳上發生脈波由 HIGH 變 LOW 的邊緣觸發中斷事件。INTR_B_PULSE_LOW:代表 B 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。INTR_B_PULSE_HIGH:代表 B 針腳上發生脈波由 HIGH 變 LOW 的邊緣觸發中斷事件。INTR_Z_PULSE_LOW:代表 Z 針腳上發生脈波由 LOW 變 HIGH 的邊緣觸發中斷事件。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.
