erstellt  12.11.2011
Ultraschallgenerator  mit Atmega 8
Normalerweise kann der Mensch nur bestimmte Schallwellen  hören , diese liegen je nach Lebensalter und Empfindlichkeit des Gehörs
so zwischen 20 und 16 000 Hz.
Die für den Menschen nicht mehr hörbaren Schallwellen oberhalb der Maximalen hörbaren Frequenz beim Mensch so in etwas bei
14000 Hz werden als Ultraschall bezeichnet, die unterhalb von ca. 20 Hz als Infraschall.
Ultraschallwellen werden z.B. von vielen Tieren erzeugt, auch das reiben zweier Papierblätter aneinander erzeugt unter anderen
auch Ultraschallwellen.
Infraschall Wellen also Wellen unterhalb von etwa 20 Schwingungen pro Sekunde werden erzeugt durch heftige Windböen,
Gewitterdonner, Erdbeben , Hubschrauber, Windräder und sonstigen meist großen langsam drehenden Maschinen.
Das heißt aber nicht das der Mensch sie überhaupt nicht wahrnehmen kann, nur eben nicht mit seinem Gehör, aber Infraschall
spürt man mit seinem Körper
.
Jeder kennt das meist mulmige Gefühl wenn einer dieser großen Hubschrauber über einen hinweg fliegt ,weil die relativ langsam
rotierenden Rotorblätter Infraschall erzeugen.

Fast alle Tiere und auch Kleinkinder können dagegen sehr viel höhere Frequenzen hören, manche ( Fledermäuse ) können sogar nur
die sehr hohen Frequenzen hören.
Die maximal von der Luft noch übertragbaren Frequenz liegt bei etwa 45 000 Hz.
Im Wasser können Ultraschallwellen sehr gut übertragen werden, weil Wasser diese Schwingungen weniger dämpft als Luft.
Deswegen werden solche Schwingungen im Wasser auch zur Ortung benutzt und breiten sich im Wasser mit ca. 1500m/Sekunde fort,
also um einiges schneller als in der Luft mit ca 330m/Sekunde.
In der Medizin werden Ultraschallwellen in der Sonografie verwendet, dort arbeitet man in der Regel mit Frequenzen
zwischen 1,7 MHz und 3,5 MHz.
In der Wissenschaft arbeitet man mit Frequenzen zwischen 15 KHz und 10 GHz.
Diese Schaltung dient zum Test, in wie weit der Mensch oder Tier Ultraschallwellen wahrnehmen kann, ob hörbar oder evtl.fühlbar ?
Mit dieser Versuchsanordnung werden  Ultraschallwellen erzeugt die in einem gewissen Bereich einstellbar sind .
Zur Schaltung
Die  Spannungsversorgung besteht aus einer 9 Volt Block Batterie die einerseits über einen Spannungsregler den Mikroprozessor
mit Spannung versorgt und andererseits direkt auf den Ultraschallwandler geht, damit dieser mit der vollen Batterie Spannung
versorgt wird um die maximale Leistung zu erzielen.
Zur Leistungsmaximierung gehört es auch den Ultraschallgeber in einem Frequenzbereich zu betreiben , der seine eigene Resonanzfrequenz
entspricht.
Diese ist sehr unterschiedlich und sollte dem Datenblatt entnommen werde.
Im hier vorliegendem Fall hat der Ultraschallgeber eine Resonanzfrequenz von 23 KHz +- 2 KHz.
Die Leuchtdioden dienen in der Hauptsache dazu bestimmte Verhaltensweisen des Prozessors in der Testphase zu kontrollieren.
Über den USB Anschluss wird das Programm in den Prozessor gebrannt.
Der Transistor ist ein NPN Standard Typ (BC547).

Die Funktion des aktuellen Programm sieht vor das mit Taster S3 die Frequenz verringert und mit Taster S2 erhöht wird ,
bei Resonanzfrequenz des Ultraschallgebers blitzen
alle 4 Led's im Rhythmus auf und es wird die größte Ultraschall-Leistung abgegeben , unterhalb der Resonanzfrequenz blinkt Led 4 und oberhalb Led 3
wenn das obere Ende der Frequenzskala erreicht ist blinkt Led 1 und am unteren Ende  Led 2 .
Das betätigen des Tasters S2  wird durch ständiges Leuchten von Led 2 angezeigt und das betätigen des Tasters S3 durch ständiges Leuchten von Led 4

 

