PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschall-Interface will nicht...!



BASTIUniversal
31.12.2005, 18:55
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... 8-[

Manf
31.12.2005, 19:16
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

BASTIUniversal
31.12.2005, 19:38
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.

Manf
31.12.2005, 20:12
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

BASTIUniversal
01.01.2006, 14:08
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 ](*,)

H.A.R.R.Y.
02.01.2006, 15:07
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)...

BASTIUniversal
02.01.2006, 17:04
Hallo!
Das mit dem Piepsen konnte ich mir auch nicht erklären...!
Hier ein paar Ausschnitte aus meinem Programm (Bascom):
Timer Konfiguration:

Config Timer0 = Timer , Prescale = 1
Timer0 = 210
Bei Timer0 Interrupt:

Ontimer0: 'Bei Timer0-Overflow PinB.1 toggeln (Start In). Bei 3,68MHz ca. 40,1kHz

Toggle Portb.0
Incr B

Return
Hauptroutine

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 8-[ )?

MfG

H.A.R.R.Y.
03.01.2006, 11:20
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.

BASTIUniversal
03.01.2006, 20:59
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: https://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

H.A.R.R.Y.
04.01.2006, 11:17
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.

BASTIUniversal
04.01.2006, 18:54
Hallo!
Also, jetzt funktioniert alles soweit! Start In steht auf High und bei Tastendruck kommen 16 Impulse der 40kHz Frequenz, danach wieder High.

Am Analog-Ausgang steigt die Spannung wenn nur High anliegt, sobald ich die 16 Impulse raus schicke geht der auf ca. 500mV zurück. Die Entfernung zu potentiellen Hindernissen ist da aber anscheinend egal, d.h. egal das ich davor halte (CD-Hüllen, Hand, Decke)!

Das muss also irgendwie an der Hardware liegen...oder wie groß sind die Spannungsdifferenzen bei versch. entfernungen?

H.A.R.R.Y.
05.01.2006, 09:41
Wenn ich es recht verstanden habe, sind die 0,5V der Startwert und die Spannung fängt nach dem letzten Burstpuls an langsam anzusteigen. Bei einer bestimmten Entfernung schaltet dann der Ausgang der Komparatorstufe um und hält die Rampe an. Je höher die erreichte Spannung, umso weiter weg der Gegenstand der das Echo erzeugt hat. Diese Sapnnung kann dann per AD-Wandler abgefragt werden. Noch einfacher ist es Takte zu zählen, bis der Komparator erstmals schaltet, das spart den AD-Wandler im µC (falls man mal keinen hat).

Entweder ist die Schaltungsbeschreibung gleich hier https://www.roboternetz.de/wissen/index.php/Ultraschall_Interface zu finden, oder aber der weiterführende Link.

Sollte Deine Spannung
a) nicht ansteigen, kann es daran liegen, daß der Triggerpegel zu niedrig steht also Poti auf minimalen Widerstand drehen und weiter mit b)
b) nicht anhalten bei einem Echo, kann es daran liegen, daß der Triggerpegel zu hoch steht also Poti langsam in Richtung maximalen Widerstand drehen bis die Spannungsrampe stoppt. Ein Echo (am besten von der Zimmerdecke oder einer Wand) in konstantem Abstand dient als Hilfe um den Triggerpegel dann genau einzustellen. Die "Stop"-Spannung ist dann jedesmal gleich. Zur Kontrolle den Abstand zum Objekt ändern und die angezeigte Spannung beobachten.

BASTIUniversal
06.01.2006, 14:59
Hallo!

Ich bin jetzt doch umgeschwenkt auf die erfassung der Zeit zwischen aussenden des Impulses und empfangen des Echos.
Aber das funktioniert auch nicht so wie ich mir das vorstelle, zur erfassung des Echo's verwende ich Int1 und zähle mit Timer0 die Zeit.
Ich hab mal zwei Testreihen gemacht:
Die erste hab ich mittels Taster an Int0 gemacht, d.h. die Zeit zwischen den Werten ist zufällig!
Die zweite hab ich mit Timer2 gesteuert, die Zeit zwischen den Messungen ist also die gleiche (ca. 1,5s)!

Die Werte sind die Anzahl der Überläufe von Timer0!

Irgendwas kann da nicht in Ordung sein, wenn ich am Poti etwas ändere (höherer Widerstand) dann bekomm ich aussetzer (empfange also kein Echo) und wenn ich fast am Anschlag angelangt bin kommt nichts mehr!

Manf
06.01.2006, 15:43
Du bist also sicher dass jetzt ein Burst von 16 Peroiden mit 40kHz gesendet wird?
Wie ist die Schaltung denn aufgebaut? Steckbrett, Lochraster? ist die Spannung geblockt?
Manfred

BASTIUniversal
06.01.2006, 15:51
Also die Schaltung befindet sich noch auf Lochraster, geblockt hab ich noch nichts...werd mich gleich mal dran machen (100µF +/- und zwei 100nF für den 4011 und 7612 müssten ja reichen)!

