Neben den elektrotechnischen Fehlerquellen kann ich mir auch noch eine messtechnische vorstellen:
Es gibt 2 Messmethoden
Methode 1:
Die Dauer des Echopulses wird gemessen (Methode, die das Datenblatt vorschlägt).
Methode 2:
Zeit, die vergeht, bis der Sensor nach Triggerung einen Echo-Puls sendet, wird gemessen.
Ich sebst besitze keinen dieser Sensoren, also kann ich das nicht testen.
Ich hab mal einen Arduino-Testprogramm vorbereitet, das beide Methoden verwendet.
Das Ergebnis könnte aufschlussreich sein.
Code:// Ultraschall-Test // testet die Genauigkeit eines hc-sr04 Ultraschallsensors // mit 2 Messmethoden: // 1. measureAirTime // Zeit, die vergeht, bis der Sensor nach Triggerung // einen Echo-Puls sendet, wird gemessen. // 2. measurePulseTime // Die Dauer des Echo-Pulses wird gemessen. // // Datenblatt: // https://docs.google.com/document/d/1Y-yZnNhMYy7rwhAgyL_pfa39RsB-x2qR4vP8saG73rE/edit?pli=1 // // Sisor, 23.08.2014 #define PIN_TRIG 8 // Hier Anschluss-Pins definieren #define PIN_ECHO 9 void trigger() { digitalWrite(PIN_TRIG, HIGH); delayMicroseconds(10); // 10 µs Triggerzeit (siehe Datenblatt) digitalWrite(PIN_TRIG, LOW); } long measureAirTime() { unsigned long now; now = micros(); trigger(); while(digitalRead(PIN_ECHO) == LOW); return micros() - now; } long measurePulseTime() { // muss sofort nach measureAirTime() // ausgeführt werden!!! unsigned long now; now = micros(); while(digitalRead(PIN_ECHO) == HIGH); return micros() - now; } void printResult(unsigned long airMicros, unsigned long pulseMicros) { Serial.print("measured air time : " ); Serial.print(airMicros ); Serial.println(" us"); Serial.print("measured pulse time: " ); Serial.print(pulseMicros ); Serial.println(" us"); Serial.println("---"); } void setup() { pinMode(PIN_TRIG, OUTPUT); digitalWrite(PIN_TRIG, LOW); pinMode(PIN_ECHO, INPUT); Serial.begin(57600); } void loop() { unsigned long airMicros, pulseMicros; // Messung durchführen airMicros = measureAirTime(); pulseMicros = measurePulseTime(); // Ausgabe über Serial-Monitor printResult(airMicros, pulseMicros); delay(100); }







Zitieren

Lesezeichen