5 Hz bis 20 MHz-Generator mit AD7008

mit Direct Digital Synthesizer Chip

zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage


Ein Frequenzgenerator für Frequenzen von 5 Hz bis 20 MHz
- theoretischer Frequenzbereich 0,0116 Hz bis 25 MHz
- praktischer Frequenzbereich 5 Hz bis 20 MHz
- Auflösung der Ausgangsspannung 10 Bit
- Genauigkeit (begrenzt durch Quarz) norm. 0,01%
max. 0,002% 

Auflösung der Frequenz 0,01164 Hz
Abstimmschrittweite: 
  • bei 1 Hz        1,1%
  • bei 1 kHz      0,001%
  • bei 1 MHz    0,000001%
Ansicht des fertig aufgebauten Generators


Vorgeschichte
Im Jahr 1997 las ich in der Zeitschrift Elektronik (vom 08.Juli 1997, Seiten 106 ff) die Beschreibung eines Funktionsgenerators, der um den DDS-Schaltkreis AD7008 aufgebaut war. Dieser Chip faszinierte mich, da er die gesamte Erzeugung einer Frequenz sowie ihre Modulation in Frequenz, Phase und Amplitude digital realisiert, und das Ergebnis erst nach dem Prozessing in ein analoges Signal wandelt. Mit diesem Chip wollte ich unbedingt etwas aufbauen. Als ich aber über Monate keine Bezugsquelle fand, die einen einzelnen Chip an eine Privatperson veräu0ßert hätte, gab ich schließlich auf.
Im Jahr 2001 schließlich, nahm über meine Homepage jemand Kontakt zu mir auf, der zufällig früher schon mit dem AD7008 gebaut hatte. Da das für ihn inzwischen 'ein alter Hut' war, überließ er mir einen AD7008JP50. So kam ich dann doch noch zu meinem Spielzeug.

Schaltung
Der AD7008 wird über ein paralleles oder ein serielles Interface mit Kommandos und Daten gefüttert, mit denen man die zu erzeugende Frequenz sowie momentane Phasenverschiebung und die Signalamplitude (separat für I und Q Kanal) einstellen kann. Damit lässt sich eine theoretisch eine Frequenz zwischen 0 und 25 MHz mit Frequenz-, Amplituden- , I/Q- und Phasenmodulation erzeugen.

Für eine Modulation müssen allerdings die Werte für Phasenverschiebung und Amplitude ständig geändert werden (entsprechend dem Verlauf des Modulationssignals). Damit setzt die Geschwindigkeit des Interfaces zwischen steuernder Einheit (z.B. PC oder PIC) und AD7008 der erreichbaren Modulationsfrequenz eine Grenze. Das schnelle (bis zu 32-Bit breite) Parallelinterface kam für mich nicht in Frage, da ich einen PIC zur Ansteuerung benutzen wollte, und es dem an ausreichenden I/O-Pins mangelt. Das serielle Interface ist leider deutlich langsamer. Deshalb kann ich meine Lösung auch nicht als Funktionsgenerator bezeichnen. Es ist ein Sinusgenerator mit programmierbarer Frequenz und Amplitude.

Trotzdem ist eine Modulation bis zu etwa 14 kHz-Samplefrequenz theoretisch möglich . Überlegenswert wäre für die Zukunft der Anschluss des seriellen AD7008-Interfaces an MSSP des 16F876 oder den synchronen USART des 16F628. Letzterer erfordert zwar zusätzliche Inverter in den seriellen Leitungen, aber beide seriellen PIC-Interfaces schiebt mit bis zu 5000 kBaud die 32-Datenbits in weniger als 10 µs in den AD7008. Das ergäbe eine Modulation mit einer Samplerate von 100 kHz. Das reicht um z.B. die 10,7 MHz-ZF eines FM-Radios mit kompletter Stereo-Modulation zu erzeugen

