Forum: Mikrocontroller und Digitale Elektronik Angfängerproblem mit dem ADC


von Tung N. (sumovd)


Lesenswert?

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


von jack (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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

von Tung N. (sumovd)


Lesenswert?

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?

von Otto (Gast)


Lesenswert?

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

von jack (Gast)


Lesenswert?

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.

von Otto (Gast)


Lesenswert?

Hallo Tung Nguyen hoang.

in welcher Sprache möchtest Du denn programmieren:

- Assembler
- C
- Basic (BASCOM)

Gruss Otto

von Tung N. (sumovd)


Lesenswert?

C Spache

von Otto (Gast)


Lesenswert?

Und hast Du schon angefangen oder irgendein
"Demoprogramm" das läuft ?

Otto

von Tung N. (sumovd)


Lesenswert?

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?

von Otto (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Tung (Gast)


Lesenswert?

@Otto, schönen Dank für die sehr klare Hinweise!
Ich werde probieren und den Code hier posten.

von Tung N. (sumovd)


Lesenswert?

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?


von Oschi (Gast)


Lesenswert?

Timerinterrupt ?

O.

von Otto (Gast)


Lesenswert?

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