Werbung
Hallo,
wenigstens schon etwas gefunden.
Mich interessiert die Schaltung auch. Hast Du die aus dem Wiki http://www.rn-wissen.de/index.php/Ultraschall-Interface 1:1 nachgebaut?
In Deinem Programm stört mich noch das Print in der ISR. Ablaufzeit in einer ISR sollte ja so kurz wie möglich sein. Wenn nur der erste Wert intressiert, wäre es egal...?
Ich habe vor so ein Meßprogramm zu schreiben. Dazu nehme ich mangels Bauteilen einen Atiny25 als Simulator, der mir entsprechende Anschlüsse und Signale des US-Interfaces zur Verfügung stellt. Ich denke zunächst mal an ein Eintreffen des Echos nach 3ms, daß einer Entfernung von ca 50cm entspricht. (Schallgeschwindigkeit 343m/s - 1s/343m = 0,0029s/m - Hin und zurück - Distanz 50cm)?
Gemessen wird dann mit einem Attiny45.
Mal sehen, ob es am Programm oder Platine liegt und ob ich überhaupt was hinkrieg.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Ich habe das Oszi in gang gebracht, jetzt muss ich von traurigen Erkenntnissen berichten: ;-(
als erstes hat einmal die Freqenz des Bursts nicht gestimmt, war mit etwa 30 kHz zu klein, die habe ich aber gleich ausgebessert.
dann habe ich am ausgang (pulse out) gemessen, es kommt gar nichts raus
Ich habe am transistor des Teiles "Amplifier" gemessen, (Kollektor): nichts was größer ist als 10 mV, das könnte gut auch rauschen sein.
Ich habe am transistor des Teiles "Swich & Comperator" gemessen (auch Kollektor): (Jetzt kommts...) Normaler weise 5V, dan sinkt der pegel im 40 kHz Takt ab und schießt rechteckartig wieder hoch, also so etwas wie eine verkehrte (nach unten gedrehte) Sätezahnspannung.
Dann habe ich den Emfangswander abgeschlossen: das gleiche Resultat. ;-( Es hat also nichts mit dem Ultraschall zu tun...
Ich habe dann den Gatterbaustein 4011 verdächtigt, den aber später durchgemessen und ausprobiert, der funktioniert jedoch wunderbar.
Die sendekapsel bekommt, was sie bekommen soll: eine Rechteckspannung mit einer Amplitude von 5 V gegen masse gemessen, es wären dann 10 V, wenn ich zwischen den beiden Pins des Wandlers messen würde, denke ich.
Jetzt weiß ich beim besten Willen nicht mehr, was falsch sein könnte. Hätte jemand eine Idee?
Falls noch irgenteine messung oder andere angaben benötigt werden, ich versuche, so schnell als möglich zu antworten.
Danke für die Antworten, die mir schon gegeben wurden und schon im voraus für die, die noch kommen![]()
Mfg Thegon
In dem Schaltplan fehlt der Kondensator an der Versorgungsspannung dadurch ist es möglich das Störungen über die Versorgungsspannung von der Sendeseite zur Empfangsseite kommen.
Der Eingangsteil kann auch Störungen einfach kapazitiv einfangen. Da sollte man ggf. etwas Abschirmung haben und ggf. den Test ohne Eingangssignal mit einem Kurzschluss über den Empfänger machen. Wenn man einfach die Empfangskapsel abklemmt, steigt die Empfindlichkeit gegen Störungen deutlich an.
Hallo Thegon,
leider noch eine nicht so gute Nachricht.
Hab meinen Testaufbau fertig und das Meßprogramm ist in etwa so wie bei Dir aufgebaut:
Systemtakt ist bei mir 8Mhz interner Oszillator; Timer0 läuft mit 1MHz (Prescaler = 8 ). Der schnellere Systemtakt soll vor allem die ISRs schneller machen.
Gestartet wird über ein Taster
Nach Senden des Bursts, den ich nach Deiner Methode erzeuge (mit waitus 11 komme ich auf 41kHz), wird mit dem Timer die Zeitmessung gestartet. Bursts sind bei mir eigentlich egal, da der Tiny25 Simulator einfach nur auf ein low wartet und dann sofort einen Pin als Echo für 3ms nach low zieht. Hoffe, hab das richtig simuliert. Soll eine Distanz von ca 50cm darstellen.
Overflows werden im Timer0 OVF-Interrupt gezählt.
Trifft das Meßende nach ca 3000µs (mit Oszi kontrolliert) ein, wird in der INT0 ISR die Zeit gesichert und später im Hauptprogramm ausgegeben.
Bei meinem Glück/Pech trifft das Meßende in der Nähe eines Timer0 Überlaufs ein und damit geht ab und zu ein Überlauf verloren. Bedeutet eine Ungenauigkeit/Abweichúng von mindestens 256µs. Sieht aus, als wenn der Timerüberlauf gerade kommt, wenn der INT0 abgearbeitet wird.
Ansonsten ist die Abweichung der einzelnen Meßwerte untereinander zwischen 0 und 25µs.
Werde noch ein bißchen probieren, denke aber, das man da anders rangehen muß.
Besser wäre auf jeden Fall ein 16 Bit Timer. Du müßtest doch auf dem ATMega48 noch einen frei haben? Ohne die Overflow ISR sind die Abweichungen nur noch sehr gering.
Viel Glück bei der HW. Es kann nur noch bessser werdenDer Oszi geht ja schon wieder.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Mit etwas Umstand kann man den fehlenden Overflow Interrupt erkennen. Das geht so ähnlich wie bei der Erweiterung der ICP Funktion auf mehr als 16 Bit.
In der ISR zu INT0 prüft man ob der Timer-wert klein ist (z.B. kleiner als 128 ) und das Flag für den Overflow Interrupt gesetzt ist. In diesem Fall müsste der Overflow Interrupt erst vor den Signal kommen - man zählt also einfach einen Überlauf dazu.
Geändert von Besserwessi (21.08.2011 um 21:44 Uhr) Grund: Smily
Hallo,
hat jetzt etwas gedauert, aber ich habe nun 2 Kondensatoren eingelötet, einen direkt an die versorgungsspannungsanschlüssen (220uF) und noch einen an die versorgungsspannungspins des 4011. Man kan wohl von einer veränderung sprechen: jetzt kommt überhaupt kein Interrupt mehr herein.
Naja, immerhin schon mal besser als 16, die nicht sollten.
Ich habe noch einmal die Frequenz des ausgangsbursts gemessen, sie beträgt wunderschöne 40,1 kHz, tastverhältnis 63 % (ich hoffe, das macht nichts ). diese kommen auch beim Sendewandler an. Die Veff zwischen den Sendewandlerpolen ist mit V~ einstellung des Multimeters nicht wirklich zu messen, kurz zeigt er ca. 11V an, dann nur mehr 0,6. Ich denke aber, dass die Freq. ein bisschen zu schnell für das messgerät ist. Ich nehme an, das Senden darf als Problemquelle erst einmal außer Acht gelassen werden. Ich komzentriere mich derzeit auf die Eingangsverstärkungund den Schwingkreis.
Ich habe dann noch einen interessanten test durchgeführt: mit einer Batterie (ca. 1V) an den Pins des Empfangswanlers "kitzeln" Dies löst Interrupts aus, was heißt, dass zumindest etwas durch die Schaltung durchkommt, wenn auch nur notdürftig.
Zu den obrigen beiträgen: wegen 25 us ungenauigkeit (die auch bei meinen simulations - tests auftraten) will ich mir nicht den Kopf zerbrechen, das wäre ja umgerechnet eine ungenauigkeit von weniger als 0,5 cm, so genau muss das ganze nicht sein, mir würde eine genauigkeit von 1-2 cm völlig genügen, was dan eine max. ungenauigkeit von 120 us wären.
EDIT: Ah, das mit dem Interupt habe ich erst nicht ganz genau gelesen, ich denke, daran lässt sich ja noch feilen, wie Besserwessi geschrieben hat.
Freut mich übrigens sehr, dass du (Searcher) dich auch tatkräftig mit meinem Problem beschäftigst![]()
Mfg Thegon
Geändert von Thegon (22.08.2011 um 11:20 Uhr)
Hallo,
aber es ist Bewegung drin und das ist immer gutZitat von Thegon
![]()
Ich bin auch weiter und habe meinen gegenwärtigen Code mal eingefügt. Bitte die umständliche Meßwertausgabe nicht weiter beachtenUnten dran noch der Simulatorcode.
Die Anregung ist eingeflossen durch Stoppen des Timers und Abfrage des TOV0 Flags in der INT0 ISR. Hatte gestern ähnlich probiert, aber die Timerstand Variable noch analog zum TCNT0 Register als Byte deklariert gehabt. Addieren von 256 brachte da noch irritierende Meßergebnisse.Zitat von Besserwessi
Nun läuft es aber und die Abweichungen der Messergebnisse betragen nur noch maximal 16µs. Der tatsächliche Fehler muß noch kleiner sein, da ich auf dem mitlaufenden Oszilloskop kleine Veränderungen der Pulsweite auf "Pulse out" gemessen habe, die analog in das Meßergebnis eingingen.
Größenordnungen:
16Pulse mit 41kHz. Simulator schickt sofort Meßbeginn zurück. Meßende nach 3ms. Mit Oszi gemessener Meßpuls vom Simulator zwischen 2968µs und 2974µs, Meßanzeige zwischen 2592µs und 2608.
Das Ganze ist auf Steckbrett aufgebaut und die beiden Signalverbindungen zwischen den µCs über 1k Widerstände gemacht.
Weiter Daumen drückend für die HW und Dank auch Dir und allen Beteiligten für den thread.
Gruß
Searcher
Code:'################################################### 'File: US-Meßprogramm.bas 'IDE: BASCOM-AVR DEMO Version 2.0.5.0 'Meßprogramm zum Messen von US-Laufzeit mit RN Wiki US-Interface 'Messung wird erst gestartet, wenn der Burst komplett gesendet wurde 'Messung wird gestoppt mit Eintreffen des 0 nach 1 Wechsel auf PB2 ' 'ATtiny45 'Mit Taster an PB4 den Burst und Messen starten 'Eingang an PB2 (INT0) - Meßpulsempfang vom Interface 'Ausgang an PB1 - 16 Pulse mit 40kHz zum Interface 'Ausgabe der Meßwerte über PB3 mit SW UART an 4 fach 7-Segmentanzeige '####################################################### $regfile = "attiny45.dat" $framesize = 32 $swstack = 40 $hwstack = 40 $crystal = 8000000 'interner Oszillator '##### Definitionen für 7segment ausgabe ###### Dim Num_to_disp As Word Dim Y As Byte Dim Helperbyte As Byte Dim Index As Byte Dim Disp_string As String * 6 Dim Digit_char As String * 1 Declare Sub Display_value(num_to_disp As Word) Open "comb.3:115200,8,n,1" For Output As #1 'comb.3 -> TX ist Pin PB3 '#### ende Definitionen für 7segmentausgabe ####### Dim Pulsecount As Byte Dim Timer0_overflows As Word 'kann 65535 overflows zählen Dim Endtime As Word 'geht bis 65535 µs = 65,535 ms, meine Anzeige bis &D9999 Dim Timerstand As Word Dim Flag_messung_ende As Byte Dim Flag_ausgabe_fertig As Byte Portb = &B11110101 'alle Pullups auf portb einschalten, Ausnahme PB1, PB3 Config Portb.1 = Output Config Int0 = Rising On Int0 Isr_stop_messung Enable Int0 Config Timer0 = Timer , Prescale = 8 'Timer wird hier mit 1Mhz gestartet (8Mhz Systemclk) On Timer0 Isr_count_overflows Stop Timer0 'Timer stoppen Enable Timer0 'overflow interrupts Timer0 erlauben Portb.1 = 1 'Ausgangsruhezustand auf Burst out Pin Endtime = 0 Call Display_value(endtime) '7 Segment initialisieren Call Display_value(endtime) '7 Segment initialisieren Enable Interrupts Do 'Beginn Hauptprogramm Do 'Warten auf Tastendruck (PB4 nach GND) Debounce Pinb.4 , 0 , Start_mit_burst Loop Start_mit_burst: For Pulsecount = 1 To 16 '16 Pulse erzeugen (Burst mit ca 41kHz) Reset Portb.1 Waitus 11 Set Portb.1 Waitus 11 Next Pulsecount Flag_messung_ende = 0 Flag_ausgabe_fertig = 0 Timer0_overflows = 0 Timer0 = 0 'Timerzähler (TCNT0) mit 0 initialisieren Start Timer0 'Meßzeit beginnt Do 'Schleife zum Warten auf Meßende If Flag_messung_ende = 1 Then 'Wenn Messung zu Ende, dann zur Anzeige Endtime = Timer0_overflows * 256 'Meßzeit in µs ausrechnen Endtime = Endtime + Timerstand 'Meßzeit in µs ausrechnen Disable Interrupts 'ohne disable irgendwelche Probleme bei meiner Spezialausgabe Call Display_value(endtime) 'Meßzeitausgabe über 7 Segmentanzeige Enable Interrupts Endtime = 0 Flag_ausgabe_fertig = 1 End If Loop Until Flag_ausgabe_fertig = 1 'Ende Warterei wenn Anzeige des Meßwertes erfolgt ist Loop 'Loop Hauptprogramm Isr_count_overflows: 'Ansprung, wenn Timer0 überläuft Incr Timer0_overflows Return Isr_stop_messung: 'Ansprung bei Eintreffen rising edge an Pb2 über INT0 Stop Timer0 'Meßzeit Ende, Timer anhalten, neuen OVF0 verhindern Timerstand = Timer0 'Timerstand sichern If Tifr.tov0 = 1 Then 'Falls bis "Stop Timer0" noch ein OVF0 aufgetreten -> Timerstand = Timerstand + 256 'hier berücksichtigen Set Tifr.tov0 'Timeroverflowflag löschen End If Flag_messung_ende = 1 'Indikation für Ausführen der Anzeige Meßwert in Hauptprogramm Return '############ Folgende Zeilen bis zum Ende nur zur Datenausgabe über 7 Segmentanzeige ############# Sub Display_value(num_to_disp As Word) 'gibt Dezimalzahlen bis 9999 aus Disp_string = Str(num_to_disp) For Y = Len(disp_string) To 3 Helperbyte = Lookup(16 , Segmentpattern) Put #1 , Helperbyte Next For Y = 1 To Len(disp_string) Digit_char = Mid(disp_string , Y , 1 ) Index = Val(digit_char) Helperbyte = Lookup(index , Segmentpattern) Put #1 , Helperbyte Next End Sub Segmentpattern: 'darzustellende Zeichen (hex 0..F...) 'Segmente abcdefg: ' ":" = Doppelpunkt in der Mitte Data &B00000011 'Ziffer "0", 0 = segment ein, 1 = aus Data &B10011111 'Ziffer "1" Data &B00100101 'Ziffer "2" Data &B00001101 Data &B10011001 Data &B01001001 Data &B01000001 Data &B00011111 Data &B00000001 Data &B00001001 Data &B00010001 Data &B11000001 Data &B01100011 Data &B10000101 Data &B01100001 'Ziffer "E" Data &B01110001 'Ziffer "F" Data &B11111111 'dunkel Data &B11111101 'nur Segment g eingeschaltet (-) '########### ENDE US-Meßprogramm.bas ############################################## '################################################### 'File: US-Simulator.bas 'IDE: BASCOM-AVR DEMO Version 2.0.5.0 'Ulraschall Interface Simulator nach RN Wiki US-Interface ' 'ATtiny25 'Eingang an PB2 (INT0) - Start in 'Ausgang an PB3 - Pulse out '####################################################### $regfile = "attiny25.dat" $framesize = 32 $swstack = 40 $hwstack = 40 $crystal = 8000000 'interner Oszillator Portb = &B11110111 'alle Pullups auf portb einschalten, Ausnahme PB3 Config Portb.3 = Output Config Int0 = Falling 'INT0 bei Wechsel von 1 auf 0 an port PB2 "Start in" On Int0 Isr_simulate_us_messung Portb.3 = 1 'Wiki US Interface "Pulse out" Ruhezustand Enable Int0 Enable Interrupts Do 'Hauptschleife: INT0 macht schon die ganze Arbeit Loop Isr_simulate_us_messung: 'Ansprung Bei Eintreffen Von Pulsen An Pb2 Portb.3 = 0 'Pulse out auf 0 zeigt Meßbeginn Waitms 3 'simulieren von 3ms Gesmatlaufzeit des Schalls Portb.3 = 1 '"Echo" eingetroffen Set Gifr.intf0 'durch empfangenen Burst neues anstehendes INTF0 Flag löschen Return '########## ENDE US-Simulator.bas #######################
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Danke für den Code, ich denke, ich werde meinen einmal ein bisschen verbessern.
Ich habe auch von der HW neuigkeiten: Das Problem sollte zwischen Empfängerkapsel und dem Collector des Transistors im Comperator & swich teil liegen,
denn neueste erkenntnisse lauten:
1) 20 perioden des US Bursts werden korrekt mit 40,7 khz ausgegeben, der Sendewandler hat an den Polen eine Amplitude von ca. 11V, wie sich das gehört.
2) Das Flipflop wird zum kippen gebracht, es geht Pulse out auf low.
3) Jetzt kommt kein Signal seiten der Empfängerschaltung, so bleibt das Flipflop für immer auf low. (am Pulse out)![]()
4) Die rampe wird gestartet und läuft, bis sie oben ansteht (ca. 4,5V wegen dioden, denke ich ) und bleibt so, da kein impuls oder ähnliches ankommt
5) Natürlich wird dann auch kein Interrupt ausgelöst
Das mit dem Oszi ist schon eine Seltsame geschichte:
es ist ein HPS5 von Vellemann, ziemlich alt und wird auch schon nicht mehr verkauft.
Manchmal will es einfach nicht starten: Ich stecke die Stromversorgung an (9V DC netztteil) und garnichts passiert. Ich habe das netzteil überprüft und wieder angeschlossen, da hat es einwandfrei funktioniert (ich habe dann geschieben: ich habe das Oszi wieder in gang gebracht)
Heute wollte ich an dem Amplifier Transistor messen, das oszi wieder angesteckt: leerer Bildschirm![]()
das ganze noch ein paar mal wiederholt, reset gedrückt usw. : ohne erfolg
Hat villeicht jemand eine Idee, was ich da tun könnte? Ohne oszi ist es nämlich schwierig, beim US - interface irgentwas herauszufinden...
Mfg Thegon
Geändert von Thegon (22.08.2011 um 12:45 Uhr) Grund: Tippfehler
Hab bei mir noch eine Macke entdeckt. Habe die Pulsweite noch ein bißchen variirt und bekomme Werte von 2568 bis 2583 nicht angezeigt. Also kurz nach nach 10 Timer0 Überläufen.Zitat von Thegon
Vermutung: INT0 trifft ein, wenn gerade die Überlauf-ISR läuft und der INT0 etwas warten muß.
Allein das würde eine "echte" Ungenauigkeit von 16µs verursachen. Denke auch, daß das vernachlässigbar ist. Bin gespannt, wie es mit dem richtigen Interface läuft.
PS @Thegon: Welche Schallwandler benutzt Du.
Leider traue ich mich nicht, Dir Tipps zum Oszi zu geben außer so Laienüberprüfungen wie Wackelkontakt? oder Netzteil tauschen? Ausgetrocknete Elkos? aber wo???
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Lesezeichen