Nachbau?
Der Chiphersteller Analog Devices gibt den Preis des AD7008 mit ca. 23 $ an. Das sind garantiert nicht die Endabnehmerpreise. Als ich 1997 das erste Mal mit dem Chip in Kontakt kam, war 90 DM (also 45 €) im Gespräch. Außerdem kenne ich immer noch keinen Lieferanten.
Wer auf die Möglichkeit der Amplitudenregelung/Amplitudenmodulation und der I/Q-Modulation verzichten kann  ist wahrscheinlich mit dem AD9835 für 7 $ besser bedient. Dieser Chip basiert auf dem gleichen Prinzip wie der AD7008, hat aber kein paralleles Interface (was sich mit einem PIC sowieso nicht nutzen lässt) sowie keine I/Q-Multiplikatoren zur Amplitudenregelung in Sin und Cos. Die Frequenzerzeugung (und sogar die Phasenmodulation) entsprechen aber dem AD7008.



Theorie der digitalen Frequenzsynthese
Herzstück des AD7008 sind 2 digitale Sägezahngeneratoren , von denen ich aber nur einen benutze.
Ein Sägezahngenerator besteht aus einem 32-Bit-Register, dessen Wert 50 Millionen mal pro Sekunde um einen programmierbaren Wert FREQ0 erhöht wird. Damit wächst die Zahl im 32-Bit-Akkumulator um so schneller an, um so größer diese programmierte Zahl FREQ0 ist. Irgendwann läuft das 32-Bit Register über, und alles beginnt von vorn.

Ist FREQ0 auf den Wert 1 eingestellt, sind für einen Zyklus 232 = 4.294.967.296 (also rund 4,3 Milliarden) Additionen nötig. Bei einem Takt von 50 MHz dauert das 85,9 Sekunden. Die erzeugte Frequenz ist 0,01164 Hz.
Die höchste nutzbare Frequenz ist die Hälfte des 50 MHz Taktes (also 25 MHz) und ergibt sich bei einem FREQ0-Wert von 2.147.483.648.
Zwischen diesen beiden Extremen lassen sich über 2 Milliarden fein abgestufte Frequenzen einstellen. Der Abstand zwischen zwei Nachbarfrequenzen beträgt bei 1 kHz etwa 0,01 Hz - also 0,001% . Die Abstufung wird mit steigender Frequenz immer feiner.

Die oberen 12 Bit des 32-Bit Sägezahns werden einer sin/cos look-up-Table zugeführt. Die aus der Tabelle kommenden 10-Bit sin- und cos-Werte werden durch Multiplikatoren geleitet, durch die ihre Amplitude eingestellt wird. Die in der Amplitude modifizierten sin- und cos-Werte werden addiert, und die Summe von einem 10 Bit DAC in eine analoge Spannung gewandelt.



Beschreibung der gewählten Lösung
 
Stromlaufplan - anklicken zum vergrößern Der AD7008 wurde zusammen mit dem nötigen 50 MHz Quarzgenerator und den Ausgangswiderständen auf eine kleine Platine gesetzt. Diese Platine hat den bei mir üblichen 10poligen Steckverbinder, mit dem sie an PIC-Testplatinen angeschlossen werden kann. Der PIC kann den AD7008 über das serielle Interface programmieren. 
Um den AD7008 mit nur einem einzigen PIC-Port ansteuern zu können, waren Kompromisse nötig. Mit der vorliegenden Platine kann nur noch einer der beiden im Chip enthaltenen Generatoren programmiert werden, außerdem ist eine Programmierung der Phasenverschiebung nicht möglich. Der AD7008 läuft hier also als einfacher einstellbarer Frequenzgenerator mit programmierbarer Amplitude. Prinzipiell ist noch eine Amplituden- oder Quadraturmodulation möglich, durch das langsame Serialinterface scheint das aber nicht sinnvoll nutzbar zu sein. 
Auf das eigentlich nötige Ausgangsfilter hinter dem AD7008 wurde in diesem Testaufbau noch verzichtet, um über den gesamten einstellbaren Frequenzbereich experimentieren zu können.
Um den AD7008 anzusteuern, wird ein 2-zeiliges-LCD-Display und eine kleine Tastatur verwendet. Beides wird an Port B eines 16F628 angeschlossen. Am Port A hängt die AD7008-Platine. Die Schaltung zum Anschluss von Display und Tastatur ist mit dem Lehrbeispiel 'Tastatur&LCD-Display' identisch, es werden aber nur 5 Tasten benötigt.

