ZBLOG

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

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

硬件连接

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

示例代码

  1. // 定义编码器引脚
  2. #define ENCODER_A_A_PIN 2 // 编码器 A 输出 A 引脚 (通常为 INT0)
  3. #define ENCODER_A_B_PIN 3 // 编码器 A 输出 B 引脚 (通常为 INT1)
  4. #define ENCODER_B_A_PIN 4 // 编码器 B 输出 A 引脚 (通常为 INT2)
  5. #define ENCODER_B_B_PIN 5 // 编码器 B 输出 B 引脚 (通常为 INT3)
  6. // 全局变量用于存储计数
  7. volatile int encoderACount = 0;
  8. volatile int encoderBCount = 0;
  9. // 上一次编码器的状态
  10. volatile bool lastStateA = false;
  11. volatile bool lastStateB = false;
  12. void setup() {
  13. Serial.begin(9600);
  14. // 设置编码器引脚为输入并启用内部上拉电阻
  15. pinMode(ENCODER_A_A_PIN, INPUT_PULLUP);
  16. pinMode(ENCODER_A_B_PIN, INPUT_PULLUP);
  17. pinMode(ENCODER_B_A_PIN, INPUT_PULLUP);
  18. pinMode(ENCODER_B_B_PIN, INPUT_PULLUP);
  19. // 附加中断处理程序
  20. attachInterrupt(digitalPinToInterrupt(ENCODER_A_A_PIN), encoderAISR, CHANGE);
  21. attachInterrupt(digitalPinToInterrupt(ENCODER_B_A_PIN), encoderBISR, CHANGE);
  22. }
  23. void loop() {
  24. // 打印当前计数,每500ms打印一次
  25. static unsigned long lastPrintTime = millis();
  26. if (millis() - lastPrintTime >= 500) {
  27. Serial.print("Encoder A Count: ");
  28. Serial.println(encoderACount);
  29. Serial.print("Encoder B Count: ");
  30. Serial.println(encoderBCount);
  31. lastPrintTime = millis();
  32. }
  33. }
  34. // 中断服务程序 (ISR) for Encoder A
  35. void encoderAISR() {
  36. bool currentStateA = digitalRead(ENCODER_A_B_PIN);
  37. if (currentStateA != lastStateA) {
  38. if (currentStateA == HIGH) {
  39. encoderACount++;
  40. } else {
  41. encoderACount--;
  42. }
  43. }
  44. lastStateA = currentStateA;
  45. }
  46. // 中断服务程序 (ISR) for Encoder B
  47. void encoderBISR() {
  48. bool currentStateB = digitalRead(ENCODER_B_B_PIN);
  49. if (currentStateB != lastStateB) {
  50. if (currentStateB == HIGH) {
  51. encoderBCount++;
  52. } else {
  53. encoderBCount--;
  54. }
  55. }
  56. lastStateB = currentStateB;
  57. }

注意事项:

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?