Hallo allerseits,
ich habe jetzt doch Lust bekommen, eine zusammenfassung zu schreiben und somit fange ich einmal an:
Anfangs habe ich viele Versuche und Tests mit Operationsverstärkern durchgeführt, bis ich dann am Ende, als es mittels LF353 so einigermaßen funktioniert hat, draufgekommen bin, dass ich eine Verstärkung brauche, die sich mit der Laufzeit des Signals erhöht. Ich bin dann dank einem Roboternetzbenutzer auf das Ultraschall - Interface von Manf gestoßen, das mir eigentlich gut gefallen hat.
Als Sende - und Empfangswandler benutze ich die aus einem Bausatz von Conrad, diesem hier.
Grundsätzliches Funktionsprinzip:
Der Mikroprozessor erzeugt 20 Perioden mit einer Frequenz von 40kHz, der Resonanzfrequenz der Wandler.
Dieses Singal gelangt über Start In in das Interface.
Dort wird mit diesem Signal der Sendewandler betrieben, die Rampe gestartet und das Flipflop gestellt.
Unmittelbar nach dem Senden des Bursts, also der 20 Perioden beginnt der AVR, die Zeit zu stoppen. Dazu wird der Timer0 benutzt.
Trifft nun das Echo ein, so wird es vom Empfangswandler in eine Wechselspannung "verwandelt". Da diese sehr schwach ist, wird sie duch die Eingangsverstärkung verstärkt und setzt das Flipflop wieder zurück.
Der AVR bemerkt die Zurücksetzung des Flipflops per Interrupt und stoppt den Timer.
Danach wird wird die Zeit ausgewertetet, in cm umgerechnet und ausgegeben.
Das messen der Laufzeitverzögernung übernimmt ein ATmega48, obwohl der dafür ein bisschen überdimensioniert ist.
Als ein großes Problem Stellte sich die Verstärkung heraus, als Lösung wurde eine dritte Transistor Verstärkterstufe eingebaut.
Auch wurden Störunen durch die Betriebsspannung übertragen, so wurde diese mittels 220uF Kondensatoren gestützt.
Empfehlenswert ist es auch, eine veränderbare Induktivität einzuplanen, um den Schwingkreis eventuell abstimmen zu können, da die Resonanzfrequenz nicht unbedingt mit der berechneten übereinstimmt. (Bei mir zumindest nicht genau)
Die Vollständige und für meinen Fall optimierte Schaltung hier:

EDIT: So ein Blödsinn, das Bild wird automatisch komprimiert, und so kann man die Bauteilwerte nicht mehr lesen.
Hier noch einmal hochgeladen, da sollte die Auflösung passen.
Hier noch ein Paar weitere Biler vom aufbau des Modules:



Soweit die Hardware.
Auch die Software hat einige Untstimmigkeiten mit sich gebracht, so ist die Erzeugung des Bursts, der in Start in geht, nun etwas unkonventionell gelöst, aber es funktioniert.
Die ISR ´s dürfen nicht zu lange sein, so zum Beispiel kein Print oder ähnliches, wie ich es ursprünglich gemacht habe.
Das Komplette Programm, das auf dem Mega48 läuft, hier:
Code:
'Ultraschall Entfernungsmessung messprogramm
' endgültige version
$regfile "M48def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 2400
Dim Endtime As Long 'die entgültige zeitin us
Dim Countperoverflow As Integer 'dieOverflows des Timer0 werden hier gezählt
Dim Struser As String * 10 'die Eingabevariable des Users
Dim Countperiodes As Byte 'die Perioden des Us bursts werden gezählt
Dim Timerstand As Byte 'der stand des Timers beim Überlauf
Dim Ausgabefertig As Byte 'flag wird gesetzt, wenn die Zeitmessung erfolgt hat
Dim Entfernung As Word
'########## timer0 Kofigurieren und Initialisieren ##################
Config Timer0 = Timer , Prescale = 1
On Timer0 Isrtimer
Enable Timer0
Stop Timer0
'#######################################################################
'Int0 Konfigurieren
Config Int0 = Rising
Enable Int0
On Int0 Isr_interrupt
'portd.3 als ausgang definieren, das ist der Start in Pin
Config Portd.3 = Output
Portd.3 = 1
'Alle variablen auf null setzen.
Endtime = 0
Countperoverflow = 0
Struser = "sd"
Countperiodes = 0
Timerstand = 0
Ausgabefertig = 0
Print "Ultraschall Entfernungsmessung Online"
Do
Input Struser
If Struser = "" Then
'################# den Sendebrust generieren +++++++++
Countperiodes = 0
Do
Portd.3 = 0 'man kommt so genau auf 40khz
Countperiodes = Countperiodes + 2
Portd.3 = 1
Countperiodes = Countperiodes - 1
Loop Until Countperiodes > 20
Countperiodes = 0
Portd.3 = 1
'######################################################
Enable Interrupts 'interrupts global aktivieren
Start Timer0 'timer starten, as stoppen der zeit beginnt jetzt
Timer0 = 0 'timer auf null setzen, dass die messung auch wirklich bei null beginnt
'variable verändern, dass nicht noch mal in die Schleife
Struser = "sd"
End If
If Ausgabefertig = 1 Then 'Wenn die Fertig flag gesetzt wurde
Entfernung = Endtime / 60 ' Umrchnung in cm
Entfernung = Entfernung + 10 ' auf grund von Kalibrierung nutwendig, kann angepasst werden
Print Entfernung ' Entfernung ausgeben (per UART)
Timer0 = 0
Timerstand = 0 'Alle Variablen wieder auf null setzen
Endtime = 0
Countperoverflow = 0
Ausgabefertig = 0
Entfernung = 0
End If
Loop
'###############TimerIsR##################
Isrtimer:
Countperoverflow = Countperoverflow + 1 'die timerüberläufe zählen
Return
'#########################################
'######### Interrupt isr################
Isr_interrupt:
Stop Timer0 'beim eintreffen der messung Timer stoppen
Timerstand = Timer0 'derzeitigen timerstand in Variable sichern
'Die Endtime in us ausrechnen
Endtime = Countperoverflow * 256
Endtime = Endtime + Timerstand
Disable Interrupts 'interrupts global deaktivieren, um eventuelle Störungen zwischen den pausen zu ignorieren
Ausgabefertig = 1 'die Flag setzen, dass die cm ausgegeben werden
Return
'############ End Programm ###############################################
Sonst: da die verstärkung nun schon sehr groß ist, werden manchmal auch echos von gegenständen, die nicht direkt in einer Linie mit den Kapseln stehen, empfangen und registriert. Für mich stellt dies aber kein Problem dar.
Die Ergebnisse enthalten (in meinem Falle) eine Maximale abweichung von 3cm, aber nicht sehr oft.
Viel Glück jedem, der auch einmal versuchen sollte, solch eine Entfernungsmessung zu realisieren!
Mfg Thegon
Lesezeichen