Forum: Mikrocontroller und Digitale Elektronik Funktionsgenerator


von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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.

: Verschoben durch Moderator
von Marian (phiarc) Benutzerseite


Lesenswert?

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 ;)

von Dominik G. (domeg)


Lesenswert?

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ß

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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?

von Ursus P. (unwichtig)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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
3
   |      5k         |  >-+-- ergibt 0-10V Ausgang
4
 Q1|--10k--+       +-|-/  |
5
   |      5k       |      |
6
 Q2|--10k--+       +--10k-+
7
   |      5k       |
8
 Q3|--10k--+       |
9
   |      5k      10k
10
 Q4|--10k--+       |
11
   |      5k       |  (bitte exakt 5k, nicht 4k7, lieber 2*10k 1% parallel)
12
 Q5|--10k--+--10k--+-- Masse
wenn man die Versorgungsspannung auf 0.1% genau hält.
Der Ausgangsfilter ist nicht so einfach, denn er müsste frequenzabhängig 
dimensioniert werden.

Daher hat der hier
http://www.ebay.de/itm/10-MHz-DDS-SGP1010s-Funktions-Signal-Generator-Frequenzzahler-Sweep-BNC-TTL-/131470959480
auch kein Aufgangsfilter und nur 8 bit (allerdings von einem Altera FPGA 
erzeugt).
Kein Wunder, daß er ihn wieder verkaufen will...

von W.S. (Gast)


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

Ne das war jetzt Quark mit Soße, das hatte ich jetzt mit dem Rechteck 
verwechselt :)

von SiO23 (Gast)


Lesenswert?

Bau es auf, und miss nach :P Kaufen kannste das andere Zeug eh noch.

von voltwide (Gast)


Lesenswert?

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.

von Ulrich H. (lurchi)


Lesenswert?

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.

von Marian (phiarc) Benutzerseite


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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?

von Ulrich H. (lurchi)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von Marian (phiarc) Benutzerseite


Lesenswert?

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.

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Peter R. (pnu)


Lesenswert?

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.

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Der AD9833 hat dreieck, sinus und rechteck

von knuds (Gast)


Lesenswert?

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

von Pandur S. (jetztnicht)


Lesenswert?

> HCT_USER_GUIDE.pdf

danke fuer die korrektur.

von Holger (Gast)


Lesenswert?

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?

von Pandur S. (jetztnicht)


Lesenswert?

Nein, das macht man genau so.

von Holger (Gast)


Lesenswert?

Ok, dann habe ich mir das wohl richtig zusammengereimt :)

von Ulrich H. (lurchi)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.