Datenblatt zum US Geber
Datenblatt Transistor BC547


Zum Programm
Version 1I
Programmzeile
Beschreibung
$regfile "m8def.dat"    
Definiert den Atmega als Atmega 8
$crystal = 1000000   
Gibt die Quarzfrequenz  in Herz an
$hwstack = 32 
Default use 32 Hardware reservierte Speicher
$swstack = 10  
Default Software Resvierung Speicher
DDRC = &B00111100
PortC.2, C.3,C.4,C.5 als Ausgänge setzen
DDRB = &B00000010   Portb.1 als Ausgang setzen
Portd=&B00001100
PullUp an Portd.2,Portd.3 setzen 
Tccr1a = &B01000000 Konfiguration des Timer 1
Tccr1b = &B00001001        
Konfiguration des Timer 1 Takt wirtd durch 1048 geteilt.
Ram=Eprom
Wert aus Eprom ins Ram kopieren
waitms 50
Pause damit kopiert werden kann
Compare1a = Ram Wert aus Ram als Vorgabewert für Vergleicher setzen
waitms 50
Pause zum Kopieren
Do
Hauptprogramm Schleifenanfang
waitms 100
Pause
Portc.5=0
Leds aus
Portc.4=0
Led aus
if pind.2=0 then compare1A=compare1A +1
Taster S3 gedrückt dann Vorgabewert erhöhen
if Pind.2=0 then Gosub Runterlauf
Taster S3immer noch gedrückt dann in Unterroutine "Runterlauf" springen
if Pind.3=0 then Compare1A=Compare1A -1
Taster S2 gedrückt dann Vorgabewert um 1 verringern
If Pind.3=0 then Gosub Hochlauf
Taster S2 immer noch gedrückt dann in Routine "Hochlauf" springen
if compare1A >65534 then Compare1A=65534
Verhindert einen Überlauf
if Compare1A > 65534 then Gosub Unterlauf
Springt in Unterroutine um einen fast Überlauf anzuzeigen
if Compare1A<2 Then Compare1A=2
Verhindert einen Unterlauf
if Compare1A=21 Then Gosub Ultraschall
Springt in Unterroutine um 23 Khz anzuzeigen
Loop
Rücksprung nach Loop
Unterroutine Hochlauf
Hochlauf:
Routinen Sprungandresse
Ram=Ram -1
Ram Variable um 1 verringern
Eprom=Ram
Ram ins Eprom kopieren
Waitms 100
Zeit zum kopieren lassen
Portc.3=0
Led 3 aus
Return
Rücksprung
Unterroutine Runterlauf
Runterlauf:
Routinen Sprungandresse
Ram=Ram+1
Ram um 1 erhöhen
Eprom=Ram
Ram ins Eprom kopieren
Waitms 100
Zeit zum kopieren lassen
Portc.2=1
Led4 an
Waitms 100
Pause
Portc.2=0
Led4 aus
Return
Rücksprung
Unterroutine Ueberlauf
Ueberlauf:
Routinen Sprungandresse
Portc.5=1
Led1 an
Return
Rücksprung
Unterroutine Unterlauf
Unterlauf:
Sprungadresse
Portc.4=1
Led2 an
Return
Rücksprung
Unterroutine Ultraschall
Ultraschall:
Routinen Sprungandresse
Portc.2=1
Led4 an
waitms 8
Pause
Portc.2=0
Led4 aus
Portc.3=1
Led3 an
Waitms 8
Pause
Portc.3=0
Led3 aus
Portc.4=1
Led2 an
Waitms 8
Pause
Portc.4=0
Led2 aus
Portc.5=1
Led1 an
Waitms 8
Pause
Portc.5=0
Led1 aus
Waitms 2000
Pause
Return
Rücksprung
End Programmende