Hinweis:
Fehler  im nebenstehenden Schaltplan: R4 muss nicht am Pin 13 sondern am Pin 10 angeschlossen werden.
Tastatur und Display für AD7008 - anklicken zum Vergrößern
Ansicht des aufgebauten Geräts - anklicken für Infos zum Aufbau Der PIC16F628 sowie die Stromversorgung befinden sich auf  einer Platine (Bus628), an die die Generatorplatine sowie LCD/Tastatur angesteckt wurden.

Eingebaut wurde alles in ein Plastik-Gehäuse. (Im Foto noch ohne Filter und Verstärker.)
 

Filter & Verstärker:

Das Ausgangssignal des AD7008 ist kein perfekter Sinus. Vielmehr folgt es der idealen Sinusspannung in Schritten von 20 Nanosekunden (1/50MHz). Somit ist das  Signal immer mit 50 MHz "verunreinigt". Solange man mit kleinen Frequenzen (<1 MHz) arbeitet, ist das kaum von Bedeutung, aber bei hohen Frequenzen wird der Sinus durch diese 20-ns-Treppenstufen arg verunstaltet.

Abhilfe schafft ein Rekonstruktionsfilter, das mit einer Tiefpasscharakteristik hohe Frequenzen abschneidet. Die nebenstehende Schaltung zeigt ein solches Filter mit einem nachgeschalteten Verstärker. Beides beruht auf einer Veröffentlichung von Hubert Reelsen aus dem Jahre 1997.

JP2 ist der Eingang des Filters. Hier wird der Ausgangspin des AD7008 direkt angeschlossen. Am Ausgang JP1 steht dann das Signal ungefiltert und unverstärkt zur Verfügung.
JP3 ist der Ausgang für das gefilterte und verstärkte Signal.
JP4 ist der Eingang für eine Verstärker-Betriebsspannung von 10 VDC.

Die Ausgangsamplitude ist (bei voll aufgedrehtem Potentiometer) im Bereich von 5 Hz bis 20 MHz etwa 4V p-p. Oberhalb von 20MHz fällt die Amplitude steil ab. Ab 22 MHz ist das Signal nicht mehr nutzbar. Auch unterhalb von 5 Hz wird das Signal kleiner. Die Spannungsanzeige am Display stimmt natürlich nicht für den Ausgang JP3.
Stromlaufplan des Verstärkers


 



Frequenzgenauigkeit
Die Genauigkeit der erzeugten Frequenz wird durch den 50-MHz-Quarzoszillator bestimmt. Unabhängig vom eingestellten und angezeigten Wert bestimmt seine Genauigkeit die Genauigkeit des Ausgangssignals. Typische maximale Frequenzfehler von Quarzoszillatoren sind etwa 0,01% (100 ppm), und sie lassen sich nicht korrigieren. Bei einer Ausgangsfrequenz von 20 MHz beträgt der Frequenzfehler also bis zu 2000 Hz. Ich glaube, dass dieser Fehler noch akzeptabel ist. Der Fehler ist proportional zur Ausgangsfrequenz, bis 100 kHz ist der Frequenzfehler also kleiner als 10 Hz.

Im Gegensatz zu einem Einzelquarz erwärmt sich der Quarzoszillator im Betrieb ein wenig, weshalb seine Frequenz nach dem Einschalten etwas driftet, bevor sie sich nach ca. 1 Stunde stabilisiert hat. Bei eingestellten 10 MHz erzeugt mein Generator nach dem Einschalten etwa 10,000,030 Hz und liegt dann nach 1 Stunde bei stabilen 9,999,950 Hz. (Mein OCXO diente als Referenzquelle.) Das ist ein Fehler von <±5ppm. Da ist wohl etwas Glück mit im Spiel, denn auch ein 10 mal so großer Fehler wäre noch in der spezifikation des Quiarzgenerators gewesen
.

