ZBLOG

attachInterrupt(digitalPinToInterrupt(ENCODER_EL1), encoderISR1, CHANGE); attachInterrupt(digitalPinToInterrupt(ENCODER_EL2), encoderISR2, CHANGE); attachInterrupt(digitalPinToInterrupt(ENCODER_ER1), encoderISR3, CHANGE); attachInterru...

您提供的代码片段是Arduino中使用外部中断来处理编码器输入的典型用法。通过attachInterrupt()函数,您可以将特定引脚上的变化(如电平变换)与一个ISR(中断服务例程)关联起来,从而在每次编码器脉冲到来时更新计数。

完整示例

以下是一个完整的示例,其中包含了如何设置这些中断、编码器ISR以及如何计算RPM:

  1. // 编码器引脚定义
  2. #define ENCODER_EL1 2 // 左侧电机编码器引脚1
  3. #define ENCODER_EL2 3 // 左侧电机编码器引脚2
  4. #define ENCODER_ER1 4 // 右侧电机编码器引脚1
  5. #define ENCODER_ER2 5 // 右侧电机编码器引脚2
  6. // 全局变量用于存储编码器计数
  7. volatile int encoderCount1 = 0;
  8. volatile int encoderCount2 = 0;
  9. volatile int encoderCount3 = 0;
  10. volatile int encoderCount4 = 0;
  11. unsigned long lastTime3 = 0;
  12. unsigned long lastTime4 = 0;
  13. const int PULSES_PER_REVOLUTION = 20; // 根据实际情况设置这个值
  14. float speed3 = 0;
  15. float speed4 = 0;
  16. // 初始化设置
  17. void setup() {
  18. Serial.begin(9600);
  19. // 设置编码器引脚为输入,并启用内部上拉电阻(如果需要)
  20. pinMode(ENCODER_EL1, INPUT_PULLUP);
  21. pinMode(ENCODER_EL2, INPUT_PULLUP);
  22. pinMode(ENCODER_ER1, INPUT_PULLUP);
  23. pinMode(ENCODER_ER2, INPUT_PULLUP);
  24. // 附加中断处理程序
  25. attachInterrupt(digitalPinToInterrupt(ENCODER_EL1), encoderISR1, CHANGE);
  26. attachInterrupt(digitalPinToInterrupt(ENCODER_EL2), encoderISR2, CHANGE);
  27. attachInterrupt(digitalPinToInterrupt(ENCODER_ER1), encoderISR3, CHANGE);
  28. attachInterrupt(digitalPinToInterrupt(ENCODER_ER2), encoderISR4, CHANGE);
  29. }
  30. // 循环执行的代码
  31. void loop() {
  32. Encoder_Read();
  33. }
  34. // 中断服务程序 (ISR)
  35. void encoderISR1() {
  36. encoderCount1++;
  37. }
  38. void encoderISR2() {
  39. encoderCount2++;
  40. }
  41. void encoderISR3() {
  42. encoderCount3++;
  43. }
  44. void encoderISR4() {
  45. encoderCount4++;
  46. }
  47. // 编码器读取速度并打印 RPM
  48. void Encoder_Read() {
  49. if (millis() - lastTime3 >= 500) {
  50. float rpm3 = (encoderCount3 * 60.0) / (6 * PULSES_PER_REVOLUTION);
  51. speed3 = rpm3;
  52. encoderCount3 = 0;
  53. lastTime3 = millis();
  54. Serial.print("Motor R1 Speed: ");
  55. Serial.print(rpm3);
  56. Serial.println(" RPM");
  57. }
  58. if (millis() - lastTime4 >= 500) {
  59. float rpm4 = (encoderCount4 * 60.0) / (6 * PULSES_PER_REVOLUTION);
  60. speed4 = rpm4;
  61. encoderCount4 = 0;
  62. lastTime4 = millis();
  63. Serial.print("Motor R2 Speed: ");
  64. Serial.print(rpm4);
  65. Serial.println(" RPM");
  66. }
  67. }

注意事项:

  • 中断安全:在 ISR 中尽量避免使用延时和复杂逻辑,因为这会阻塞其他任务。
  • 噪声问题:有时可能会遇到抖动或噪声导致错误计数,可以考虑使用更高级别的去抖动技术,例如滤波。
  • 有效性测试:确保您的硬件连接正确,所有编写的代码能够正常响应真实信号。

这个示例展示了如何利用Arduino中的中断功能,以高效地捕捉和处理来自旋转编码器的输入信号。如果您有其他问题或需求,请随时告诉我!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?