attachInterrupt()
描述
挂载编码器介面的中断服务函式。
在不同工作模式下,可以触发中断的条件也不同:
- Pulse/DIR、CW/CCW、A/B Pulse 模式:有 index 讯号中断(由 setIndexReset() 设定)、比较器中断(由 setComparator() 设定)。
- 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 型别的参数,用来接收触发中断的事件类型,共有以下 8 种:
INTR_COMPARE
:代表发生比较器中断事件。INTR_INDEX
:代表发生index 讯号中断事件。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、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.