Manf
06.01.2006, 16:12
Ja, so große Verbraucher sind nicht drauf.
Ich hatte allerdings nicht damit gerechnet, dass man eine Analogschaltung ohne Messhilfsmittel aufbaut.
Wenn Du also die Induktivität und Kapazität am Kollektor von T1 einfach nach Werten eingesetzt hast, dann wird es helfen, für den Test erst mal ein paar kOhm (3,3kOhm) zur Spule parallel zu schalten.
Das senkt die Empfindlichkeit, erhöht aber die Bandbreite.
Wenn es erst mal läuft, dann kann man die Empfindlichkeit wieder erhöhen.
Manfred

BASTIUniversal
06.01.2006, 17:15
Hallo!
Ich hab das jetzt mit den 3,3kOhm und den Kondensatoren gemacht, und es gibt doch einen kleinen Erfolg! Ich denke das das Interface so nicht geplant war, aber ich kann jetzt wohl zwischen ganz nah und "fern" unterscheiden!
Zwar nicht mit der Timer laufzeit oder der Ausgangsspannung sondern über die Anzahl der Echo's die ich bekomme!
Im Anhang sind 3 Bilder, sie zeigen die Timer0 Laufzeit bei (v.l.n.r.) 1cm, 3cm und 12cm Abstand zum Sensor.

Manf
06.01.2006, 17:44
Sobald Du irgend etwas Unterscheiden kannst kann es ja nicht ganz falsch sein, aber was ist denn dargestellt?
Sind das auf der X-Achse einzene Versuche und nach oben die Laufzeit?
Hast Du das Poti auf irgendetwas eingestellt?
Manfred

BASTIUniversal
06.01.2006, 19:11
Nun, auf der X-Achse sind die Interrupts, die Y-Achse die Timer-Werte.
Das Poti steht ungefähr in der Mitte.

Manf
06.01.2006, 19:45
Nun, auf der X-Achse sind die Interrupts, die Y-Achse die Timer-Werte.
Das Poti steht ungefähr in der Mitte.
Ein Skala sehe ich nicht, kannst Du es vielleicht beschreiben. Sind auf der x-Achse einzelen Messungen aufgetragen mit dem Messgergebnis nach oben? Für welche Laufzeit oder Strecke steht denn der Timer Wert?

Für den Test würde ich erst einmal 10-20 Messungen pro Sekunde machen und bei einem Abstand von 10-20cm eine große Echofläche anbringen, vielleicht einen Karton Din A5, einen Schuhkarton oder eine Wand.
Dann bei laufender Messung das Poti auf Reaktion einstellen.

Wenn sich auf die Weise etwas tut dann mit der Verstärkung weitermachen, wenn nicht dann versuchen die Signalspannung am Kollektor von T1 messen. Ein Oszilloskop wäre natürlich zur Prüfung optimal.

Manfred

Manf
07.01.2006, 23:52
Zum Verstärker habe ich noch einige Erläuterungen geschrieben und auch noch eine Abgleichmöglichkeit für die Freuqenz bei hoher Güte angegeben.
Manfred

https://www.roboternetz.de/wissen/index.php/Kleinsignalverst%C3%A4rker

BASTIUniversal
08.01.2006, 16:11
Hallo!
Ich hab probiert das Programm etwas zu optimieren...aber seit dem bekomme ich nurnoch absolut sinnlose Ergebnisse!
Nochmal zum Bild: Der oberste Rand entspricht 255, der Timer0 ist läuft bei mir ohne Prescaler und das gesamte bei 3,686MHz.

Vielleicht fällt ja jemandem im Programm was auf...ich hängs auf jeden Fall mal an!

MfG

H.A.R.R.Y.
09.01.2006, 12:43
Kannst Du Dir ein Scope (mind. 2 Kanal) samt Bediener ausleihen? Vielleicht kennst Du ja jemanden der eines hat. Es würde extrem helfen Dein Problem zu finden.

Tip: Triggern auf steigende Flanke am Pulsout (also auf die erste Flanke des Sendesignals). Kannst gleich sehen ob die 40kHz wirklich stimmen und die richtige Anzahl Impulse herauskommt.
Dann zuerstmal das Signal am Empfangswandler direkt ansehen. Die Echos kommen mit mehrenen mV retour. Da siehst Du auch sofort, ob der Sendewandler direkt in den Empfangswandler einkoppelt und eine längere Störung erzeugt. Die würde dann die Funktion des Interfaces unterbinden.
Als nächstes das Signal am Ausgang der Verstärkerstufe (Kollektor von T1) ansehen. Die Echos sollten auch hier sauber zu sehen sein, allerdings ist die Amplitude jetzt halbwegs entfernungsunabhängig.
Das Poti vom Komparator (T2) ist dann natürlich recht schnell eingestellt und man kann sich sicher sein, daß weitere Fehler in der SW zu suchen sind.
Nebenbei kann man noch die Spannungsrampe zur Verstärkungsregelung überprüfen. Wenn die nicht kommt, dann sind vielleicht die Dioden verdreht.

