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.
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:> 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.
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?
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.
Helmut Lenzen schrieb:> Ist ja kein Zufall sondern nur Pseudo also berechnenbar. Das ganze ist> unter Spreadspektrum bekannt. Wie auch GPS funktioniert.
ahja!