Eine höhere Genauigkeit lässt sich erreichen, wenn man anstelle des Quarzoszillators einen diskret aufgebauten 50-MHz-Oszillator mit Quarz und Trimmkondensator aufbaut, (diesen vielleicht sogar in ein Thermostat-Gehäuse einsetzt) und kalibriert. Im Hobbybereich ist das aber nicht wirklich nötig. 

Professionelle Generatoren haben einen Eingang für ein 10-MHz-Referenzsignal, auf das sie sich mit einer PLL einrasten.

Der Nutzer wird bei der Bedienung vielleicht dadurch irritiert, dass z.B. eine Erhöhung der Frequenz um 10 kHz, vom Generator nicht genau befolgt wird. Die Frequenz wird vielmehr um etwas weniger als 10kHz erhöht. Ähnlich verhält es sich mit allen Einstellschrittweiten von 0,01Hz bis 10 MHz. Das resultiert daraus, dass der AD7008 die Frequenzen nicht in 0,01Hz-Schritten verändern kann, sondern in 0,01164 Hz-Schritten. Ein Sprung um exakt 10 kHz ist deshalb nicht möglich. Das Display zeigt keine Wunschfrequenzen an, sondern die Frequenz, die auch wirklich erzeugt wird. Auf jeden Fall, kann man sich der gewünschten Frequenz aber immer bis auf einen prinzipiellen Fehler von 0,00582 Hz annähern. (mal abgesehen vom zusätzlichen Frequenzfehler, der durch den Quarzoszillator bedingt wird)



Mögliche Verbesserungen
Zusammen mit einem LCD-Display und einigen Tasten, einer 628-Bus-Platine mit PIC16F628 und einem Gehäuse ergibt sich ein schöner Frequenzgenerator für Bastelzwecke.
Anstelle des 50-MHz-Quarzoszillators lässt sich ein Oszillator mit einem Einzelquarz aufbauen, dessen Frequenz dann mit einem Ziehkondensator auf  wenige ppm genau abgeglichen wird.

Entwicklungsstand
Die Hardware ist aufgebaut und funktioniert. Nebenstehendes Foto der Generatorplatine zeigt eine Urversion mit abweichender Steckerbelegung. Das Grundgerüst für das komplette Gerät ist ein Bus628

Generator, Filter und Verstärker funktionieren.

Eine Steuerung über RS-232 ist vorbereitet, aber die Nutzung in der Software noch nicht vorgesehen..

Foto des Frequenzgenerators - Bestückungsseite
Nachdem die Schaltung zuerst für die Ansteuerung mit 7 PIC-I/O-Pins ausgelegt war, benötige ich z.Z. nur noch 5 I/O-Pins. Deshalb könnte die Platine nun auch am PortA eines 16F84 betrieben werden. 
Die Software wird aber weiter für den 16F628 ausgelegt, und wird auf 16F84-Grenzen keine Rücksicht nehmen. Insbesondere die teilweise nötige 64-Bit Routinen benötigen recht viele Register, mit denen der 16F84 nicht gerade üppig bestückt ist.
Rückseite des Frequenzgenerators (Urversion)
Frequenzeinstellung Die Software (auf 16F628) ermöglicht die Frequenzeinstellung von 0 Hz bis 25 MHz auf 0,02 Hz genau! (10 stellig) 
Die Frequenzanzeige erfolgt auf einem LCD-Display. Die Bedienung  über 5 Tasten ist intuitiv. 
Amplitudeneinstellung Die Ausgangsamplitude ist in 64 Schritten zwischen 0V und 1,1 V p-p einstellbar. Unterhalb von 2 Hz und über 7 MHz bricht sie etwas zusammen. Die Spannungsangabe bezieht sich auf das Signal vor dem Filter (an JP2). Hinter dem Verstärker beträgt die Spannung bei voll aufgedrehtem Potentiometer etwa 4V p-p.
Speicherung Drei Frequenz-Amplituden-Einstellungen können abgespeichert und jederzeit wieder abgerufen werden. Beim Einschalten wird automatisch die zuletzt gespeicherte Frequenz und Amplitude eingestellt.



Programmlisting



zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 24.09.2002
letzte Änderung: 02.07.2009