Was ist die Arbeit von pulsIn?

9

Ich habe Code für einen Ultraschallsensor, den ich von einer Site gefunden habe. Hier ist der Code:

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

Ich verstehe die pulseIn()Funktionsweise jedoch nicht. Ich möchte wissen, wann die Zeitzählung beginnt und wann sie endet. Beginnt in diesem Code beispielsweise die Zeit bei digitalWrite(trigPin, HIGH);oder beginnt die Zeit bei der pulseIn()Funktion?

Wenn es das zweite ist, wenn es stoppt, wie gibt uns die Zeit dann die Entfernung eines Hindernisses, wenn ich bereits 1000 Mikrosekunden verzögere, nachdem ich einen Ping in der Luft gesendet habe?

shajib0o
quelle
Die 100us-Verzögerung für den Trigger-Pin scheint mir etwas lang zu sein. Es hängt von der Marke Ihres Sensors ab, aber ein typischer Wert (ich verwende ihn mit HC-SR04) liegt bei 10us .
Jfpoilpret
Wie kann ich diesen Code in Assemblersprache machen? Bitte helfen Sie.
1
How can i do this code in assembly languaje- Was hat das mit dieser Frage zu tun?
Nick Gammon

Antworten:

8

Aus den Dokumenten:

Liest einen Impuls (entweder HIGH oder LOW) an einem Pin. Wenn der Wert beispielsweise HIGH ist, pulseIn()wartet er darauf, dass der Pin auf HIGH geht, startet das Timing, wartet darauf, dass der Pin auf LOW geht, und stoppt das Timing. Gibt die Länge des Impulses in Mikrosekunden zurück. Pulsein

In diesem Fall pulseIn(echoPin, HIGH)beginnt die Anzahl der Mikrosekunden zu zählen, bis sie echoPinauf HIGH geht, und speichert sie in duration.

Es beginnt und endet in dieser Zeile, es ist eine sogenannte Blockierungsfunktion. Es wird wirklich dort sitzen, bis es echoPinhoch geht und Ihnen sagt, wie lange es gedauert hat (es sei denn, Sie geben eine Zeitüberschreitung an).

Dies bedeutet auch, dass Verzögerungen vor oder nach dem pulseInAnruf keine Auswirkungen haben.

Die Art und Weise, wie Sie Abstand von dieser Zeit erhalten, ist durch die folgende Gleichung:

distance = (duration/2) / 29.1;

Sie teilen durch zwei, weil es hin und zurück geht, so dass die Zeit doppelt so lang ist wie bei einer Einwegfahrt. Die 29.1 ist die Schallgeschwindigkeit (343,5 m / s => 1 / 0,03435 = 29,1). Beachten Sie also, dass das Ergebnis in CMs und nicht in Zoll angegeben ist. Sie könnten es wahrscheinlich herausfinden, indem Sie sich das Datenblatt des Sensors ansehen oder einfach viele Proben erhalten, die die Dauer mit der Entfernung in Beziehung setzen (Sie würden die Entfernung manuell messen) und eine Gleichung erhalten, die sehr ähnlich ist.

Sachleen
quelle
1
Ich bin skeptisch geworden! Tatsächlich ist der 29.1 die Schallgeschwindigkeit. Nur eine kurze Ergänzung: IIRC Der Grund dafür, dass ein Impuls zu lesen ist, ist, dass das Ultraschallmodul ein HIGH-Signal erzeugt, bis der Ton zurück zum Modul gelangt.
Anonymer Pinguin
1
Ich habe den vierten Absatz nicht verstanden. Denn wenn ich einen Schallimpuls in die Luft sende und 2 Sekunden warte, wird er eine große Strecke zurücklegen. Wenn ich anfange zu zählen, bin ich 2 Sekunden zu spät. Warum gibt es kein Problem, wenn ich Verzögerungen vor dem Pulsin gebe? @ Sachleen. Und danke Annonomus Penguin und Sachlee
Shajib0o
@ shajib0o "pulsIn () wartet darauf, dass der Pin auf HIGH geht, startet das Timing, wartet dann darauf, dass der Pin auf LOW geht und stoppt das Timing."
Sachleen
3
@ shajib0o Soweit ich das beurteilen kann, lässt der Ultraschallsensor den Pin beim Senden des Signals auf HIGH und dann auf LOW, wenn das Signal zurückkommt.
Anonymer Pinguin
1
Eigentlich ist das falsch. pulseIn(echoPin, HIGH)misst die Zeit, bis der ECHO-Pin auf LOW geht.
Dmitry Grigoryev
2

In der Tat wäre es ein Problem, wenn Sie 1000 Mikrosekunden nach dem Start mit der Messung der Pulslänge beginnen würden. Der HC-SR04-Sensor funktioniert jedoch nicht so:

Geben Sie hier die Bildbeschreibung ein

  • Der Sensor wird durch die fallende Flanke von TRIG bei ausgelöstdigitalWrite(trigPin, LOW);

  • Der ECHO-Impuls beginnt ca. 0,3 ms nach dem Trigger

Deshalb hat eine Verzögerung von 1 ms keinen Einfluss auf das Messergebnis. pulseIn(echoPin, HIGH)wartet tatsächlich, bis der ECHO-Pin auf HIGH geht, und beginnt dann mit der Messung der Pulslänge, bis er wieder auf LOW geht. Daher kann die Dauer des TRIG-Impulses auf 10 Mikrosekunden reduziert werden (minimale TRIG-Dauer für HC-SR04), um die Messungen zu beschleunigen.

Dmitry Grigoryev
quelle
0

Es ist wichtig zu wissen, dass Sie die Zeit vom Start des Triggers bis zum Echo-Signal nicht messen, indem Sie den Trigger-Pin auf HIGH setzen.

Der Sensor HC-SR04 startet die Messung, indem er am Trigger-Eingang ein HIGH empfängt und kurze Zeit später die Zeit sendet, die als Länge des HIGH-Pegels am Echo-Pin codiert ist.

Wenn Sie pulseIn()nach dem Auslösen 2 ms, dh 2000 μs, verwenden, sollte dies einwandfrei funktionieren.

ANK55
quelle
1
Ich bin mir nicht sicher, inwieweit dies zur akzeptierten Antwort beiträgt oder von dieser abweicht.
Greenonline
0

Seien Sie nicht verwirrt, da das Ultraschallmodul eine bestimmte Arbeitsweise hat. Zuerst setzen Sie einen Impuls in den Trigpin. Wenn es endet, sendet das Modul 8 Bursts mit 40-kHz-Impulsen (und genau das wird zum Messen der Entfernung verwendet, nicht Ihr Impuls im Trigpin, der nirgendwo hin führt). Genau in dem Moment, in dem der erste Burst gesendet wird, setzt sich der Echo-Pin auf HIGH. Wenn dies geschieht, befindet sich das Programm in der Zeile von pulsIn, und da sich Echopin in HIGH befindet, startet es das Timing (da pulsIN (Echopin, HIGH) darauf wartet, dass Echopin für das Start-Timing HIGH ist). Wenn der erste Impuls der 40 kHz im Objekt abprallt und zum Empfänger zurückkehrt, setzt sich das Echopin auf LOW. Dann stoppt die pulsIn-Funktion die Zeit und gibt sie zurück. Dann läuft das Programm weiter. Dieses Modul ist etwas knifflig, um die Arbeitsweise von pulsIn zu erlernen.

JoshFMX
quelle