Programm-Funktion
Mit Timer 1 wird ein Takt zwischen 7,6 Hz und 250 Khz erzeugt .
Über die Tasten kann die Frequenz in bestimmten Schritten erhöht oder verringert werden.
Die untere Led (Led4 im Schaltplan) blinkt beim verringern, die 2.Led von unten (Led3 im Schaltplan )
blinkt beim erhöhen der Frequenz.
Die obere Grüne Led ( Led 1 im Schaltplan) zeigt an wenn die Höchste und die rote Led ( Led 2 im Schaltplan)
wenn die niedrigste Frequenz erreicht ist.
Wenn alle 4 Led's gleichzeitig blinken ist die Resonanzfrequenz des Ultraschallgebers von 23 Khz erreicht.
Die erzeugte Ausgangsfrequenz kann am Pin OC2 ( PD.7) abgenommen werden.
Beim Einschalten des Gerätes wird der zuletzt eingstellte Wert wieder zur Verfügung gestellt.
Die Ausgangsfrequnz berechnet sich wie folgt:
Arbeitsfrequenz des Prozessors teilen wir durch den eingestellten Prescaler,
der daraus entsprechende Wert steuert erst meinen Timer an. 
1 000 000/1=1000 000 Hz
Wenn ich nun mit 1 MHz den Timer ansteuere bedeutet das ,dass er in 1 Sekunde bis 1 000 000 zählen kann,
da meine Timer eine Auflösung von 16 Bit hat kann er nur bis 65535 zählen damit würde er 15,25 mal
Überlaufen in 1 Sekunde.
1000 000 / 65535 = 15,25 Hz
Aber die Frequenz ist mir zu klein also muss ich dafür sorgen das er nicht bis 65535 zählt sondern gib ihm
einen Vergleichswert , so das er schon vorher beim erreichen des Vergleichswert einen Interrupt auslöst.
Bei einem Vergleichswert von beispielsweise 21 zählt mein Zähler mit 1 MHz in der Sekunde ,
um bei jedem 21. Takt einen Interrupt auszulösen muss also die 1000 000 durch 21 geteilt werden.
1000 000/ 21=47 619 Hz
Weil aber bei jedem Überlauf der Status des Ausgang - Pin OC1A geändert wird ,
benötige ich 2 Änderungen um eine Schwingung zu erzeugen , also muss der Wert noch einmal durch 2
geteilt werden.
47 619 / 2= 23 809 Hz
Bei einer Arbeitsfrequenz von 1 MHz und einem Vorteiler von 1, und Vergleichswert von 21 komm ich also auf 23 809 Hz.
Je höher der  Comparewert desto kleiner die Frequenz weil der Timer ja länger zählen muss.
Meine minimale Frequenz beträgt ca 7 Hz, und die maximale 23809 Hz.
Programm hier laden  
Programm hier anzeigen
Wobbelfunktion
Was ist eine Wobbelfunktion ?
Stellen wir uns vor wir erhöhen die Frequenz ständig um sie dann wenn sie einen gewissen Wert erreicht hat wieder zu reduzieren.
Wenn wir das ziemlich schnell also nicht von Hand sondern durch unseren Mikroprozessor erledigen lassen, wird so ein gewisser
Frequenzbereich durchlaufen was man dann als Wobbeln bezeichnet.
Im hier vorliegenden Fall bewegt sich die Wobbel Frequenz zwischen 17,79 KHz und 23,73 KHz.
Um diese Funktion noch als Erweiterung in die vorhandene Schaltung zu implementieren, muss das Programm noch um einige
Programmzeilen modifiziert werden.

Die zusätzlichen Zeilen sind in der Tabelle unten Blau dargestellt .
Aufgerufen wird diese Funktion indem beim Einschalten des Schalters S1 einer der Tasten S2 oder S3 festgehalten wird.

