Peter Hofbauer’s private Homepage
Selbstbauprojekte
eigene Entwicklungen
SINE SQUARE WAVE SIGNAL GENERATOR (1/2)
Ein spezieller Funktionsgenerator
In meiner kleinen Hobby-Werkstatt habe ich schon zwei Generatoren. Einen inzwischen 40 Jahre alten (Eigenbau) analogen Sinus/Rechteck-
Generator und einen gekauften Funktionsgenerator. Warum jetzt einen weiteren entwickeln und bauen?
Oft verwende ich den alten Generator, wegen der eindeutigeren Bedienung. Beim Funktionsgenerator wird Spannung, Offset und
Frequenzbereich mit Taster getippt, von unten nach oben und wieder nach unten, also immer in die Runde. Da sind mir die analogen
Einsteller mit Drehschalter und Poti lieber.
Meine Überlegungen
Der neuen Generator wird so entworfen wie ich es wirklich benötige und soll möglichst nur mit bereits vorhandenen Bauteilen auskommen.
Die Frequenz soll mit ein Poti über den kompletten Bereich nur mit einer 270°-Drehung einstellbar sein. Hilfreich bei der Suche nach einer
Resonanz-Stelle. Die Ausgangs-Spannung soll im Display von oben bis unten incl. DC-Anteil im Klartext angezeigt sein.
Der Oszillator wird mit ein AD9850-Modul aufgebaut. Das hatte ich noch in mein Hobbylager. Das liefert die genaue Frequenz und konstante
Spannung. Ich habe die Frequenzen von 1Hz bis 9999999Hz (10MHz -1Hz) verwendet. Das Modul wurde etwas verändert. Die beiden
Sinusausgänge müssen mit je 100R belastet sein. Das LC-Filter wird entfernt. Ebenso der R-Trimmer für die Einstellung des Tastverhältnis
der Rechteck-Signale entfernt. Das wird jetzt mit Poti “PWM” auf der Front gemacht.
Der AD9850 hat für beide Signalformen komplementäre Ausgänge. Die werden mit Differenzverstärker in gegen GND symmetrische Signale
geformt. Der komplette Signalweg im Generator ist DC-gekoppelt, also ohne Koppel-C
.
Dann kommt das “AMPL”-Poti für die Einstellung der Ausgangsspannung. Dahinter kommt eine Endstufe. Die hebt das Signal auf maximal
26Vpp, also +/-13V an.
Es folgt ein 4-fach Eichteiler mit einer Impedanz von 100R. Den habe ich mit normalen Widerständen aufgebaut. Die dadurch bedingte
geringe Abweichung ist tolerierbar. Diesen Teiler habe ich hinter der Endstufe gesetzt und nicht davor. Damit Rauschen aus der Endstufe
ebenfalls herunter geteilt wird.
Die Funktion und Bedienung
Die Funktionen und Eigenschaften lassen sich am besten mit der Bedienung erklären.
Die Tasten und Bedienelemente zeigen mit einer LED an ob sie aktiv sind. Mit den 5 Tasten neben dem
Display wird ausgewählt welche Werte man verändern will. Im Display erscheint davor ein Doppelpfeil “<<”.
Die Einstellung der Werte ist mit 3 Einstellern möglich:
1.) Mit einer Ziffern-Tastatur, wird aktiv durch tippen auf eine Zifferntaste. Mit “CLR” geht die letzte Ziffer
zurück. wenn mal alles zurück nimmt erscheint der vorige Wert wieder. Mit “ENT” wird übernommen und wenn
nötig auf einen zulässigen Wert begrenzt.
2.) Mit den Inkrementalgeber, wird aktiv sobald man dran dreht. Das ist eine Feinkorrektur um +/- 1.
3.) Mit Absolutwert-Poti. Damit werden Werte innerhalb der erlaubten Grenzen mit einer einzigen 270°-
Drehung verändert. Weil das sofort brutal wirkt muss vorher eine kleine Taste am Drehknopf gedrückt werden.
MAX” ist die höchste Frequenz, geht bis 9999,999kHz, (10MHz -1Hz).
“FREQ” ist die gewünschte Frequenz am Ausgang, muss innerhalb zwischen “MAX”
und “MIN” liegen
“MIN” ist die untere Frequenz, geht ab 1Hz (0.001kHz)
“SWEEP” schaltet den Wobbler ein.
“BURST” schaltet die Funktion “abgezählte Impulskette” ein.
Wobbler und Impulskette nenne ich hier Sweep und Burst weil das weniger Buchstaben hat und deshalb besser auf die Frontplatte passt.
Die Signalform Sinus und Rechteck kann in jeder Betriebsart
umgeschaltet werden.
Das Poti “OFFSET” wird mit den Kippschalter darunter aktiviert.
Der Schalter “FILTER ON” schaltet ein LC-Filter in den Signalweg.
Schalter “OUTP ON” trennt die BNC-Buchse “OUTPUT” komplett. Das
erspart das An- und Abstecken einer BNC-Leitung.
Die BNC-Buchse “TRIGGER” liefert ein 5V TTL-Signal in der Bertiebsart
“SWEEP” und “BURST”.
Die “START” und “STOP”-Tasten wirken in den Betriebsarten “SWEEP” und “BURST”.
Das Poti “AMPL” sitzt vor der Endstufe. Damit kann der Ausgangspegel stufenlos eingestellt werden.
Der Drehschalter “ATTEN VPP” ist der Eichteiler. Der liegt am Ausgang der Endstufe und schaltet das Signal zur Ausgangs-BNC-Buchse.
Briebsart Generator
Wenn weder Sweep noch Burst aktiv sind haben wir einen normalen Sinus-Rechteck-Generator. Dann sind im Display nur die 3 Frequenzen
und die Ausgangsspannung sichtbar. Bei Rechteck-Betrieb wird noch das Tastverhältnis (PWM) angezeigt. Eine Umschaltung Sinus <>
Rechteck ist in allen Betriebsarten immer möglich.
Die beiden Frequenzen “MAX” und “MIN” legen den Frequenzbereich fest. Statt Bereichsschalter. Der Bereich ist beliebig einstellbar. Dürfen
sich natürlich nicht überlappen.
Die aktuelle Frequenz “FREQ” ist nur innerhalb der beiden Grenzwerte möglich.
Die Ausgangsspannung wird nicht mit z.B “26Vpp” sondern immer die untere und obere Spannung
angezeigt z.B. “-13V ... +13V”. Das ist eindeutiger. Mit den Einsteller “OFFSET” und “AMPL” kann die
Endstufe übersteuert werden. Dann erscheinen hinter dem “V” ein Fragezeichen: “V?”. Das funktioniert
bei allen Spannungsbereichen, Spannungsform und Frequenz.
Damit die Anzeige immer ausreichend genau ist, sind in der Firmware Eichfaktoren und für den Sinus
zusätzlich eine Frequenz/Spannungstabelle enthalten. Es wird immer die richtige Leerlaufspannung
(Unten und Oben) am Ausgang angezeigt.
Beispiele:
Links: einer Steuerspannung 0 bis 3,2v, PWM = 11%. Mitte: Sinus von -9,5V bis -12,6V. Rechts: Sinus von +9,2V bis +12,2V
Hier wird die Übersteuerung der Endstufe mit “V?” angezeigt.
Das funktioniert natürlich auch bei anderen Stellungen des
Drehschalters “ATTEN Vpp”.
Hier ein Beispiel wenn der Eichteiler in Stellung “0,02” steht.
Der Eichteiler ist am Ausgang der Endstufe, bei”+18.1mV?” hat
die Endstufe am Ausgang einen Rechenwert +18,1V?, wird also
übersteuert.
Beispiele für Rechtecksignale: links = 1kHz, Mitte = 1MHz, Rechts = 10MHz
Die Frequenzen sind in der Firmware nicht
begrenzt worden. Man kann auch bis 10MHz
einstellen, bzw 9999,999kHz.
Der Rechteckteck ist dann natürlich nicht mehr
schön und kaum als solcher erkennbar. Aber für
manch eine Anwendung doch nutzbar.
Hier sind die Flanken eines 1MHz-
Rechtecksignals sichtbar.
Der Pegel der Sinussignale wird ab 1MHz kleiner. Das ist in der Spannungsanzeige eingerechnet.
Messwerte: Pegel +/-13V (0dB) bei 1MHz, +/-11,5V (-1dB) bei 6MHz, +/-10,5V (-2dB) bei 8MHz, +/- 9,1V (-3dB) bei 10MHz (9999,999kHz)
Betriebsart SWEEP
In dieser Betriebsart wird die Frequenz alle 1ms um einen Step-Wert erhöht. Beginnt bei MIN und endet bei MAX und wieder von Vorn.
Es handelt sich also um einen normalen Wobbler. Als Besonderheit gibt es einen Trigger-Ausgang und eine Start- und Stop-Taste.
Nach betätigen der Taste “SWEEP” (siehe Bild links) ist der Wert “Step” editierbar. Wie bei allen
Eingaben ist das mit allen drei Bedienelementen möglich. Von 1 Hz bis 9999,999kHz.
Der Generator ist im Stop-Modus. Es können jetzt alle Werte (Step, Max, Frequ und Min) editiert
werden. Ausgegeben wird vorm Start die eingestellte Frequenz.
Unten rechts ist Zeit für einen Zyklus “Time 0.999s” angezeigt. Diese Zeit ist aus allen Werten (Max,
Min und Step berechnet worden. Das geschieht in Echtzeit und wird permanent angezeigt.
Die Firmware lässt alle Werte zu, bei Max = 9999,999, Min = 0.001 und Step = 0,001 dauert ein
Zyklus 9999 Sekunden!
Mit Taste START läuft der Zyklus kontinuierlich ab. Jetzt ist nur noch Frequ einstellbar. Die
Frequenz am Ausgang wird alle 1 Millisekunde um den Wert Step von Min bis Max erhöht. Was
ständig abläuft bis es mit der STOP-Taste angehalten wird.
Der Trigger-Ausgang
Solange sich die Frequenz (während Sweep-Zyklus) unter Frequ befindet, ist der Pegel am
Trigger-Ausgang Low, wird beim überschreiten auf High gesetzt. Die L>H - Flanke am
Triggerausgang zeigt also auf die bei Frequ eingestellte Frequenz.
Die Frequ wird am Besten mit Absolutwert-Poti verstellt. Damit kann man mit einer einzigen
Drehung der komplette Bereich überstreichen. Was mit einem Digi-Oszilloskop gut zu sehen ist.
Hier ist der komplette Bereich von 1kHz bis 9999,999kHz mit Step = 10kHz und Frequ = 5MHz
angezeigt. Oben blau = Triggersignal, unten gelb = Sinussignal.
Ein paar Beispiele:
10kHz bis 200kHz, Step 10kHz, Ohne Filter 10kHz bis 200kHz, Step 10kHz, mit Filter 1kHz ...1MHz, Step 1kHz, Trigger 500kHz
Nach betätigen der STOP-Taste wird die
Trigger- Frequenz stabil ausgegeben.
START - STOP ist beliebig wiederholbar. Im
STOP sind alle Daten editierbar. Im START nur
Frequ.
!kHz bis 20kHz, Trigger 10kHz 1kHz bis 20kHz, Trigger 1kHz
Betriebsart BURST
In dieser Betriebsart werden abgezählte Impulse erzeugt. Besonders geeignet zum Betrieb von Schrittmotor-Steuerungen.
Nach betätigen der Taste “BURST” ist der Generator zunächst im STOP-Modus. Es wird kein Signal ausgegeben, mal abgesehen vom DC-
Offset . Das in Zeile 4 angezeigte Signal wird erst nach START ausgegeben.
Im Display erscheint eine Zeile zur Eingabe der gewünschten Impulse. Möglich 1 bis 9999999
Impulse.
Darunter wird die berechnete Zeit (“Time”) angezeigt. Dies ist die benötigte Dauer der Impulse
mit der eingegeben Frequenz im START-Zyklus.
Beispiele:
9999999 Impuls mit einer Frequenz von 1 Hz werden erst nach 2777 Stunden fertig.
100000 Impulse mit einer Frequenz von 1kHz benötigen 100 Sekunden.
Die “TIME” und “CLK” werden nach Start sichtbar
in Echtzeit herunter gezählt.
Nachdem alle Impulse raus sind, geht der
Generator auf STOP.
Im laufenden START-Zyklus kann die Frequenz
verstellt werden. Gut geeignet zur Frequenz-
Einstellung ist das Absolutwert-Poti. Ist dann ein
Drehzahlsteller. Auch dabei wird sofort die
Wirkung bei “Time und “Clk” sichtbar. Wenn vorm
Start FREQ und das Poti aktiv ist, bleibt das nach Start aktiv damit das Poti sofort als Drehzahlsteller dienen kann.
Mit STOP kann der Zyklus angehalten und auch ab der selben Stelle fortgesetzt werden. Natürlich auch ständige Wiederholungen.
Der Trigger-Ausgang
Im Start-Zyklus erscheint ein H-Pegel an der Trigger-Buchse. Wird in den Oszilloskop-Bildern blau angezeigt. Das hat eigentlich nur eine
Kontrollfunktion. Wenn diese Zeit zu lang ist, wurde eine zu hohe Frequenz gewählt. Dann werden ein paar Impuls nicht oder einer zu víel
gezählt. Zulässig sind bis 50kHz. Im Oszilloskop-Bild unten rechts war eine Frequenz von 9999,999kHz und 10000 Impulse eingestellt. Hätte
viel früher fertig sein müssen. Trotz der hohen Frequenz ist der Zyklus aber fertig geworden.
Die Firmware
Als Prozessor verwende ich den 16bit-Typ dsPIC30F6012A. Ich programmiere meine CPUs komplett in Assembler. Der komplette Code besteht
aus ca. 4200 Zeilen in 22 Dateien.
Das Display QC12864
Das Datenblatt (Version 2008) für den Controller ST7920 hat leider Fehler!
Ich will ein 128x64-LCD mit ST7920 als Display mit 6 Textzeilen im Parallel-Modus betreiben. Das geht nur im Grafik Betrieb.
Im Netz ist das Display nur mit seriellen Betrieb mit Hilfe von Libs und mit einer Arduino Hardware beschrieben. Da kann ich nichts mit
anfangen. Habe eine eigene Hardware und programmiere meine CPUs grundsätzlich komplett in Assembler.
Der 8bit Parallelbetrieb ist falsch beschrieben. Ob das auch beim Seriellen so ist weis ich nicht. Die Grafik (S.25) zeigt pro Byte 2 E-Takte, das
ist falsch, es darf nur einer sein. Die LCD-Adresse für Y (vertikal) ist mit 6 bit angegeben (S.17). Das höchste bit AC5 wird aber ingnoriert.
Man kann also eine 16-bit Pixelreihe nicht direkt adressieren. Die Pixelreihen im oberen LCD-Teil ist mit der im unteren Teil in Reihe geschaltet.
Man muss also immer 256 Pixel auf einmal übertragen. Die X-Reihe #0 wird in der X-Reihe #32 fortgesetzt.
In der Initialisierung sind für den Grafikmode nur 3 Instruktionen nötig:
0x30 + 250us warten
0x30 + 80us warten
0x36 + 80us warten
Im Datenblatt sind Wartezeiten angegeben, aber nicht ab wann das gilt. Erst nach Übertragung von den erforderlichen 2 Byte leider nicht. Nach
jeden Byte muss eine Wartezeit sein. Man darf die Zeit aber teilen. Beim Schreiben der 16bit Adressen und 16bit Daten habe ich heraus
gefunden, nach jedes Byte Parallel:
0,1us
E auf H
0,2us
E auf L
40us
Wenn ich die 2 x 40us (wegen 16bit) nur eine auf 20us verkleiner entstehen Fehler. Mein Display arbeitet mit 460kHz intern, also am unteren
Limit.
Weil ich alles in Echtzeit angezeigt haben will, dürfen keine Wartezeiten im Programm enthalten sein! Das Display bekommt immer nur ein
einziges Byte pro Durchlauf. Dazu sind drei UPs in der Hauptschleife und ein Timer verantwortlich. Der komplette Inhalt im LCD wird 17 mal
pro Sekunde geschrieben, unabhängig ob sich etwas geändert hat oder nicht. Ergebnis: jede Datenänderung wird in Echtzeit sichtbar.
Das DDS-Modul mit AD9850
Solch ein Modul habe ich bei meinen HF-Speki eingesetzt und damals (weils billig war) gleich mehrere gekauft. Eigentlich war der Besitz dieses
Moduls der Auslöser für die Entwicklung dieses Generators.
Der AD9850 wird seriell angesteuert. Das mache ich “zu Fuß” über normale CPU-Pins. Das Modul arbeitet mit 125MHz-Quarz. Die Frequenz
wird mit 5 Byte bei einer Auflösung von 0.0291Hz eingestellt. Ausschalten kann man das Signal mit 5 x 0x00, was für den Burst-Modus benötigt
wird.
Die Anzeige der Ausgangsspannung
Die Ausgangsspannung wird nicht gemessen sondern das Poti “AMPL” ist ein Doppelpoti. Die zweite Hälfte ist an 5VDC angeschlossen.
Dessen Stellung und die des Offsetpoti wird vom 12bit-ADW gelesen. Aus diesen Werten lässt sich die Ausgangsspannung mit ausreichender
Genauigkeit berechnen und anzeigen. In der Firmware werden noch Korrekturen eingerechnet. Und zwar für jede Signalform und Stellung des
“ATTEN Vpp” getrennt. Wegen des leider nicht linearen Frequenzganges (vor allem der Endstufe) ist noch eine Frequenz-Spannung-Tabelle
berücksichtigt. Die Anzeige ist bei allen Frequenzen, auch mit Offset, genau. Nur beim Rechteck stimmt das bei Frequenzen ab ca. 5MHz nicht
mehr ganz weil der Rechteck dann recht deformiert ist.
Bedienelement via 12bit-ADW lesen
Die 5 Tasten links, die Zifferntastatur, der Drehschalter und die 4 Tasten rechts werden über Widerstände kodiert, vom 12bit-ADW gelesen,
dekodiert und entprellt. Auch für die 12 Ziffern-Tasten ist die Genauigkeit des ADW ausreichend.
Das Absolutwert-Poti soll eine Bedienung wie bei einem analogen Generator ermöglichen. Also mit einer einzigen Drehung den kompletten
Bereich durchfahren. Natürlich geht das nicht ganz, eine Drehung ist in 4095 Schritte unterteilt.
Netzausfall-Erkennung
Vorm Ausschalten sollen die eingestellten Daten ins EEPROM des dsPIC30F6012A. Damit nach dem
Einschalten alle wieder vorhanden sind.
Bevor die 5V-Versorgung absinkt wird die EEPROM-Aufzeichnung aktiv, siehe blaue Nadel.
Die gelbe kurve zeigt die 5V für den Prozessor.
Der mechanische Aufbau
Platine FGG9020D
linke Tasten, Inkrgeber,
Zifferntasten
Platine FGG9020E
Endstufe
Platine FGG9020B
Rechte Tasten
Display
Platine FGG9020H
DDS-Oszillator
Platine FGG9020C
CPU mit dsPIC30F6012A
DC/DC-Wandler für 5V
Platine FGG9020N Netzteil
Platine FGG9020T
Netztrafo
Die Platinen FGG9020E und ...H
mit der Fräse gefertigt, der Restkupfer
zwischen den Leiterbahnen ist GND-
Potential
Das Grundgerüst, Seitenteile aus dem 3D-Drucker
Zentrale GND-Fläche
CPU
DDS-Oszillator
Endstufe
Netzteil
Es folgt: Schaltpläne, Downloads, Hinweise