Startseite
Schweden
Atmega Projekte
Elektronik Basteleien
CNC-Fräsmaschine
NIXIE Uhren
Dekatron A101
Kontakt
Funktionsgenerator

Zum Funktionsgenerator folgende Grundüberlegungen: Ein Byte  (Zahlenwert von 0-255) wird an einen Port gegeben.An diesem hängt ein R2R-Widerstandsnetzwerk der den binär am Port anliegenden Zustand in eine Spannung umsetzt, somit sind 256 Spannungswerte darstellbar.

Geplant waren folgende Funktionen Sinus, Dreieck, Sägezahn, Rechteck. In wie viele Teilschritte zerlegt man nun solche Funktionen am sinnvollsten? Bei einem Sägezahn wären 256 Teilschritte am sinnvollsten, bei einer Dreieckfunktion 512, bei einem Rechteck 2 und bei einem Sinus? Schön wäre es ja einen Sinus in 360 Schritte zu zerlegen, so hätte man je 1 Grad einen Spannungswert. Allerdings ist die Zerlegung eines Kreises in 360° eine menschengemachte Konvention. Genausogut hätte man ihn auch in 200, 256, 400 oder 512 Teile zerlegen können. Die historischen Hintergründe für 360° sind mir nicht bekannt. Wie dem auch sei, ich entschied  mich alle Funktionen einheitlich mit 256 Teilschritten aufzulösen. Damit habe ich bei einer Sägezahnfunktion einheitliche Schritte von 5V / 256Schritte = 0.02V. Bei der Sinusfunktion sieht das schon anders aus. Da habe ich in den flachen Bereichen der Kurve einige Schritte, an denen die Ausgangsspannung sich nicht ändert und in den steilen Flanken Sprünge von 3 Schritten, also 0.06V. Das allerdings bei einer Amplitude von 5V Vss. Reduziert man die Amplitude auf 1V Vss, wie man sie im Audioverstärkerbereich benötigt, so sind das allerdings nur noch Sprünge von 0.012V.

Die Auflösung in 256 Teilschritte führt zu folgender Problematik: Um einen Zahlenwert an einen Port  eines Atmegas zu geben, benötigt man 2 Systemtakte. Ist die Funktion  in 256 Teilschritte aufgelöst, benötigt man somit 512 Systemtakte für einen kompletten Durchlauf der Funktion. Atmegas werden normalerweise mit max. 16MHz getaktet. Dadurch ergibt sich eine maximal mögliche Augangsfrequenz  des Funktionsgenerators von 16.000.000 : 512 = 31250Hz. Nun möchte man aber keine fest eingestellte Frequenz haben, sondern diese einstellen können. Soll der Atmega sich nun "nebenbei" noch um irgendwelche Timings kümmern und man das programmtechnisch (weiß der Henker wie) irgendwie hinbekommt das jeder 10. Systemtakt zu einer Ausgabe führt, läge die Maximalfrequenz nur noch bei 6250Hz. Diese Frequenz lässt sich dann nur noch dadurch steigern, dass man wie bei der DDS-Synthese üblich Teilschritte der Funktion weglässt, also quasi mit einer geringeren Auflösung fährt. Um so wieder auf 31250Hz zu kommen, müsste man 4 von 5 Teilschritten der Funktion auslassen. Somit würde die Funktion nur noch aus 51 Werten bestehen. Und wenn die Frequenz noch höher werden soll???

Natürlich kann ich mittels passender Filter am Ausgang aus einem Sinus bestehend aus 20 Teilschritten noch so was "hinbiegen" was einem Sinus ähnlich sieht, aber dann kann ich auch gleich meinen alten analogen Funktionsgenerator weiternutzen...

Ich entschied mich deshalb dazu den Takt für den Prozessor von aussen mittels eines Rechteckgenerators zuzuführen und dessen Frequenz einstellbar zu gestalten. Somit hätte ich dann tatsächlich die gewünschten 31250Hz am Ausgang. Ein Test auf meinem Steckbrett verlief wie gewünscht und es stellte sich heraus, das der Atmega8 ohne mit der Wimper zu zucken Taktgeschwindigkeiten von fast 40MHz schluckt!!! Warum sollte er auch nicht, immerhin ist er ein CMOS und die können so was heutzutage. Bei diesen Frequenzen wird er nicht mal das geringste bisschen warm, lediglich die Stromaufnahme steigt deutlich an. Na und? sollte ja kein Energiespargerät werden. ;-)
Bei der Umsetzung in die Praxis habe ich mich dann jedoch mit knapp 30MHz Taktfrequenz begnügt, so dass ich am Ausgang noch gute 50000Hz zu Verfügung habe.

Herrausgekommen ist dann letztlich folgende Schaltung:

 

Den einstellbaren Rechteckgenerator für die Taktfrequenz bildet ein 4-Fach Nand 74HC00. Dessen Ausgang gebe ich entweder direkt an den Atmega8 oder teile ihn mit einem Binärzähler 74HC393 in 8 Stufen herunter und gebe einen der Ausgänge des Binärzählers auf den Atmega8.

Und so sieht das Ganze dann in Hardware aus:

Wie man sofort erkennen kann war das Platinchen mal als kleine “stand alone” Lösung gedacht, die sich mittels Jumpern einstellen lässt. Dies sieht man auch am Schaltplan ( SV3 für die Taktfrequenz, SV2 für die Signalform )

Und wie das so ist beim Basteln, man ist ja erst zufrieden, wenn alles bedienerfreundlich ist. Zunächst wurde der Jumper für die Taktfrequenz gegen einen Stufenschalter ausgetauscht, dann musste noch eine Verstärkerstufe nachgeschaltet werden, mit der ich die Ausgangsimpedanz reduzierte, die Amplidude einstellbar machte und ganz nebenbei noch ein wenig die kleinen Stüfchen im Signal verrundete und ein eigenes Netzteil durfte natürlich dann auch nicht mehr fehlen..

Und schon waren es 3 Platinen.

Zuguterletzt habe ich noch ein kleines Steuergerät gebastelt, das die Funktion des Jumpers für die Auswahl der Signalform übernimmt und gleichzeitig Frequenz und Amplitude des Signals anzeigt.

Vorderseite

Rückseite

Das ganze dann noch in ein Gehäuse gewerkelt und fertig ist der Funktionsgenerator Marke Eigenbau!

Und hier das Ergebnis auf dem Oszi. Auf die Darstellung des Rechtecksignals verzichte ich hier...

Sinus

50KHz

Dreieck

50KHz

Sägezahn

50KHz

Sinus

1 MHz !!!

!!! Hier ist die Funktion allerdings nur noch in 16 Schritte aufgelöst !!!

Nichts ist

unmöglich

50 KHz

Wenns auch keinen Sinn macht ;-)