-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: Ultraschall-Interface will nicht...!

  1. #1
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228

    Ultraschall-Interface will nicht...!

    Anzeige

    Hallo!
    Ich hab (versucht) das US-Interface von RN-Wissen nachzubauen, aber ich glaube das ich irgendwo einen Fehler drin hab!
    Ich erzeuge mit einem ATMega8 ca. 40kHz und gebe das Signal an "Start In", dann kann man ein sehr leises piepsen hören. Wenn ich nun die 5V wegnehme und die 40kHz draufgebe kommt am Analogue Out irgendwas zwischen 0,44 und 0,8V raus, aber nichts Konstantes.
    Am Pulse Out liegen durchweg 5V an, der Pegel verändert sich überhaupt nicht!
    Wenn ich die Spannung zwischen den beiden Polen des US-Empfängers die Spannung messen kommt immer 0,00V raus, auch wenn ich dauernd die 40kHz sende.

    Ich nehme an das irgendwas beim Empfangen nicht klappt...habt ihr vllt. ein paar Tipps für mich?
    Der US-Sender und Transmitter kommen übrigens von Reichelt.

    Guten Rutsch schonmal...

  2. #2
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    64
    Beiträge
    12.367
    Ich erzeuge mit einem ATMega8 ca. 40kHz und gebe das Signal an "Start In", dann kann man ein sehr leises piepsen hören.
    Einen Dauerton mit 40kHz kann man im allgemeinen nicht hören, da wird noch etwas anderes im Spiel sein.
    Wenn ich nun die 5V wegnehme und die 40kHz draufgebe kommt am Analogue Out irgendwas zwischen 0,44 und 0,8V raus, aber nichts Konstantes.
    Das Signal am Eingang soll ja ein Burst mit begrenzter Dauer sein, etwa 8-16Perioden. Bei einem Dauersignal ist ein Wert am Ausgang von einer Schwellspannung (um 0,6V) nachvollziehbar.
    Manfred

  3. #3
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Das mit dem piepsen hat mich auch sehr verwundert, könnte das auch die Induktivität sein?
    Ich hab mein Programm jetzt auch 16 Impulse programmiert...am Anfang beträgt die Spannung 1,27V, nach der messung sind es ca. 1,11V.
    Dann erhöht sich die Spannung langsam wieder auf die 1,24V.

    Der Pulse Out bleibt aber immer auf 5V.

  4. #4
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    64
    Beiträge
    12.367
    Das mit dem piepsen hat mich auch sehr verwundert, könnte das auch die Induktivität sein?
    Die sollte sich auch nur mit 40kHz angeregt werden. Bei einer hohen Impulsfolgefreqenz kann man vielleicht die Folgefrequenz hören.

    In welchem Abstand soll denn beim Test ein Hindernis erkannt werden?
    Manfred

  5. #5
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Hallo!
    Ich hab nochmal ein neues Proramm geschrieben, Start In wird auf 5V gelegt und durch betätigen eines Tasters werden 16 Impulse ausgeschickt.
    Hier nochmal die Messungen:

    - Nur 5V, kein Signal an Start In:
    Pulse Out: 5V
    Analog Out: 1,25V

    - 5V auf Start In (Ruhe Pegel):
    Pulse Out: 5V
    Analog Out: Spannung langsam abnehmend auf ca. 1,16V

    - Nach 40kHz Burst:
    Keine Veränderung zu ruhe Pegel.

    "Gemessen" wird vom Schreibtisch zur Decke, ungefähr 1,7m. Bei 10cm (gegen CD-Hüllen) kommen die gleichen Ergebnisse raus!

    Falls du noch andere Spannungen/Werte brauchst einfach sagen...nur ein Oszi hab ich leider nicht

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    Ich erzeuge mit einem ATMega8 ca. 40kHz und gebe das Signal an "Start In", dann kann man ein sehr leises piepsen hören.
    Das menschliche Gehör nimmt Töne dieser Frequenz garantiert nicht mehr wahr - die Grenze liegt je nach Alter zwischen 16kHz und 20kHz.

    Wenn Du es wirklich piepsen hörst, dann könnte es sein, daß Du dich bei der Timer-Einstellung vertan hast, oder bei der Berechnung des Teilfaktors zur Signalerzeugung. Wenn der Wandler nicht mit 40kHz (plus minus ein paar hundert Hz) angesteuert wird, dann reagiert der Empfangswandler kaum bis gar nicht auf den ankommenden Schall.

    Welche Einstellung verwendest Du für den Timer (die Registerwerte oder ein kurzer Auszug vom Code wären hilfreich)? Welcher Oszillator läuft (interner RC oder externer Quartz)?

    Meine Vermutung ist, daß Du zwar 25µs per Timer erzeugst, aber den Modus auf Output-Toggle gestellt hast. Dann ist die Periodendauer 50µs (=> 20kHz, die man gerade noch so hören kann)...
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

  7. #7
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Hallo!
    Das mit dem Piepsen konnte ich mir auch nicht erklären...!
    Hier ein paar Ausschnitte aus meinem Programm (Bascom):
    Timer Konfiguration:
    Code:
    Config Timer0 = Timer , Prescale = 1
    Timer0 = 210
    Bei Timer0 Interrupt:
    Code:
    Ontimer0: 'Bei Timer0-Overflow PinB.1 toggeln (Start In). Bei 3,68MHz ca. 40,1kHz
    
    Toggle Portb.0
    Incr B
    
    Return
    Hauptroutine
    Code:
    Do
    
    If B = 16 Then                                              'Nach 16 Impulsen Timer0 stoppen
       Stop Timer0
       B = 0
    End If
    
    Loop
    Im Anhang ist das Komplette Programm. Der Mega läuft auf 3,6864MHz (Fusebit C: 1 BODLEVEL 2,7V; B: BODEN disabled; KL: 6CK, 64mS delay; A987: external XTAL).
    Wenn der Timer auf den Wert 210 geladen wird und ohne Teiler läuft müssten ja 3686400Hz/(256-210)=80139Hz herauskommen. Bei Toggle PortB müssten dann ungefähr 40070Hz rauskommen, oder hab ich mich irgendwie vertan (wär mir am liebsten )?

    MfG
    Angehängte Dateien Angehängte Dateien

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    Damit ich es richtig verstanden habe eine kurze Zusammenfassung:
    Taktfrequenz f = 3.6864MHz
    Vorteiler für Timer0 V = 1
    Setzwert für Timer0 Z = 210
    Benutzt wird Timer0 eines ATmega8

    Im Prinzip hast Du korrekt gerechnet, aber leider macht Dir die Hardware des Timers da nicht mit. Mit dem Laden des Wertes 210 und anschließendem Starten des Timers wird dieser ab 210 bis 255 zählen und dann ab 0(!!!) weitermachen. Der allererste Zyklus des Timers dauert tatsächlich 46 Takte. Alle folgenden dauern dann aber 256 Take und damit stimmt die Frequenz nicht, denn der Wert den Du ins Timer0-Register schreibst wird nicht als "reload"-Wert gespeichert!!! So eine Funktion bietet nur Timer1, der kann dann gleich noch den Portpin OC1B oder OC1A per Hardware toggeln und damit stimmt die Frequenz dann ganz akkurat.
    -> Schau ins Datenblatt des ATmega8, die Timer-Operationen sind da genau beschrieben.

    Damit Du den Timer0 wie geplant nutzen kannst, mußt Du jedesmal den Setzwert (210) neu laden, wenn der Timer exakt bei 0 angekommen ist. Da aber die Interruptbearbeitung um ein paar Takte schwanken kann, muß die SW den neuen Setzwert errechnen und das ist etwas komplizierter:
    Wenn der Zähler auf 0 steht wird der Interrupt ausgelöst. Bis der Interrupt seine Arbeit aufnimmt und während der Abarbeitung wird jeder Takt weitergezählt. Wenn jetzt also die Stelle erreicht ist, an der der Setzwert neu geladen werden muß, dann müssen die bereits abgelaufenen Takte (x) natürlich abgezogen werden um den korrekten nächsten Interrupt zu bestimmen:
    3686400Hz/(256-(210+x))
    Also muß Deine Interruptroutine das Zählerregister auslesen um die bereits vergangenen Takte zu bestimmen, diesen Wert und einen bestimmten konstanten Wert (für die folgenden Operationen incl. der Schreiboperation) auf die 210 addieren und dann das Ergebnis zum Timer0-Register schreiben. Damit stimmt dann die restliche Zeit bis zum nächsten Toggeln.

    Für den kompletten Ablauf (inklusive Interrupt-Reaktionszeit, Interruptablauf und Interrupt-Rücksprung) hast Du maximal 45Takte, mindestens 41Takte Zeit, denn vor dem nächsten Interrupt wird mindestens ein kompletter Befehl (mit max. 4Takten) abgearbeitet. Das wird eng.

    Das ohne Oszi zu debuggen würde ich mich nicht trauen deswegen mein Tip:
    Nimm lieber den Timer1 - ist dann doch einfacher zu programmieren.
    Den Sendewandler z.B. an Pin OC1B, den Timer-Setzwert kannst Du nach ICP- oder OC1A-Register schreiben (hängt vom Modus ab). Das Toggeln des Ausgangs kann der Timer gleich mit erledigen - damit sind die Ungenauigkeiten durch die Interruptreaktionszeit auch gleich beseitigt. Die Interruptroutine braucht dann nur noch die Pulse in einer internen Variablen (Register) zählen und nach 16 Impulsen den OC1B hochohmig schalten, damit ist der Burst draussen. Natürlich kannst Du auch den Timer1 anhalten.
    Brauchst Du die SPI, dann kannst Du den Wandler auch an OC1A hängen und programmierst den Timer1 etwas anders.
    Die Formeln für die Frequenzrechnung sind im Datenblatt für die Modi alle angegeben.

    By the way: 3.6864MHz/256=14.4kHz - die hört man durchaus und das ist auch das piepsen, was Du erwähnt hast.
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

  9. #9
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Danke @H.A.R.R.Y.! Die 40kHz krieg ich hin, nur der Burst will nicht (anhalten von Timer1 will nicht...). Ich hab dazu schon nen Thread im Bascom-Forum eröffnet: http://www.roboternetz.de/phpBB2/viewtopic.php?t=15667

    Wenn ich das morgen noch hinbekomme wär's echt super...ich will das ganze wenn's funktioniert ggf. als OpAmp-Versuchsgelände verwenden

    MfG
    Basti

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    Normalerweise hält der Timer an (jeder Timer beim AVR!) wenn man die Bits für den Vorteiler-Wert alle auf '0' setzt.

    EDIT: Um dem Ausgang das Toggeln abzugewöhnen kannst Du nach den erforderlichen Burst-Impulsen das TCCR1A auf 0b10000000 umstellen. Beim nächsten Timeout wird dann OC1A auf '0' gehalten bis wieder der Toggle-Modus aktiviert wird. An OC1A erscheint dann der Burst. Geht natürlich auch mit '1' an OC1A. Und im Gegensatz zum ANhalten des Timers läuft das alles schön synchron mit 40kHz, so das auf dem Burst auch keine Störungen auftauchen.
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •