Hallo,
ich möchte mir einen Funktionsgenerator basierend auf DDS bauen und dazu
meinen Schaltungsteil für eine D/A-Wandlung (diese soll für 8 Bit
ausgelegt werden und nicht nur für 4 Bit wie im Schalplan) hierfür von
fachkundigen Leuten ,,absegnen" lassen.
Gemäß dem angehängten Schaltplan wird ein R-2R-Netzwerk benutzt, wobei
die Umschalter zum Wechsel zwischen realer und virtueller Masse dienen.
Diese Umschalter will ich über drei Analogmultiplexer vom Typ 4053
realisieren, die mit einem PIC24F08KL301 angesteuert werden sollen.
Jeder 4053 verfügt dabei über drei interne Umschalter, wodurch noch
einer übrig bliebe, um zusätzlich zu der im Schaltbild dargestellten
positiven Referenzspannung noch eine negative Referenzspannung
zuschalten zu können, damit eine gleichanteilsfreie Sinusspannung
erzeugt werden kann.
Ich will jetzt eigentlich nur wissen, ob es irgendwelche Bedenken
bezüglich dieser Schaltung gibt oder ob das alles so in Ordnung ist.
Ich bin mir auch bewusst, dass es z.B. im TiSche deutlich einfachere
Schaltungen gibt, aber ich möchte genau die oben angegebene benutzen.
Gibt es eigentlich auch Analogmultiplexer mit mehr als 3 Umschaltern?
Dann bräuchte ich nämlich nicht so viele ICs nur für das Umschalten.
Benutzt nen fertigen DAC (DACs bauen ist nicht so simpel wie du
vielleicht denkst) und beschäftige dich eher mit den Filtern und
Endstufen. Auf diese Weise wirst du ein zufriedenstellenderes Ergebnis
erhalten. Genug Arbeit bleibt trotzdem über, keine Sorge ;)
Warum willst du denn nicht das Umschalten dem Controller überlassen?
http://www.mikrocontroller.net/articles/DA-Wandler
Du kannst doch an z0..7 direkt die Pins des µCs anschließen.
Anschließend einen Operationsverstärker mit Offseteinstellung und
variabler Verstärkung und du bist fertig.
Gruß
wird schon irgendwie gehen, der Schaltplan ist prinzipiell ok.
Besonders genau wirds halt nicht werden (die 4053 sind ja z.B. keine
perfekten Schalter, deren On-Widerstände verziehen dir das
R2R-Netzwerk). Und beim Umschalten von Eingängen können hässliche
Glitches auftreten (siehe Parameter V_ct in
http://www.nxp.com/documents/data_sheet/74HC_HCT4053.pdf)
Mit irgendeinem integrierten DAC wird es nicht mithalten können, aber
wenn es um den Spaß des Selberbauens geht, dann passt es schon so.
Erstmal schließe ich mich dem Marian an.
Zusätzlich sag ich mal, daß das Verwenden von Analogschaltern an dieser
Stelle keine gute Idee ist. Besser ist es, ganz einfach entweder die
µC-Poerts so zu vewenden wie sie sind oder einfach einen Hex-Inverter in
CMOS (74HC...) zu benutzen. Wer will, kann dessen VCC ja aus einem
separaten Spannungsregler betreiben.
Nochwas: Was für ein Funktionsgenerator soll's denn werden? Schreib
jetzt nicht "na das Übliche wie Rechteck, Dreieck und Sinus". Wenn du da
nämlich keinen dedizierten DDS von Analog Devices benutzt, sondern in
AVR-Manier das Ganze per µC machst, kommt erstens nur eine herzlich
geringe Taktrate bei heraus und zweitens nur eine 8 Bit Auflösung. Das
ist selbst für NF-Zwecke am Rande der Popligkeit und du wärest mit einem
rein analogen FG besser bedient. Bei einem reinen Sinusgenerator mag man
streiten, da kann man das Ausgangssignal relativ gut per Tiefpaß
filtern, so daß tatsächlich ein passabler Sinus bis ca. 200 kHz
herauskommen kann. Trotzdem wäre man mit nem AD9833 oder so weitaus
besser bedient.
W.S.
Also bei mir steht eigentlich wie von Achim vermutet der reine Spaß am
selber bauen im Vordergrund. Das Ergebnis muss jetzt nicht wahnsinnig
toll sein, sondern es sollte einfach einigermaßen ordentliche Resultate
liefern, die für den Test von Schaltungen mit unterschiedlichen
Wechselspannungen ausreichend sind. Außerdem habe ich alle oben
erwähnten Bauteile sowieso schon hier liegen, deswegen wollte ich von
dieser Konfiguration auch nicht wesentlich abweichen.
Was meint ihr denn, welche Taktraten für ein Sinussignal möglich sind,
wenn ich den PIC mit 32MHz (=max. Betriebsfrequenz) betreibe und das
nachgeschaltete Filter einigermaßen gut dimensioniert ist?
Holger schrieb:> Hallo,>> ich möchte mir einen Funktionsgenerator basierend auf DDS bauen
Nimm ein AD9833 vom Analog Devices ;-))
Der knüppelt am Ausgang alle Frequenzen bis 12,5MHz im 0,1Hz Schritten,
ob Sinus, Dreieck oder Rechteck. Baue selber momentan sowas für mich.
Holger schrieb:> Ich will jetzt eigentlich nur wissen, ob es irgendwelche Bedenken> bezüglich dieser Schaltung gibt
Nun, 8 bit ist zwar nicht der Hit, aber schon besser als 0.25%.
So genau müssen also deine Widerstände sein, damit es wenigstens monoton
steigend bleibt und nicht plötzlich die Spannung zurückgegt obwohl man
den Wert erhöht.
Deine Schaltung ist ein multiplying DAC wie DAC0800 oder AD/TLC7524.
Wenn das nicht nötig ist, ist die Schaltung einfacher:
1
--+
2
Q0|--10k--+---------|+\ TLC271 oder so an 12V oder mehr
Holger schrieb:> Was meint ihr denn, welche Taktraten für ein Sinussignal möglich sind,> wenn ich den PIC mit 32MHz (=max. Betriebsfrequenz) betreibe und das> nachgeschaltete Filter einigermaßen gut dimensioniert ist?
Weißt du, wovon du schreibst? Ein nachgeschaltetes Tiefpaßfilter ist NUR
für Sinus gut. Dort ist es auch nützlich, weil man damit bis nahe an die
halbe Taktrate herankommt. Bei Dreieck und Rechteck kannst du kein
Filter am Ausgang gebrauchen, denn danach würdest du nix mehr vom
Dreieck oder Rechteck sehen. Also kannst du dich fragen, aus wieviel
Stützstellen pro Periode des Ausgangssignals dein Dreieck denn
mindestens bestehen soll, damit es dir schön genug vorkommt. Bedenke,
daß die Stützstellen NICHT immer auf die gleiche Stelle in der Periode
kommen. Mein Daumenwert wäre so etwa 50 Stützstellen bei Dreieck und
Rechteck.
W.S.
Also das Dreieck würde ich ja dann aus dem gefilterten Sinus erzeugen.
Ich wollte in Bezug auf den Sinus nur wissen, welche REALISTISCHEN
Frequenzen man da erreichen kann, also so, dass der Sinus auch noch
wirklich hübsch ausschaut
Die Maximalfrequenz ist eine Frage der Abtastrate und der
Stützstellenanzahl.
Die Abtastrate ergibt sich aus der Zeit, die der uP benötigt, um das
nächste 8-bit Muster auszugeben. Ich kenne den PIC nicht, aber
angenommen er könnte 1Msample/sec raustun, und der Sinus würde aus 100
Stützstellen synthetisiert, dann hättest Du 10kHz Signalfrequenz.
Sinnvoller programmiert man eine DDS, damit hast Du ein lineares
Frequenzraster und kommst mit der Signalfrequenz bis zur Nyquistgrenze.
Für den DAC tut es auch der Vorschlag von MaWin. Eventuell den 10 K
Widerstand der am dichtesten am Ausgang ist noch abgleichen um etwa den
Ausgangswiderstand der Signalquelle zu kompensieren.
So genau kenne ich die PIC32 nicht, aber je nach Programm könnte man mit
ASM ggf. eine Samplingfrequenz von vielleicht 3-8 MHz erreichen. Die
kritische Programmschleife ist ja nur sehr kurz ließe sich also schnell
programmieren und so die Frequenzgrenze bestimmen. Je nach Programm kann
das aber auch deutlich langsamer werden. Entsprechend wäre dann für das
Sinussignal bei etwa 1 - 3 MHz Schluss.
Das Filter für den Sinus wird nach der Abtastfrequenz ausgelegt. Passend
dürfte wohl ein passiver LCR Elliptischer Filter sein. Durch die relativ
niedrige Frequenz werden die Induktivitäten halt etwas größer als man es
sonst vom DDS kennt, sollte aber noch im Rahmen bleiben. Für sehr
niedrige Frequenzen (ab etwa 1 kHz) wird die Qualität dann noch einmal
etwa schlechter, weil die Stufen durchkommen. Da lohnt sich dann
eventuell ein zusätzliches Filter (aktiv mit OP).
Das Dreiecksignal sollte einen extra Filter bekommen, und ist trotzdem
nicht für so hohe Frequenzen geeignet - so etwa 50 Punkte pro Periode
sollten es schon sein. Entsprechend liegt das Limit für Dreieck etwa um
den Faktor 10-20 niedriger.
Das Rechtecksignal erzeugt man am besten aus dem Sinus per Komparator,
niedrige Frequenzen (< 10 kHz) ggf. auch noch mit Teiler dahinter.
Warum aufwendig mit Stützstellen argumentieren, wenn der
Bandbreitenbegriff reicht? Dreieck oder Rechteck, wobei letzteres auch
einfach außerhalb der DDS hergestellt werden kann, auf diversen Arten,
benötigen eben eine höhere Bandbreite als ein Sinus bei der gleichen
Periodenlänge.
Ok, danke für die Ratschläge! Dann werde ich das mal aufbauen und sehen,
ob es klappt.
Dann würde ich noch gerne wissen, was so ein selbstgebauter
Funktionsgenerator sonst unbedingt noch so für Eigenschaften haben
sollte. Mir fällt da neben den gängigen Sachen wie Offseteinstellung,
Ampitudenänderung, Wobbeln etc. jetzt spontan nur noch ein
Ausgangswiderstand von 50 Ohm ein. Sollte man in diesem Zusammenhang
noch irgendetwas anderes beachten oder zusätzlich vorsehen?
Es wäre ggf. hilfreich, wenn der µC die Amplitude etwas einstellen kann,
z.B. um den Amplitudengang des Filters zu kompensieren.
Ein 50 Ohm Ausgang ist Standard. Ein 2. zusätzlicher Ausgang (ggf. auch
isoliert) als Trigger für das Oszilloskop ist oft hilfreich. Für
Rechteck ist ggf. ein Ausgang mit Logi-Level (4,5 V und / oder 3 V)
sinnvoll.
Wobbeln könnte man machen, ist aber vor allem eine Frage der Software
(und ggf. Auslegung des Filters, weil die SW dadurch langsamer wird).
Gebrauchen tut man es aber eher seltener.
Neben Rechteck mit 1:1 Tastverhältnis wäre ggf. noch ein PWM Signal
sinnvoll. Das kann z.B. der µC auch direkt erzeugen. Die Frequenz muss
man da in der Regel nicht so fein einstellen.
Im Prinzip sollte man erst einmal einen Aufbau haben - über
Zusatzfunktionen kann man sich dann immer noch Gedanken machen, wenn man
so etwas braucht.
Holger schrieb:> was so ein selbstgebauter> Funktionsgenerator sonst unbedingt noch so für Eigenschaften haben> sollte.
Kommt drauf an, wofür man ihn einsetzt.
Ich verwende ihn oft als Taktgeber für MOSFETs in noch nicht fertigen
Schaltungen.
Dazu will man kurze Impulse haben, also Rechteckt mit sehr variablem
Tasteverhältnis (z.B. 1sec Wiederholzeit, Impuls 1, 2, 3.. usec lang).
Das Tastverhältnis sollte auch für das Dreiecksignal gelten.
Was mich dann bei meinem nervt: Der 50 Ohm Ausgang ist gut, aber wegen
Kurzschlüssen, aber er zeigt die falsche Spannung weil er von 50 Ohm
Belastung ausgeht glaubt er er wäre so belastet daß nur die Hälfte
rauskommt, also bekommt das MOSFET Gate die doppelte Spannung als
eingestellt übergebraten. Einfache Funktionsgeneratoren haben einen
Scbalter: 50 Ohm belastet oder unbelastet. Aber besser wäre messen des
realen Spitzenwertes.
Einstellen von Amplitude und Offset gerne analog, aber messen und
anzeigen auf dem Display was wirklich rauskommt, Vmin Vmax Vavg Veff.
Sonst wundert man sich, warum man ein 20V Signal einstellt und das
TrueRMS Digitalvoltmeter zeigt 7V an.
Andere Anwendungszweck Spulen und Trafos, da will man Sinus und Rechteck
mit Leistung, also ein LM675 drin haben.
Ulrich H. schrieb:> Es wäre ggf. hilfreich, wenn der µC die Amplitude etwas einstellen> kann,> z.B. um den Amplitudengang des Filters zu kompensieren.
... oder um sinc zu kompensieren.
Man könnte auch ALC einbauen mit einem Spitzenwertdetektor, dass klappt
dann auch mit Dreieck oder Rechteck.
Fuer ein 10k R2R kann ich die 74HC595 empfehlen, die werden per SPI
angesteuert. Alternativ, wenn man parallel anteuern will, ein 74HC245,
Wichtig ist HC, denn das bedeutet push=pull, im Gegensatz zu TTL(HCT),
welches nur pull ist.
Und ja, ich wuerd auch einen fertigen AD9833, AD9835 oder so empfehlen.
Einen R-2R Wandler zu bauen ist zwar recht interessant. Nur, mit 8bit
kommt da kein besonders gutes Resultat heraus, auch wenn man die
Schalterwiderstände usw. berücksichtigt.
Vielleicht eine andre Option, wenn es Dir nicht auf einen DA-Wandler
ankommt:
Warum verwendest Du nicht einen von den Fertigbausteinen mit AD9850?
So einer ist schon zu etwa 5 Euro zu haben. Auf Dreieck musst Du zwar
verzichten, Sinus und Rechteck reichen als Testsignal meiner Meinung
nach völlig.
Dreieck gibts nur, weil bei den Generatoren nach den Prinzip des XR2206
die Dreieckspannung zuerst erzeugt wurde und daher von vornherein zur
Verfügung stand. Als Testsignal hat sie wenig Vorteile gegenüber einem
Sinus.
Jetzt Nicht schrieb:> Wichtig ist HC, denn das bedeutet push=pull, im Gegensatz zu TTL(HCT),> welches nur pull ist.
Auch wenn es nicht unmittelbar zum Thema beiträgt - diese sehr gewagte
Aussage kann ich so nicht stehen lassen.
In beiden Familien gibt es push-pull-, three-state- und
open-drain-Ausgänge. Das hängt nur vom jeweiligen Baustein ab. Einer der
wesentlichsten Unterschiede ist der zulässige Bereich von Vih und Vil:
HC=CMOS-, HCT=TTL-Pegel (*)
Auch im DB des 74HC(T)245 gibt es keine Unterschiede, die darauf
hindeuten würden.
Vcc=4.5V, Ioh=6mA, Iol=-6mA, Ta=25°C
HC HCT
Voh 4.32 4.32
Vol 0.15 0.15
(*) Siehe Kapitel 7 Input- bzw. 8 Output Circuits
http://www.nxp.com/documents/user_manual/HCT_USER_GUIDE.pdf
Danke für die weiteren Tipps!
Ich habe dann nur noch eine programmiertechnische Frage, weil ich gerade
dabei bin den Sinus zu programmieren.
Ist das von der Idee her so richtig, dass man sich zuerst z.B. bei einer
gewünschten Amplitude von 1V quasi eine Viertelwelle des Sinus
herausnimmt (also von 0° bis 90°) und nur für diesen Teil der Kurve eine
Lookup-Tabelle mit Funktionswerten erstellt? Da man bei 8 Bit insgesamt
256 verschiedene Spannungen zwischen 0V und 1V erzeugen kann, würde man
sich dann wahrscheinlich erst mal einen Taschenrechner nehmen, dann in
Schritten von (pi/2)/256 erst mal alle zugehörigen Funktionswerte dieses
,,perfekten" Sinussignals berechnen und dann genau jeweils den binären
Wert auf den D/A-Wandler schalten, der den Funktionwerten des idealen
Sinus am nächsten kommt, oder? Die anderen Bereiche von 90° bis 360°
kann man sich ja dann aus dieser Viertelwelle zusammenbasteln.
Oder wählt man da einen anderen Ansatz, um den Sinus zu erzeugen?
In den DDS ICs nimmt man in der Regel die 1/4 Periode und nutzt dann die
Symmetrie aus. Die HW für die Symmetrie ist wohl billiger als etwas mehr
Speicher.
Mit einem µC als DDS wird man eher eine längere Tabelle für 1 Periode
nehmen, weil es ein bisschen schneller geht. Für einen 8 Bit DAC sollte
die Tabelle etwa 1024 oder 2048 Einträge lang sein (für 1 Periode),
sofern der Speicher ausreicht.
Für die Tabelle kann man ganz gut eine Tabellenkalkulation, und ggf.
auch Makrofunktionen des Assemblers nutzen.