Hallo, ich habe einen ATmega16 auf dem Testboard STK500 und einen Ultraschallsensor SFR04 von Devatech (http://www.roboter-teile.de/Shop/themes/kategorie/detail.php?artikelid=1&source=2) Möchte jetzt folgendes machen. 1. Den Sensor starten und Abstand messen 2. Den Sensor an dem ADC des Atmega16 anschliessen und die vom Sensor gelieferten Signale einlesen Also, wie ich verstanden habe, kann man den Sensor direkt mit dem PortA verbinden . Die Versorgungspins vom Sensor sind mit Pins VTG und GND, der Eingangpin des Sensors mit PA0 und Ausgangspin des Sensors mit PA1. (hab selber einen Kabel gebastelt, der solchen Pins mit einander verbinden) Meine Frage ist: Wie kann ich dann den Sensor starten? Muss ich nur den Pin PA0 als Ausgang und auf High setzen? Wenn es so ist, dann was ist der nächste Schritt? Ich bin sehr dankbar für alle Antwort
Um eine Messung zu starten wird ein Impuls (TTL-Pegel, mind. 10µs) an den Triggereingang gelegt, dann wird der US-Burst ausgesandt, und der Echo-Ausgang vom SRF04 auf High gelegt. Das erste hereinkommende Echo schaltet den Echo-Ausgang wieder auf Low. Die Länge dieses Echo- Impulses kannst Du jetzt auswerten. Aber wieso hast Du denn kein Datenblatt?
> Den Sensor an dem ADC des Atmega16 anschliessen und die vom > Sensor gelieferten Signale einlesen Falls das noch nicht klar wurde: Du brauchst keinen ADC dazu. Die Entfernung wird über die Zeitdauer definiert, nach der der Sensor den Echo-Eingang wieder auf low legt.
erstmal schönen dank für die schnelle Antwort > Um eine Messung zu starten wird ein Impuls (TTL-Pegel, mind. 10µs) > an den Triggereingang gelegt, dann wird der US-Burst ausgesandt, und > der Echo-Ausgang vom SRF04 auf High gelegt. Das erste hereinkommende > Echo schaltet den Echo-Ausgang wieder auf Low. Die Länge dieses Echo- > Impulses kannst Du jetzt auswerten. > Aber wieso hast Du denn kein Datenblatt? naja, Datenblatt habe ich auch. Aber wie gesagt, ich habe direkt den Eingangspin mit PA0. Muss ich dann einen TTL-Impuls am PA0 erzeugen? Falls ja, dann wie? >> Den Sensor an dem ADC des Atmega16 anschliessen und die vom >> Sensor gelieferten Signale einlesen > > Falls das noch nicht klar wurde: > Du brauchst keinen ADC dazu. > > Die Entfernung wird über die Zeitdauer definiert, nach der > der Sensor den Echo-Eingang wieder auf low legt. Warum brauche ich keinen ADC? Ich dachte, der Echo ist selber auch ein TTL-Signal (auch Spannung?). Ich bin völlig Newbies in diesem Bereich. Kannst du mir vielleicht genauer erklären?
Ein ADC kann (in einem gewissen Bereich) beliebige Spannungen messen z. B. 0-5V in einen Wert von beispielsweise 0 -1024 wandeln (Analog-Digital-Wandler). Du brauchst aber nur die Information "0" oder "1" (digital) bei TTL also 0 oder 5V. Gruss Otto
Der SFR04 gibt keine veränderliche Spannung aus, sondern einen
Impuls mit einer variablen Länge. Diese Länge mußt du mit Deinem µ
messen, am besten mit einem Timer, der am Impulsanfang gestartet wird
und am Impulsende gestoppt wird.
>Muss ich dann einen TTL-Impuls am PA0 erzeugen? Falls ja, dann wie?
Also wenn Du das nicht weißt, dann mußt Du Dich auf jeden Fall mit der
Technik der Mikroprozessoren auseinandersetzen.
Hallo Tung Nguyen hoang. in welcher Sprache möchtest Du denn programmieren: - Assembler - C - Basic (BASCOM) Gruss Otto
Und hast Du schon angefangen oder irgendein "Demoprogramm" das läuft ? Otto
mit C habe ich schon mal gearbeitet. Einpaar Demoprogramm für den Atmega habe ich auch geschrieben (LEDs ein- oder ausschalten, LED an beim Betätigung des Switches,... Wenn ich mich nicht irre, gibt's auch Beispiele in AVR-Tutorial, oder?
Tung Nguyen hoang, Dann kannst Du doch den Portpin setzen um die Messung zu starten und die Zeit messen (ggf. erstmal zählen), die bis zur Rückmeldung (Port wieder Low) vergeht. Fang einfach mal an und wenn es denn nicht funktioniert Deinen code hier posten: "wer nichts wagt, der nichts gewinnt...." Gruss Otto
> Dann kannst Du doch den Portpin setzen um die Messung zu > starten und die Zeit messen (ggf. erstmal zählen), die > bis zur Rückmeldung (Port wieder Low) vergeht. Den Port zwischendurch von Ausgang auf Eingang umschalten nicht vergessen.
@Otto, schönen Dank für die sehr klare Hinweise! Ich werde probieren und den Code hier posten.
Hallo Profis, habe wieder einige Fragen an euch. Ich habe den Sensor mit dem PortA verbunden. PA1 mit dem Triggereingang, PA0 mit dem Echoausgang. Theoristisch wenn ich eine Messung starten will, muss ich den pin1 als Ausgang und auf High setzen. Der Code ist so: //Setzt den Pin1 am Port A als Ausgang DDRA |= (1<< DDA1); //Setzt den Pin1 am Port A auf High PORTA |= (1<<PA1);// Am Pin1 gegen habe ich eine Spannung von ca. 5V gemessen Am Pin0 hingegen 0V Laut Datenblatt darf der Triggersignal nicht länger als 200µs sein und muss vor dem Echosignal wieder auf Low gesetzt werden. Deswegen habe ich den Code einbischen geändert und zwar so: //Setzt den Pin1 am Port A als Ausgang DDRA |= (1<< DDA1); //Setzt den Pin1 am Port A auf High PORTA |= (1<<PA1);// PORTA &= ~(1<<PA1); Dann ab und zu springt die Spannung am Pin0 auf 4V, dann wieder auf 0). Ich verstehe aber nicht, was wäre dann passiert wenn der Triggersignal 200µs überschreitet? Und wie kann man die Messung zyklisch starten (z.B.: jede 100µs)? Ich vermute, ich muss eine Schleife verwenden. Aber wie kann man die Zyklischzeit bestimmen?
Hallo Tung Nguyen hoang,
wenn das Triggersignal länger ist geht sicher nichts kaputt,
es könnte aber sein, dass die Messung mehrfach gestartet wird.
Stelle einfach Sicher, dass es kürzer als 200µs = 0,2ms ist.
> Ab und zu springt......
das werden Deine "Meßergebnisse" sein, wenn Du Dich vor dem
Sensor bewegst.
Starte die Messung und zähle einen mindestens 16 bit Zähler
hoch und sieh mal, ob Du reproduzierbare Ergebnisse erzielen
kannst z.B.:
- Hinderniss in 10 cm = Zählerstand 1.000
- Hinderniss in 100 cm = Zählerstand 10.000
Und dann folge "Oschis" Hinweis und verwende dafür Timer.
Gruss Otto
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.