BASTIUniversal
09.01.2006, 16:55
Hallo!
Das mit dem Oszi wird schwierig, aber vielleicht komm ich an eines ran...! Aber wird wohl noch bis zum Wochenende dauern.

MfG

H.A.R.R.Y.
10.01.2006, 11:26
Okay, laß Dir Zeit.
Falls Du eine Störung auf dem Empfänger hast, die direkt vom Sender kommt (man kann das testen indem man den Sendewandler herausnimmt und den Empfänger beobachtet), dann schau einmal hier: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=145491#145491

Ach, da fällt mir noch etwas ein: Nach dem letzten Impuls vom Burst muß die Leitung zum Sender auf '1'=High gezogen werden, sonst kann die Rampe nicht starten und es kommen keine Echos durch. Das kannst Du ja schon mal ohne Oszi checken.

BASTIUniversal
14.09.2006, 19:20
Hallo!
Das mit dem Oszi hat jetzt doch n bisschen länger gedauert als bis zum Wochenende...aber jetzt hab ich ein gutes altes Hameg HM-312 Einkanal Oszi :)

Naja, dann hab ich mich wieder an die zwei Ultraschallkapseln erinnert...gleich mal n bisschen ausprobiert und schon erste Erfolge gehabt! Zwar nicht mit der Schaltung von damals, sondern mit nem einfachen OP.
Naja, aber wenn alles so toll währe dann würd ich nicht hier Posten :-b

Im Anhang sind zwei Bilder vom Signal des US-Empfängers. Wie man sieht ist das Signal vom OP-Ausgang nicht wirklich sauber...ich hätte da lieber ne hübsche Flanke, weiß aber nicht genau welcher Filter sich da Anbietet!

Der OP arbeitet als nicht Invertierender Verstärker mit einer Verstärkung von 50.000/500 Ohm + 1 = 101. Ich weiß nicht ob das mit dem 500 Ohm Widerstand so gut ist, das ist doch schon etwas wenig!
Die Verstärkung muss ich später wahrscheinlich nochmehr erhöhen...ich bekomme ein Signal von "nur" 4V und der Empfänger wird gerade direkt "angestrahlt" vom Sender.

Hat mir jemand Vorschläge für nen Filter den ich da Anwenden kann? Einen Aktiven Bandpass vielleicht? Gute Ergebnisse hab ich mit nem LC-Filter mit 100µH und 100nF bekommen...da kann ich auchnoch Bilder davon machen.

MfG

P.S.: Sorry das ich diesen Uralt-Thread nochmal ausgebuddelt hab :-#

Manf
14.09.2006, 19:32
Schön dass erst einmal ein Signal zu sehen ist.
Das Filter mit 100µH und 100nF ist etwas niedrig in der Impedanz und etwas neben der Frequenz. Da könnte man schon etwas optimieren.
Hast Du auch die beschriebene Abgeleichmöglichkeit ausprobiert?
Manfred

BASTIUniversal
14.09.2006, 19:39
Hallo!
Die Platine von damals hab ich quasi wiederverwertet...hab bis vor 2 Wochen nicht gedacht das ich n Oszi für 50€ bekomme. Abgleichmöglichkeiten gibt's also nichtmehr. Und weil ich grad ein bisschen knapp bei Kasse bin müssen meine Bauteile zu Hause ausreichen.
Die 100µH Spule und der 100nF Kondensator sind halt gerade dagelegen und ich hab's damit mal probiert.

Welche Filter wären denn zu Empfehlen? Ich hab mir gedacht, ich Verstärke das Signal einmal großzügig, Filtere eventuelle Störungen raus und Verstärke nochmal stark. Danach vielleicht nen Komparator, jenachdem wie das Signal ausschaut.
Ist der Plan gut?

Manf
14.09.2006, 19:50
Wie man effizient einen Kleinsignalverstärker mit Filter baut habe ich ja beschrieben. https://www.roboternetz.de/wissen/index.php/Kleinsignalverst%C3%A4rker
Mit Oszilloskop könnte man ihn auch gut abgleichen.
Wenn die Spule das Problem ist, ... hm ... hast Du vielleicht doch noch eine etwas größere und noch einen passenen Kondensator für 40kHz?
Manfred

BASTIUniversal
14.09.2006, 19:55
Naja, mit der Seite muss ich mich mal näher beschäftigen.

Mit Spulen schaut's mager aus...10µH, 100µH und 4,7mH. Kondensatoren 22, 27, 47, 470pF und dann erst wieder 33, 100 und 330nF. Aber ein Widerstandssortiment mit Werten ohne Ende ;-)