Hi, ich bin im Besitz von diesem (http://www.micropik.com/PDF/HCSR04.pdf) Entfernungsmessungsmodul. Dort ist eine Genauigkeitvon 3 mm angegeben. Nun habe ich zwar vielen Beispielcode (für den Arduino) dazu gefunden, aber der läuft im Prinzip immer darauf hinaus, dass man in einer Schleife "misst" wielange der Echo Pin auf "High" ist. Dieser Ansatz gefällt mir nicht so sonderlich, da er ja blockierend ist. Ich würde das Ganze lieber per Interrupt lösen. Nun bin ich mir zum Einen nicht sicher, ob es ein "externer" Interrupt tut (d.h. der auslöst, wenn das Signal auf High ist) oder ob ich auf einen Timer-Interrupt zurückgreifen soll, um darin den aktuellen Status zu prüfen (ähnlich einer DCF Routine). Ich habe mich mal ein wenig an der Mathematik versucht und ausgerechnet, dass bei 350 m/s Schallgeschwindigkeit 3 mm in ca. 17 µS zurückgelegt werden. Jetzt bin ich mir nicht sicher wie ich diesen Wert zu deuten habe. Wenn ich jetzt mal das "klassische" Nyquist-Shannon-Abtasttheorem hernehme, dann müsste ich ja den Timer-Interrupt in etwa alle 8,5 µS auslösen. Bei z.B. 8 MHz sind das aber nur 68 Takte. Das reicht vielleicht gerade so einmal für die ISR. Nebenher soll aber z.B. noch ein Display aktualisiert werden. Wie würdet ihr das Ganze angehen bzw. umsetzen? Ist der "blockierende" Ansatz eventuell doch gut genug? Oder einfach höher takten (z.B. 16 MHz)? Wobei selbst da nicht unbedingt viele Takte übrig bleiben. Vielen Dank!
Ultraschall schrieb: > Wenn ich jetzt mal das "klassische" Nyquist-Shannon-Abtasttheorem > hernehme, dann müsste ich ja den Timer-Interrupt in etwa alle 8,5 µS > auslösen. Du löst den Interrupt überhaupt nicht aus. Deine Hardware löst den Interrupt aus. Konkret den Timer Capture Interrupt.
Und warum läst du das nicht die Hardware des uC für dich machen? Sowas macht man mit dem Capturemode des Timers.
Viele Entfernungsmesser arbeiten nach folgendem Chema: Schicke einen Puls oder ein Pulspaket auf Achse. Starte gleichzeitig einen Timer/Zähler. Warte aufs Echo. Bei Empfang des Echos Stopp den Timer/Zähler. Jetzt hast Du so viel Zeit wie Du willst um das Ergebnis zu berechnen und bei Bedarf auszugeben, deiner Tante zu verraten, zu speichern u.s.w. u.s.w. Danach wenn gewünscht: Neuen Zyklus beginnen. Beim Timer kommt es in der Hauptsache darauf an, dass Du nicht unnötig langsam Tickst (keine Auflösung) und Du es nicht übertreibst und einen Überlauf provozierst. Ist aber m.E. überprüfbar
amateur schrieb: > und Du es nicht übertreibst und einen > Überlauf provozierst. Dafuer gibt es den Overflow Interrupt. Damit kann man den Zaehler beliebig breit machen.
Helmut Lenzen schrieb: > Dafuer gibt es den Overflow Interrupt. Damit kann man den Zaehler > beliebig breit machen. Wenn man mit der Auflösung in den Bereich von 16-Bit Zählerüberläufen kommt und wahre Entfernungen messen möchte, sollte man sich auch gleich Gedanken über die passende Temperaturmessung machen, um mit der Genauigkeit in Bereiche vorzustoßen, die an die Auflösung heranreicht.
amateur schrieb: > Warte aufs Echo. Das Warten muss dann aber mit einem Time-Out begrenzt werden, falls kein Echo zurückkommt. Das lässt sich z.B. mit dem von Helmut erwähnten Overflow Interrupt einfach realisieren. Gruß Dietrich
Wolfgang schrieb: > kommt und wahre Entfernungen messen möchte, sollte man sich auch gleich > Gedanken über die passende Temperaturmessung machen, um mit der > Genauigkeit in Bereiche vorzustoßen, die an die Auflösung heranreicht. Das stimmt zwar, aber kannst du sicherstellen das ueberall auf der Strecke die gleiche Temperatur ist?
Helmut Lenzen schrieb: > Das stimmt zwar, aber kannst du sicherstellen das ueberall auf der > Strecke die gleiche Temperatur ist? Das nicht, aber bei vielen Anwendung ist die Temperaturverteilung über den relevanten Entfernungsbereich ausreichend homogen, so dass ein geeignet plazierter Temperatursensor immer zu besseren Ergebnissen führt, als ein völlig falscher Schallgeschwindigkeitswert.
Karl Heinz Buchegger schrieb: > Konkret den Timer Capture > Interrupt. Ok. Hört sich genau nach dem an, was ich suche. Vielen Dank für den Hinweis. Allerdings scheint es bei einem ATmega88 z.B. nur einen solchen Pin zu geben (sowie den ADC Komparator). Beim ATtiny85 hingegen sogar keinen :(. Was wäre hier eine brauchbare Alternative? Ich will nämlich nicht unbedingt einen 28 Beiner ins Rennen schicken, um dann bloß 2 Pins in Anspruch zu nehmen ;). Wolfgang schrieb: > sollte man sich auch gleich > Gedanken über die passende Temperaturmessung machen, um mit der > Genauigkeit in Bereiche vorzustoßen, die an die Auflösung heranreicht. Das hatte ich letztendlich sogar vor. Aber davor wollte ich ein wenig mit dem Ganzen experimentieren.
Ultraschall schrieb: > um dann bloß 2 Pins in > Anspruch zu nehmen ;). Wie? Nur VCC und GND willst du anschliessen :=)
Ultraschall schrieb: > Dann eben 4 ;). Noe. Du brauchst noch einen Quarz (2 Pine) , Reset (1 Pin), Analogversorgung (3 Pins), die Programmierpins (3 Pins), einen Sendeausgang ( 1Pin), einen Empfangspin (1 Pin). Und dann steht das Ergebnis irgendwo in uC. Also auch noch Pins fuer die Ausgabe. Nun zaehl mal zusammen.
Helmut Lenzen schrieb: > Du brauchst noch einen Quarz (2 Pine) , Reset (1 Pin), > Analogversorgung (3 Pins), Nicht wirklich. Der Quarz wäre vielleicht für eine genauere Auflösung sinnvoll, aber ich kann ja auch den internen Oszillator kalibrieren. Mal sehen. Analogversorgung brauch ich keine. Helmut Lenzen schrieb: > die Programmierpins (3 Pins) Die sich i.d.R. wunderbar mit anderen Dingen kombinieren lassen. Letztlich brauche ich für das Modul 2 I/O Pins. Ein ATmega88 hat derer aber 23. Das ist ein wenig verschwenderisch. Ein ATtiny85 hat 5-6 I/O Pins (je nach Fuse für die Reset-Leitung). Das wäre für mich ein Optimum an Effizienz was die Pin Anzahl angeht, da ich dann noch z.B. über TWI die Ergebnisse aus dem uC bekomme ;).
Das hier Ultraschall schrieb: >> sollte man sich auch gleich >> Gedanken über die passende Temperaturmessung machen, um mit der >> Genauigkeit in Bereiche vorzustoßen, die an die Auflösung heranreicht. > > Das hatte ich letztendlich sogar vor. Aber davor wollte ich ein wenig > mit dem Ganzen experimentieren. und das hier Ultraschall schrieb: > Nicht wirklich. Der Quarz wäre vielleicht für eine genauere Auflösung > sinnvoll, aber ich kann ja auch den internen Oszillator kalibrieren. Mal > sehen. Analogversorgung brauch ich keine. passt nicht wirklich zusammen.
Helmut Lenzen schrieb: > passt nicht wirklich zusammen. Es soll Temperatursensoren geben, welche über I2C angesprochen / ausgelesen werden.
Ultraschall schrieb: >> passt nicht wirklich zusammen. > Es soll Temperatursensoren geben, welche über I2C angesprochen / > ausgelesen werden. Das meine ich nicht damit. Oder willst du den internen Oszillator auch noch mit der Temperatur korrigieren? Ein Quarz ist da einfacher.
Ich denke man sollte das Ganze nicht übertreiben. Die Entfernungsmessung mittels Ultraschall ist von so vielen Faktoren abhängig, dass z.B. das Kaskadieren von Zählern schon grenzwertig ist. Als ich Anno '85 etwas über die Ausbreitung von Schall gehört habe sagte man mir: Temperatur, Luftdruck und Luftfeuchtigkeit währen die größten Störfaktoren. Ich Unterstelle mal, dass sich daran nicht allzu viel geändert hat. 1. Die Temperatur: Och da baue ich einfach einen Sensor ein - und messe die Temperatur im Gehäuse, geschützt und gewärmt durch meine Hände, geheizt durch elektronische Bauteile - nur nicht die der Messstrecke. 2. Der Luftdruck: Hier geht’s um recht geringe Unterschiede. Stehst Du draußen, so bildest Du ein Hindernis, welches je nach Windrichtung Überdruck bzw. Unterdruck provoziert. Nicht unbedingt das was Du wolltest. Einzige Ausnahme: Du stehst im geschlossenen Raum und verhältst Dich still. 3. Die Luftfeuchte: Wo auch immer dieser Sensor montiert ist, meist (mechanisch) geschützt, er misst meist Mist und das mit ordentlicher Verzögerung. Auch hier: In Verbindung mit 'nem ordentlichen Ventilator ... Also schmeißt das Groß an Nachkommastellen auf den Mist.
Hallo, ich hatte mal ein berufliches Projekt mit Ultraschallentfernungsmessung. 3mm Genauigkeit kann man mit normalen Mitteln eher vergessen. Mit üblichen Ultraschallwandlern mit Frequenzen von ca. >30kHz bis <100kHz ist eine reine Zeitmessung mit der Genauigkeit nicht zu machen. Piezowandler haben fast immer eine ausgeprägte Resonanzfrequenz mit kleiner Bandbreite, die Anstiegs- und Abfallzeit hängt direkt von der Bandbreite ab. Ein schmalbandiger Wandler mit z.B. 5kHz Bandbreite hat Anstiegszeiten in der Größenordnung von ca. 200us. Für genaue Messungen braucht man vor allem breitbandige Wandler, die dürfen also keine ausgeprägte Resonanz haben. Wird derselbe Wandler zum Senden und Empfangen mit Umschaltung benutzt, hat man im Nahbereich eine tote Zone, denn nach Abschalten schwingt der Wandler noch langsam aus (mit ausgeprägter Resonanz dauert das besonders lange!) und erst, wenn er ca. 80dB oder noch mehr abgeklungen ist, ist er als Mikrofon für das Echo empfindlich. Besser man hat zwei Sensoren, einen Sender und einen getrennten Empfänger, dann ist die Totzeit erheblich kürzer, aber auch nicht ganz weg. Beim Senden wird der Empfänger übersteuert, da der Sender normalerweise direkt daneben sitzt, die Schwingung muß also auch abklingen, da die Anfangsamplitude erheblich kleiner als beim kombinierten Sender/Empfänger ist, geht das Abklingen schneller. Am besten würe es aber, kontinuierlich ein moduliertes Ultraschallsignal zu senden, die Modulation ist ein Pseudozufallsgenerator (z.B. rückgekoppeltes Schiebereister) und mit dem empfangenen Signal eine Kreuzkorrelation durchzuführen. Der Empfänger samt A/D-Wandler muß aber eine hohe Dynamik haben, damit er vom direkten Sendesignal nicht übersteuert wird und trotzdem das wesentlich schwächere Echo noch gut aufgelöst wird. Ein Audio A/D-Wandler mit 192kHz und >=20Bit dürfte da nicht verkehrt sein, natürlich nur für Ultraschallfrequenzen < ca. 80kHz. Ohne Korrelation, also mit direkter Zeitmessung, wird es nur genauer werden, wenn man mit noch höheren Ultraschallfrequenzen und breitbandigen Wandlern arbeitet, z.B. eher mit 1MHz, aber da ist die Dämpfung in der Luft schon sehr groß, so daß das Echo extrem schwach zurückkommt. Wichtig ist die Messung der Lufttemperatur der Meßstrecke, die Schallgeschwindigkeit ist proportional zur Quadratwurzel der absoluten Temperatur. Wenn sich die Temperatur bei ca. 300 Kelvin um 6° ändert, hat man bereits ca. 1% Meßwertabweichung. Der Luftdruck und die Feuchtigkeit hat praktisch keinen Einfluß auf die Schallgeschwindigkeit, wohl aber auf die Dämpfung. Kleinerer Druck und höhere Luftfeuchtigkeit können das empfangene Signal deutlich dämpfen, es kommt aber deshalb nicht später an. Gruß Andy_W
Hallo Hätte eine Frage.. Hast du das fertige Programm noch? Ich hab das als aufgabe für die schule und bräucht einen anstoß bzw. das Programm.^^ Könntest du es vlt als Kommentar schreiben? Wäre echt wichtig ;) BITTE, wäre echt sehr cool :)
Andreas W. schrieb: > Am besten würe es aber, kontinuierlich ein moduliertes Ultraschallsignal > zu senden, die Modulation ist ein Pseudozufallsgenerator (z.B. > rückgekoppeltes Schiebereister) und mit dem empfangenen Signal eine > Kreuzkorrelation durchzuführen. Warum bevorzugst Du ein Zufallsmuster statt einem deterministischen Signal?
Andreas W. schrieb: > Besser man hat zwei Sensoren, einen Sender und einen getrennten > Empfänger, dann ist die Totzeit erheblich kürzer, aber auch nicht ganz > weg. Dann guck mal ins Datenblatt Ultraschall schrieb: > diesem (http://www.micropik.com/PDF/HCSR04.pdf)Entfernungsmessungsmodul
grrrh Ich "liebe" intelligente Software :-( Ultraschall schrieb: > ... diesem (http://www.micropik.com/PDF/HCSR04.pdf) Entfernungsmessungsmodul
Rolf S. schrieb: > Warum bevorzugst Du ein Zufallsmuster statt einem deterministischen > Signal? Ist ja kein Zufall sondern nur Pseudo also berechnenbar. Das ganze ist unter Spreadspektrum bekannt. Wie auch GPS funktioniert.
3 mm Auflösung wären schon sehr gut für die üblichen 40 kHz. Das würde heißen man müsste auf 1 Wellenlänge genau auflösen, und genau da hat man die Probleme wegen der Resonanzen. Man bekommt nämlich eine langsam ansteigende Amplitude des Signals und kann dann gar nicht so leicht und eindeutig sagen ab welcher Schwingung es gilt. Die einzelnen Schwingungen kann man dagegen oft gut auflösen - es ist halt nur die Frage um vielfache von 1/2 Wellenlänge. Mit einem Modulierten Signal könnte man das ggf. umgehen - aber nicht mit dem einfachen Modul. Da muss man eher mit Fehlern von 1 cm rechnen - wenn man die richtige Periode erst mal zuverlässig hätte, wäre man schnell auch bei Werten im Bereich 1/10 mm, sofern es mit der Temperatur hinkommt. Ganz so hoch muss man mit den Anforderungen an den AD Wandler nicht unbedingt gehen, wenn man eine Zeitabhängige Verstärkung vorsieht. Die Dämpfung ist ja relativ berechenbar, der Dynamikbereich also gar nicht so groß. Die Zeitmessung mit dem Modul kann man auch gut und gerne mit einem normalen Interrupt (z.B. int0, Pinc Change) machen: Den US Puls starten, den Timer bei 0 starten lassen und dann einfach im Interrupt den Timer auslesen. Wenn keine anderen Interrupts groß dazwischen kommen, kommt man auch damit die Zeit auf etwa 5 Zyklen (=µs bei 1 MHz Takt) genau. Nur mit dem Überlaufinterrupt muss man sich da etwas anstrengen und kriegt da dann in einem kleinen Zeitfenster ggf. etwa 10-30 µs Ungenauigkeit. Man kann aber ggf. auch so etwas wie USI als Erweiterung eines 8 Bit Timers nutzen.
Ultraschall schrieb: > Allerdings scheint es bei einem ATmega88 z.B. nur einen solchen Pin zu > geben (sowie den ADC Komparator). Beim ATtiny85 hingegen sogar keinen > :(. > > Was wäre hier eine brauchbare Alternative? Machst Du die Messungen nacheinander? Dann verodere doch die Echo-Signale. Ansonsten gibt es noch Prioritätenencoder oder andere µC-Familien mit deutlich mehr Input-Captures. Beim Arduino Mega sind viele ICPs nicht herausgeführt, du könntest Fädeldraht an die Pins anlöten.
:
Bearbeitet durch User
Helmut Lenzen schrieb: > Ist ja kein Zufall sondern nur Pseudo also berechnenbar. Das ganze ist > unter Spreadspektrum bekannt. Wie auch GPS funktioniert. ahja!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.