Moin Ich habe da so mein Probleme die Länge eines Impulses zu messen. Ich hab auch schon dieverse Beiträge durchgesucht und versucht damit mein Problem zu lösen, was leider nicht geklappt hat :( Deswegen hoff ich das mir jemande hier helfen kann. Ich verwende einen ATMega 32 bei 1MHz Also mein Problem. Ich habe mir ein Ultraschallmesser SRF05 gekauft. Um die Messung zu aktivieren, muss ein min 10µs langer Impuls gesendet werden und dann muss der Port auf Eingang geschaltet werden. Das Klappt auch alles soweit und ich bekomme auch Zeiten ausgegeben, aber nicht die, die ich erhofft habe. Der Impuls der vom SRF05 ausgesendet wird ist zwischen 100µs bis 25ms lang. Jenachden wie weit das Objekt weg ist, umsolänger ist auch der Impuls. Teilt man die Impulslänge durch 58, so soll das ergebniss in cm rauskommen. Leider Klappt das nicht. und ich weiß nicht vorran das lieg. die Ergebnisse stimmen nicht mit der Tatsächlichen Entfernung ein. Vielleicht hab ich ja irgendwo ein fehler drin. Hoffentlich kann mir jemand helfen. Wäre euch sehr dankbar. Gruß Tobi
Nach Umkonfigurierung von Timer1 die IRQ-Flags zurücksetzen? Der Verwending von Timer1 schein etwas zerfrickelt zu sein. Du willst doch ständig messen und nicht nur 1x? AM besten ginge das über 2 Timer: Timer1 macht den InCapt und ein anderer die Zeit. Zudem versteh ich nicht, warum die Länge des Echos von den Entfernung abhängen soll? Die Zeit, bis man das Echo hört, sollte davon abhängen... Johann
1 | volatile int i[5],j=0; |
->
1 | volatile unsigned char j; |
2 | unsigned int i[5]; |
und itoa -> utoa
Johann L. wrote: > Zudem versteh ich nicht, warum die Länge des Echos von den Entfernung > abhängen soll? Die Zeit, bis man das Echo hört, sollte davon abhängen... Ne, das ist ein Ultraschallmesser mit "Eigenintelligenz". Der gibt das Messergebnis als längencodierten Pulse aus.
Für die 10 µS würde ich übrigens einfach nur ein _delay_us nehmen (aber natürlich nicht mit 10, sondern etwas mehr).
Man kann das Ding komplett mit einem Timer erschlagen. Für den ICP lässt man den Timer konstant durchlaufen. Beim Overflow-Interrupt setzt man den Pin auf Senden. Im OCR steht dann 10 für 10 µs bei 1MHz Timer-Frequenz. In der OCR-ISR schaltet man den Pin dann auf Empfang, da zu diesem Zeitpunkt der Sendepuls fertig sein soll. Die ICP-Flanke müsste zu diesem Zeitpunkt auf steigende Flanke eingesetellt sein. Sobald die ICP-ISR aufgerufen wird, sichert man das ICR und schaltet die Flankendetektionsrichtung um auf fallende Flanke. Wenn die ICP-ISR wieder aufgerufen wird, sichert man auch wieder das ICR (input Capture Register); diesmal in einer anderen Variablen. Um die Pulsdauer herauszubekommen, subtrahiert man den ersten Wert vom zweiten. Dabei ist es egal, ob es zwischendurch einen Überlauf gab oder nicht. Das geht deswegen, weil der Zahlenraum begrenzt ist (auf Papier ausprobieren, falls dasnicht klar geworden ist.) Dann sollte man zu sinnvollen Ergebnissen kommen. http://www.robotikhardware.de/download/srf05doku.pdf enhält ja auch ein Bascom Bespiel...
danke für die antworten. ich werde es mal ausprobieren und sagen obs dann klappt oder nicht. mfg tobi
Bedenke auch die Schallgeschwindigkeit, die immer von der Temperatur abhängig ist, was die Genauigkeit beeinflußt. Das Mosul scheint mir keinen Sensor zur Temperaturkompensation zu haben. http://www.sengpielaudio.com/DieSchallgeschwindigkeitLuftdruck.pdf Außerdem musst Du bei den SFRxx Modulen immer auch die Richtcharakteristik der US-Keule beachten. (Diagramm im Datenblatt). Diese ist 3-dimensional. Zudem wird das US-Signal von allem in der näheren Umgebung befindlichen Gegenständen zerstreut und diffus reflektiert. Wenn Du z.B. bei Deinen Versuchen den SRF05 zu dicht am Tisch hast, verfälscht Dein Ergebniss durch Reflektionen. Aus Erfahrung würde ich mindestens 20cm Höhe pro Entfernungsmeter vorsehen.
@ Tobi ich muss eine ähnliche anwendung realisieren und bin aber ein neuling auf dem Mikrcontrollergebiet. kannst du deshalb den kompletten code veröffentlichen? würde mir sicher weiterhelfen. mfg Michael Fleisch
Ich interessiere mich auch für den kompletten code, oder über eine korrigierte version. Ich bin leider noch nicht erfahren genug den fehler selber zu finden.
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.