多普勒雷达(HB100)Arduino代码:为什么我们使用位移?

时间:2018-08-10 01:21:44

标签: arduino

我从事多普勒雷达测速项目已有一段时间了。我发现this链接和下面的代码非常有用:

// Based on the Adafruit Trinket Sound-Reactive LED Color Organ
// http://learn.adafruit.com/trinket-sound-reactive-led-color-organ/code

#define RADAR A5 // RADAR inut is attached to A7
#define MICRODELAY 100 // 100microseconds ~10000hz
#define MAXINDEX 1024 // 10 bits
#define TOPINDEX 1023 // 10 bits

byte collect[MAXINDEX];
int mean;
int minimum;
int maximum;
int hysteresis; // 1/16 of max-min
bool currentphase; // are value above mean + hysteresis;
int lastnull; // index for last null passing value
int prevnull; // index for previous null passing value
int deltaindex;
int deltadeltaindex;
int index;
bool phasechange = false;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while (!Serial) {}
  index = 0;
  mean = 0;
  maximum = 255;
  minimum = 0;
  hysteresis = 0;
  currentphase = false;
  lastnull = 0;
  prevnull = 0;

  Serial.print("deltadeltaindex");
  Serial.print("\t");
  Serial.print("deltaindex");
  Serial.print("\t");
  Serial.println("delta");
}

void loop() {
  int newVal = analogRead(RADAR); // Raw reading from amplified radar
  mean -= (collect[index] >> 2);
  mean += (newVal >> 2);
  collect[index]= newVal;
  minimum = newVal < minimum ? newVal : minimum + 1;
  maximum = newVal > maximum ? newVal : maximum - 1;
  hysteresis = abs(maximum - minimum) >> 5;

  if(newVal > (mean + hysteresis))
  {
    if(false == currentphase)
    {
      currentphase = true;
      phasechange = true;
    }
  }
  else if(newVal < (mean - hysteresis))
  {
    if(currentphase)
    {
      currentphase = false;      
      phasechange = true;
    }
  }

  if(phasechange)
  {
    prevnull = lastnull;
    lastnull = index;

    int delta = (prevnull > lastnull) ? 
        (lastnull - prevnull + MAXINDEX) : 
        (lastnull - prevnull);
    deltadeltaindex = abs(deltaindex - delta);
    deltaindex = delta;
    Serial.print(deltadeltaindex);
    Serial.print("\t");
    Serial.print(deltaindex);
    Serial.print("\t");
    Serial.println(delta);
  }

  index = index == TOPINDEX ? 0 : index + 1;
  phasechange = false;
  //delayMicroseconds(10);
}

我在带有HB100(带分线板的型号)的Arduino上尝试了一下,效果很好。

但是,我真正想做的是了解代码背后的机制。我读了一些有关磁滞和位移的文章,但我根本不明白为什么程序员在这里使用位移。

mean -= (collect[index] >> 2);mean += (newVal >> 2);会对值做些什么?

我们将不胜感激。

0 个答案:

没有答案