霍尔编码器
编码器代码
image.png

网上找的代码

  1. #include <MsTimer2.h>
  2. const int right_R1=8;
  3. const int right_R2=12;
  4. const int PWM_R=10;
  5. const int left_L1=7;
  6. const int left_L2=6;
  7. const int PWM_L=9;
  8. const int PinA_left = 5; //定义检测左电机脉冲的引脚为D5
  9. const int PinA_right = 4; //定义检测右电机脉冲的引脚为D4
  10. int times=0,newtime=0,d_time=100; //时间,最新的时间,时间间隔
  11. int valA=0,valB=0,flagA=0,flagB=0; //变量valA和valB用于计算脉冲数
  12. void setup()
  13. {
  14. Serial.begin(9600);
  15. pinMode(right_R1,OUTPUT); //TB6612的引脚都设置为输出
  16. pinMode(right_R2,OUTPUT);
  17. pinMode(PWM_R,OUTPUT);
  18. pinMode(left_L1,OUTPUT);
  19. pinMode(left_L2,OUTPUT);
  20. pinMode(PWM_L,OUTPUT);
  21. pinMode(PinA_left,INPUT); //设置检测脉冲的引脚为输入状态
  22. pinMode(PinA_right,INPUT);
  23. MsTimer2::set(100, inter); // 100ms 触发一次中断,调用函数inter()
  24. MsTimer2::start(); //开启中断
  25. }
  26. void loop()
  27. {
  28. //两电机都正转
  29. digitalWrite(right_R1,HIGH);
  30. digitalWrite(right_R2,LOW);
  31. digitalWrite(left_L1,HIGH);
  32. digitalWrite(left_L2,LOW);
  33. analogWrite(PWM_R,100); //写入PWM值0~255(速度)
  34. analogWrite(PWM_L,200);
  35. if(digitalRead(PinA_left)==HIGH&&flagA==0) //计算脉冲值
  36. {
  37. valA++;
  38. flagA=1;
  39. }
  40. if(digitalRead(PinA_left)==LOW&&flagA==1)
  41. {
  42. valA++;
  43. flagA=0;
  44. }
  45. if(digitalRead(PinA_right)==HIGH&&flagB==0)
  46. {
  47. valB++;
  48. flagB=1;
  49. }
  50. if(digitalRead(PinA_right)==LOW&&flagB==1)
  51. {
  52. valB++;
  53. flagB=0;
  54. }
  55. }
  56. //中断函数
  57. void inter()
  58. {
  59. sei(); //允许全局中断
  60. Serial.print("valA = "); //在串口监视器上打印出脉冲值
  61. Serial.println(valA);
  62. Serial.print("valB = ");
  63. Serial.println(valB);
  64. valA = valB = 0; //清0
  65. }

自己写的代码

  1. int GET_COUNTER(int AM1int BM1) //返回值是脉冲数,传入的参数应该是和编码器接口的引脚
  2. //传入int即可,不需要数组
  3. {
  4. /*************定义部分**************/
  5. int valA=0,valB=0;
  6. int flagA=0flagB=0;
  7. double newtime=0;
  8. double d_time=1000; //这个d_time的数值是我瞎设的,单位是ms
  9. newtime=millis(); //获得从当前程序运行开始的毫秒数 //newtime表示计时的时间
  10. //问题就是,millis()函数是不是这个函数结束之后就停止了?
  11. //应该是每次进函数的时候开始计时
  12. /*************脉冲计数*************/
  13. while((newtime)<d_time) //d_time应该表示计数的一段时间
  14. {
  15. if(digitalRead(AM1)==HIGH && flagA==0) //A相的上升沿,计数 //这里的AM1应该是编码器的什么引脚
  16. {
  17. valA++;
  18. flagA=1;
  19. }
  20. if(digitalRead(AM1)==LOW && flagA==1) //A相的下降沿,计数
  21. {
  22. valA++;
  23. flagA=0;
  24. }
  25. if(digitalRead(BM1)==HIGH && flagB==0) //B相的上升沿,计数
  26. {
  27. valB++;
  28. flagB=1;
  29. }
  30. if(digitalRead(BM1)==LOW && flagB==1) //B相的下降沿,计数
  31. {
  32. valB++;
  33. flagB=0;
  34. }
  35. }
  36. return(valA+valB); //返回AB两相的脉冲数
  37. //这个不是实际速度,是脉冲数,算速度在主函数里面
  38. }