INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Micros - Zeiterfassung / Geschwindigkeitsmessung
06.06.2015, 14:35
Beitrag #1
Micros - Zeiterfassung / Geschwindigkeitsmessung
Hallo zusammen,

ich habe mir eine kleine Funktion zur Geschwindigkeitsmessung von Autos mittels zweier Lichtschranken zusammengebastelt, den Sketch habe ich dazu unten angehängt.

Jetzt habe ich das ganze mal mit einem fahrenden Auto ausprobiert und stieß dabei auf ein Problem. Die Funktion micros() wirft bei mir bis zu einer ganzen Stelle unterschiedliche Werte aus, z.B. 400345 und 40034. Woran liegt das? Für die Geschwindigkeitsberechnung war ich eigentlich der Meinung mit 10^-6 umzurechnen, aber nur mit 10^-5 komm ich annähernd auf den genauen Wert!?

Ich weiß, dass es mit dem Arduino möglich ist auf 4 us bzw. auf 0.5 us genau die Zeit zu erfassen, bin mir aktuell nur nicht sicher ob ich irgendwo noch ein Denkfehler drinnen habe!?!

Ist für micros() die Schnelligkeit wichtig - Serial.begin(19200); ?

Verwendet wir ein Arduino Mega 2560 der neuesten Generation.
Vielen Dank im Voraus.

Code:
// Variablendeklaration
byte li_start = 2;  // Pin Lichtschranke Start
byte li_ende = 3; // Pin Lichtschranke Ende
unsigned long start = 0;
unsigned long ende = 0;
unsigned int zeit_signaldauer = 0;
boolean zeitmessung_aktiv = false;

float result;
int ergebnis;
String myString;

double v = 0; // unsigned long


void setup() {
  Serial.begin(19200);
  pinMode(2, INPUT); // Lichtschranke Beginn
  pinMode(3, INPUT); // Lichtschranke Ende
  attachInterrupt(0, startabfrage, FALLING);
  attachInterrupt(1, zeitmessung, FALLING);
  }
  
void loop(){
  
  v = (2.0 / (zeit_signaldauer * pow(10, -5) ) );                     // Durchschnittsgeschwindigkeit
  result = v + 0.5;
  ergebnis = (int)result;
  
  
  Serial.print("Startzeit: ");
  Serial.println(start);
  
  Serial.print("Zeitdifferenz: ");
  Serial.println(zeit_signaldauer);
  
  Serial.print("Geschwindigkeit: ");
  Serial.println(v);
  Serial.println(result);
  Serial.println(ergebnis);
  
  Serial.print("\n");
  delay(0);
  }
  
void startabfrage(){
  if(digitalRead(li_start) == LOW && zeitmessung_aktiv == false){
    start = micros();  // Aktueller Zeitwert
    zeitmessung_aktiv = true;
    }
    }
void zeitmessung(){
  if(digitalRead(li_ende) == LOW && zeitmessung_aktiv == true){
    //ende = micros();  // Aktueller Zeitwert
    zeit_signaldauer = micros() - start ;  // Berechnung Zeitdifferenz
    zeitmessung_aktiv = false;
    }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2015, 14:43
Beitrag #2
RE: Micros - Zeiterfassung / Geschwindigkeitsmessung
Hi,
wenn ich das richtig sehe dann gibst du die Werte immer aus...
Vielleicht nur dann ausgeben wenn eine Messung wirklich erfolgt ist was du durch ein weiteres Flag regeln kannst.
Ansonsten sieht dein Sketch Funktional gut aus.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2015, 15:31
Beitrag #3
RE: Micros - Zeiterfassung / Geschwindigkeitsmessung
Hallo,

start und ende hast du richtigerweise als unsigned long definiert.
Die Differenz aus beiden (zeit_signaldauer) sollte dann auch unsigned long und nicht int sein. Sonst gibt es nach 65536 µs u.U. einen Überlauf der int Variablen bei der Differenzbildung.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.06.2015, 09:31
Beitrag #4
RE: Micros - Zeiterfassung / Geschwindigkeitsmessung
(06.06.2015 15:31)ardu_arne schrieb:  Hallo,

start und ende hast du richtigerweise als unsigned long definiert.
Die Differenz aus beiden (zeit_signaldauer) sollte dann auch unsigned long und nicht int sein. Sonst gibt es nach 65536 µs u.U. einen Überlauf der int Variablen bei der Differenzbildung.

Gruß
Arne

Dies hatte ich nur mal Testweise geändert.


(06.06.2015 15:31)ardu_arne schrieb:  Hi,
wenn ich das richtig sehe dann gibst du die Werte immer aus...
Vielleicht nur dann ausgeben wenn eine Messung wirklich erfolgt ist was du durch ein weiteres Flag regeln kannst.
Ansonsten sieht dein Sketch Funktional gut aus.
lg
bk

Werde ich mal versuchen, danke.
---

Hat hierzu noch jemand eine Ahnung:
Für die Geschwindigkeitsberechnung war ich eigentlich der Meinung mit 10^-6 umzurechnen, aber nur mit 10^-5 komm ich annähernd auf den genauen Wert!?

Ist für micros() die Schnelligkeit wichtig - Serial.begin(19200); ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino Geschwindigkeitsmessung jalu4601 2 642 24.11.2015 17:54
Letzter Beitrag: jalu4601

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste