Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino车轮转速传感器检测方向_Arduino - Fatal编程技术网

Arduino车轮转速传感器检测方向

Arduino车轮转速传感器检测方向,arduino,Arduino,我正在尝试开发一个轮子计数器,它可以确定旋转速度和旋转方向 我有两个磁性传感器安装在一起,两个金属块在车轮上相隔180度 目前我已经能够测量旋转速度并将其转换为距离,显示的距离看起来不错。以下是代码: volatile byte half_revolutions; volatile byte half_revolutions_b; volatile unsigned long last_time_a; volatile unsigned long last_time_b; volatile b

我正在尝试开发一个轮子计数器,它可以确定旋转速度和旋转方向

我有两个磁性传感器安装在一起,两个金属块在车轮上相隔180度

目前我已经能够测量旋转速度并将其转换为距离,显示的距离看起来不错。以下是代码:

volatile byte half_revolutions;
volatile byte half_revolutions_b;
volatile unsigned long last_time_a;
volatile unsigned long last_time_b;
volatile byte dir;



unsigned int rpm;
unsigned int rpm_b;
unsigned long timeold;
unsigned long timeold_b;
unsigned long time_print;

double distance = 0.0;
void setup()
{
 Serial.begin(9600);
 attachInterrupt(0, rpm_fun, RISING);
 attachInterrupt(1, rpm_fun_b, RISING);
 half_revolutions = 0;
 half_revolutions_b = 0;
 rpm = 0;
 timeold = 0;
 timeold_b = 0;
 time_print = 0;
 dir = 1;
}

void loop()
{
   int rpm_guess;

   if (half_revolutions >= 2) 
   { 

    rpm = 30*1000/(millis() - timeold)*half_revolutions;
    timeold = millis();
    half_revolutions = 0;
   }
   else if (millis() - timeold > 1000)
   {
      rpm = 0;
   }

   if (half_revolutions_b >= 2) 
   { 
     rpm_b = 30*1000/(millis() - timeold_b)*half_revolutions_b;
     timeold_b = millis();
     half_revolutions_b = 0;  
   }


   else if (millis() - timeold_b > 1000)
   {
      rpm_b = 0;
   }

   if (millis() - time_print > 500)
   {
     rpm_guess = ((int)rpm + (int)rpm_b) / 2.0;
     double rad_per_sec = (6.0*3.14159* rpm_guess)/180.0;
     double metres_per_sec = rad_per_sec*0.038;

     distance += metres_per_sec * 0.5;
     Serial.print((int)last_time_b - (int)last_time_a);
     Serial.print(",");
     Serial.println(distance);
     time_print = millis();
   }


}

void rpm_fun()
{
  half_revolutions++;
  last_time_a = micros();
  //Each rotation, this interrupt function is run twice
}

void rpm_fun_b()
{

  half_revolutions_b++;
  last_time_b = micros();
  //Each rotation, this interrupt function is run twice
}
我希望使用这样一个事实,即如果旋转是顺时针的,传感器A应该引导传感器B,反之亦然,如果是逆时针的。然而,我的逻辑似乎工作不正常,
Serial.print((int)last_time_b-(int)last_time_a)似乎在积极和消极之间切换,无论我的旅行方向


我非常感谢您的帮助。

我更愿意在中断处理程序中进行方向猜测:

void rpm_fun() {
    if (last_time_a > last_time_b) dir = 0;
    else dir = 1;
    half_revolutions++;
    last_time_a = micros();
}

void rpm_fun_b() {
    if (last_time_a > last_time_b) dir = 0;
    else dir = 1;
    half_revolutions_b++;
    last_time_b = micros();
}
如果您遇到“反弹”,可以添加一些“”代码