Forum: Mikrocontroller und Digitale Elektronik Ultraschall Entfernungsmessung


von Ultraschall (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

Und warum läst du das nicht die Hardware des uC für dich machen?
Sowas macht man mit dem Capturemode des Timers.

von Eumel (Gast)


Lesenswert?

Und vorallem: musst du so oft messen?

von amateur (Gast)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

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

von Helmut L. (helmi1)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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.

von Ultraschall (Gast)


Lesenswert?

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.

von Helmut L. (helmi1)


Lesenswert?

Ultraschall schrieb:
> um dann bloß 2 Pins in
> Anspruch zu nehmen ;).

Wie? Nur VCC und GND willst du anschliessen :=)

von Ultraschall (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> Wie? Nur VCC und GND willst du anschliessen :=)

Dann eben 4 ;).

von Helmut L. (helmi1)


Lesenswert?

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.

von Ultraschall (Gast)


Lesenswert?

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 ;).

von Helmut L. (helmi1)


Lesenswert?

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.

von Ultraschall (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> passt nicht wirklich zusammen.
Es soll Temperatursensoren geben, welche über I2C angesprochen / 
ausgelesen werden.

von Helmut L. (helmi1)


Lesenswert?

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.

von amateur (Gast)


Lesenswert?

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.

von Andreas W. (andy_w)


Lesenswert?

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

von Koal (Gast)


Lesenswert?

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 :)

von Rolf S. (audiorolf)


Lesenswert?

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?

von Mike (Gast)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

grrrh
Ich "liebe" intelligente Software  :-(

Ultraschall schrieb:
> ... diesem (http://www.micropik.com/PDF/HCSR04.pdf) Entfernungsmessungsmodul

von Helmut L. (helmi1)


Lesenswert?

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.

von Ulrich H. (lurchi)


Lesenswert?

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.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

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
von Rolf S. (audiorolf)


Lesenswert?

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
Noch kein Account? Hier anmelden.