www.mikrocontroller.net

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


Autor: Tung Nguyen hoang (sumovd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen ATmega16 auf dem Testboard STK500 und einen 
Ultraschallsensor SFR04 von Devatech 
(http://www.roboter-teile.de/Shop/themes/kategorie/...)
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


Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tung Nguyen hoang (sumovd)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tung Nguyen hoang.

in welcher Sprache möchtest Du denn programmieren:

- Assembler
- C
- Basic (BASCOM)

Gruss Otto

Autor: Tung Nguyen hoang (sumovd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C Spache

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und hast Du schon angefangen oder irgendein
"Demoprogramm" das läuft ?

Otto

Autor: Tung Nguyen hoang (sumovd)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tung (Gast)
Datum:

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

Autor: Tung Nguyen hoang (sumovd)
Datum:

Bewertung
0 lesenswert
nicht 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?


Autor: Oschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timerinterrupt ?

O.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.