Zum Programm
Version 4A
Programmzeile
Beschreibung
$regfile "m8def.dat"   
Definiert den Atmega als Atmega 8
$crystal = 1000000   
Gibt die Quarzfrequenz  in Herz an
$hwstack = 32 
Default use 32 Hardware reservierte Speicher
$swstack = 10  
Default Software Resvierung Speicher
DDRC = &B00111100
PortC.2, C.3,C.4,C.5 als Ausgänge setzen
DDRB = &B00000010   Portb.1 als Ausgang setzen
Portd=&B00001100
PullUp an Portd.2,Portd.3 setzen 
Tccr1a = &B01000000 Konfiguration des Timer 1
Tccr1b = &B00001001        
Konfiguration des Timer 1 Takt wirtd durch 1048 geteilt.
if Pind.2=0 or Pind.3=0 then goto Wobbeln
Tastenabfrage beim Einschalten
Ram=Eprom
Wert aus Eprom ins Ram kopieren
waitms 50
Pause damit kopiert werden kann
Compare1a = Ram Wert aus Ram als Vorgabewert für Vergleicher setzen
waitms 50
Pause zum Kopieren
Do
Hauptprogramm Schleifenanfang
waitms 100
Pause
Portc.5=0
Leds aus
Portc.4=0
Led aus
if pind.2=0 then compare1A=compare1A +1
Taster S3 gedrückt dann Vorgabewert erhöhen
if Pind.2=0 then Gosub Runterlauf
Taster S3immer noch gedrückt dann in Unterroutine "Runterlauf" springen
if Pind.3=0 then Compare1A=Compare1A -1
Taster S2 gedrückt dann Vorgabewert um 1 verringern
If Pind.3=0 then Gosub Hochlauf
Taster S2 immer noch gedrückt dann in Routine "Hochlauf" springen
if compare1A >65534 then Compare1A=65534
Verhindert einen Überlauf
if Compare1A > 65534 then Gosub Unterlauf
Springt in Unterroutine um einen fast Überlauf anzuzeigen
if Compare1A<2 Then Compare1A=2
Verhindert einen Unterlauf
if Compare1A=21 Then Gosub Ultraschall
Springt in Unterroutine um 23 Khz anzuzeigen
Loop
Rücksprung nach Loop
Unterroutine Hochlauf
Hochlauf:
Routinen Sprungandresse
Ram=Ram -1
Ram Variable um 1 verringern
Eprom=Ram
Ram ins Eprom kopieren
Waitms 100
Zeit zum kopieren lassen
Portc.3=0
Led 3 aus
Return
Rücksprung
Unterroutine Runterlauf
Runterlauf:
Routinen Sprungandresse
Ram=Ram+1
Ram um 1 erhöhen
Eprom=Ram
Ram ins Eprom kopieren
Waitms 100
Zeit zum kopieren lassen
Portc.2=1
Led4 an
Waitms 100
Pause
Portc.2=0
Led4 aus
Return
Rücksprung
Unterroutine Ueberlauf
Ueberlauf:
Routinen Sprungandresse
Portc.5=1
Led1 an
Return
Rücksprung
Unterroutine Unterlauf
Unterlauf:
Sprungadresse
Portc.4=1
Led2 an
Return
Rücksprung
Unterroutine Ultraschall
Ultraschall:
Routinen Sprungandresse
Portc.2=1
Led4 an
waitms 8
Pause
Portc.2=0
Led4 aus
Portc.3=1
Led3 an
Waitms 8
Pause
Portc.3=0
Led3 aus
Portc.4=1
Led2 an
Waitms 8
Pause
Portc.4=0
Led2 aus
Portc.5=1
Led1 an
Waitms 8
Pause
Portc.5=0
Led1 aus
Waitms 2000
Pause
Return
Rücksprung
Routine Wobbeln
Wobbeln:

compare1a=20
Voreinstellung für Vergleichswert setzen
do
Anfang Schleife für das Rauf /Runter zählen
for a=1 to 8
Schleife acht mal durchlaufen
compare1a=compare1a +1
Comparewert um eins erhöhen
if compare1a=22 then toggle portc.5
Pro Schleifendurchlauf einmal den Zustand der Grünen Led wechseln
next a

waitms 5

for a=1 to 8

compare1a=compare1a - 1

next a

waitms 5

loop

return

End Programmende

Aktualisiert 26.02.2021
Copyright by Ms 2009