Hi,
ich möchte einen Waveformgenerator mit frei wählbarem Signalverlauf
realisieren. Gewünschte Signalfrequenz 3kHz, 10kHz wenn machbar. Frei
wählbarer Signalverlauf bedeutet, dass beispielsweise ein Sinus mit
einem überlagerten Rechteck. Anwendungsgebiet ist Audio, ich will das
Signal auf einen Lautsprecher geben.
Das einzige auf was ich bis jetzt gekommen bin wäre Marke Eigenbau mit
einem FPGA und einem EEPROM/FLASH, um die Signalverläufe zu speichern,
und hinten dran ein entsprechender DAC. Reichen 10-12 Bit für den DAC
bei einer Audioapplikation? Wie kann ich beurteilen, wieviel Logikgatter
etc. der FPGA ungefähr braucht?
Oder gibt es evtl. ein IC, welches das "all-inclusive" hat? Also ein
DDS-IC mit integriertem oder extern anschließbarem EEPROM/FLASH? Ich
konnte bisher leider nix finden im Web, Analog, TI, etc. alles schon
abgegrast :(
Ralf
Und wenns unbedingt Eigenbau sein muss sollte man trotzdem nicht gleich
übertreiben. Ein FPGA ist da doch gewaltig überdimensioniert.
Ein AT32UC3Axxxx zum Beispiel tut das bestimmt auch, der hat den DAC
schon eingebaut und kleine Boards mit dem Chip gibts für unter 40€.
Sind die 10 kHz die Bandbreite, oder soll es z.B. ein
10-kHz-Rechteckssignal sein? Ersteres koennte man ohne weiteres mit
einer Soundkarte erreichen; letzteres braaucht aber mindestens ~100-200
kHz Bandbreite (sonst siehst Du vom Rechteck nur die sinusfoermige
Grundwelle).
Was Du suchst, heisst AWG = arbitrary waveform generator. Sowas gibt's
zu kaufen, oder man kann es sich wie Du schon erwaehnst als DDS mit
ladbarem Speicher fuer die Wellenform selber bauen. Mit 100-200 kHz
Samplingrate koennte man sowas noch durchaus in einem Mikrocontroller
implementieren. Ein Hobby-AWG waere z.B. das Velleman PCGU1000, das
kriegt man neu fuer ca. 150 Euro. Kann bis 2 MHz. Der DAC ist bloss 8
bit, aber ich habe selber so eines und die Signale schauen erstaunlich
sauber aus. Oder Velleman GCSGU250 um ca. denselben Preis, das geht nur
bis MHz aber dafuer bekommt man ein einfaches Oszilloskop gleich mit
dazu.
Wolfgang
Hallo zusammen,
vielen Dank für eure Antworten.
@Henrik:
Das soll auf eine Leiterplatte, eine Soundkarte kann ich da nicht
draufpappen :)
@ich:
Okay, ich kenne noch nicht alle Möglichkeiten, ein FPGA erschien mir als
am besten geeignete Lösung. Deswegen hab ich auch gefragt, welche
Eigenschaften der bieten sollte.
Ich hab mal die AT32UC3-Serie überflogen, ich ich weiss aber nicht ob
die ausreicht (s.u.).
@Wolfgang:
Die 3kHz bzw. 10kHz wären die Frequenz des Signalverlaufs. Aber halt
nicht nur Rechteck sondern wie ich oben schrieb beispielsweise Sinus mit
Rechteck überlagert o.ä. Also muss wie du sagst die Bandbreite
wesentlich höher sein.
Da es wie (leider zu spät) erwähnt eine Platinenlösung sein soll,
scheidet eine Lösung auf Geräteebene wie von dir vorgeschlagen leider
aus, aber mit "arbitrary waveform generator" habe ich ein weiteres
Suchstichwort :)
Ich versuch jetzt nochmal alles zusammenzufassen:
- 3kHz Signalfrequenz
- Audioapplikation
- kompakte Platinenlösung
- Amplitude n.M.einstellbar
Ich hatte vor einiger Zeit mal eine Berechnung durchgeführt, bei der ich
von 12-Bit für den DAC (oversized für Audio?) ausgegangen bin, bei einer
Frequenz von 3kHz. Als worst-case-Signal habe ich Dreieck angenommen,
weil dort durch die Rampe die meisten Werte ausgegeben werden.
12-Bit = 4096 Steps * doppelte Signalfrequenz (Ramp-Up & Ramp-Down). Da
komme ich auf 24.5MHz um den DAC zu füttern, und das wäre ein paralleles
Interface, als serielles Interface wären es ja nochmal mehr. Ist etwas
an der Berechnung falsch und ich sehe den Wald vor lauter Bäumen nicht?
Deswegen bin ich auch nicht sicher dass ein AT32UC3 oder eine
vergleichbare MCU genug Performance hat, die FPGA-Lösung erschien mir da
performanter.
Wenn acht oder zehn Bit Auflösung ausreichend sind für Audio dann nehm
ich das, ich kann's nur vorab schlecht abschätzen und möchte vermeiden,
dass ich dann beim ersten Versuch feststelle, dass ich mit den
Anforderungen hoch muss, runter ist immer einfacher :)
Es sollte halt so sein, dass man bei (extrem) niedriger Frequenz die
Sprünge im Signalverlauf nicht unbedingt hört.
Wo noch Abstriche möglich wären, wäre halt dass die Ausgabe nur Sinus,
Rechteck, Dreieck und evtl.Sägezahn ist, ohne die Möglichkeit den
Signalverlauf bestimmen zu können.
Ralf
Ralf schrieb:> 12-Bit = 4096 Steps * doppelte Signalfrequenz (Ramp-Up & Ramp-Down). Da>> komme ich auf 24.5MHz um den DAC zu füttern, und das wäre ein paralleles>> Interface, als serielles Interface wären es ja nochmal mehr.
Lese dich mal in das Funktionsprinzip eines DDS Syntehsizers ein.
Das widerlegt deine These ( siehe oben ) vollständig.
Der DA-Wandler muss mindestens mit der 2fache , besser die 3, oder 4
fache Frequenz, der höchsten vorkommenden Signalfrequenz, abtasten.
Da ist ein DA Wandler in deinen Falle mit einer Samplingfrequnez von
200KHz mehr als ausreichend. Damit ginge auch ein 8 KHz Rechteck noch.
( Eine Soundkarte macht 44,2KHz-192KHz je nach Qualität ).
Die Wortbreite des DA Wandlers spiegelt sich im Klirrfaktor, und
Störabstand des Signales wieder. 8Bit Wortbreite wäre bei einen Sinus
etwa 0,5% Klirrfaktor, 12 Bit etwa 0,02% Klirrfaktor.
Es gibt aber keine fertigen DDS Chips welche einen externen Zugriff auf
den
Waveformspeicher erlaubt. Da bleibt dann nur der Selbstbau. Entweder mit
einen Mikroprozessor, oder wie ich es mal gemacht habe und in älteren
Rohde&Schwarz HF Generatoren realisiert wurde mit einen TTL Grab
bestehend aus Volladdierern 74LS283 und Zwischenspeicher 74LS273 und
einen Eprom.
In deinen Falle wäre es ein statischer Ram.
Ralph Berres
Hallo Ralph,
> Lese dich mal in das Funktionsprinzip eines DDS Syntehsizers ein.> Das widerlegt deine These ( siehe oben ) vollständig.
Ich habe mir gerade den Wiki-Eintrag zu DDS durchgelesen:
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis
Wenn ich das richtig verstanden habe, bewirkt eine höhere Frequenz im
Prinzip, dass die Adressen der Wertetabelle nicht mehr direkt
nacheinander, sondern mit Sprüngen in der Adresse durchlaufen wird,
richtig?
Dann wäre mein Problem ja wesentlich entschärft :)
Wie funktioniert das dann genau? Die Tabelle wird mit einer
"Grundfrequenz" abgearbeitet. Das entspräche gleichzeitig der
langsamsten Signalfrequenz, wenn der eingestellte Frequenzwert 0 ist.
Der Frequenzwert wird bei jedem Takt auf die Adresse hinzuaddiert, somit
ergeben sich die Sprünge und damit eine höhere Frequenz des
Ausgangssignals?
Das könnte ich denke ich mal mit einem µC und einem DAC probeweise
aufbauen.
Werd gleich mal an einen Schaltplan gehen und schauen, wie gut das
funktioniert :)
Danke!
Ralf
Ralf schrieb:> Wenn ich das richtig verstanden habe, bewirkt eine höhere Frequenz im>> Prinzip, dass die Adressen der Wertetabelle nicht mehr direkt>> nacheinander, sondern mit Sprüngen in der Adresse durchlaufen wird,>> richtig?
Richtig Es entsteht stattdessen eine leichte Phasenmodulation.
Stelle dir einen Addierer vor der zwei Zahlen addiert. Der Ausgang des
Addierers geht auf die Eingänge eines Zwischenspeichers. Die Ausgänge
des Zwischenspeichers gehen auf den Eingang 2 des Addiereras. Der
Übernahmeeingang ( Strobe ) ist der Takt des Muttergenerators.
Die letzten 12 Ausgänge des Zwischenspeichers geht auf die
Adresseingänge des Epromes. In dem Eprom ist ein kompletter Wellenzug
des zu generierenden Signales abgelegt. Die Datenausgänge des Epromes
gehen auf einen DA Wandler.
Der Sample& Hold des DA Wandlers wird ebenfalls von dem Muttertakt
betätigt.
Gibt man jetzt auf den Eingang 1 des Addierers jetzt die Zahl 1 darauf,
addiert der Addierer mit jedem Takt des Muttergenerators eine 1 hinzu.
Gibt man jetzt auf den Eingang 1 des Addierers jetzt die Zahl 100
darauf, erhöht sich mit jedem Takt des Muttergeneratos der Ausgang des
Addierers um die Zahl 100. Am Eingang 1 des Addierers liegt also die
einzugebende Frequenz.
Es braucht natürlich die Anzahl der Zählschritte bis der Addierer an den
Adressen des Eproms angekommen ist. Bei niedrigen Frequenzen wird also
mehr oder weniger zufällig die volle möglichen Anzahl der
Speichersplätze im Eprom nacheinander angewählt ( obwohl auch dann noch
die eine oder andere Adresse übersprungen wird ). Erst bei Eingabe einer
hohen Frequenz werden die Adressabstände im Eprom größer. Es werden aber
mit jedem Durchlauf andere Adressen getroffen. So das sich wieder eine
vollständige Kurve reproduzieren läßt.
Ralph Berres
Hallo Ralph,
vielen Dank für die Erklärung. Ich denke, ich kann das auf meinem
Controller mal umsetzen und bewerten.
Das einzige was da momentan noch fraglich ist, ist der Wunsch nach
einstellbarer Amplitude. Ich könnte zwar intern einfach den DAC-Wert vor
der Ausgabe teilen, aber ich glaube eine Lösung mittels OpAmp wäre
geschickter, oder? Mein Controller hat zwei DAC-Ausgänge, wenn ich also
mit dem zweiten DAC die Amplitude steuern kann, wäre das gut.
Dafür bräuchte ich dann einen OTA (Operational Transconductance
Amplifier), wenn ich das Prinzip richtig verstanden habe, oder?
Ralf
Es gibt multiplizierende DA Wandler bzw. auch 4 Quadraten DA Wandler
genannt. Da kannst du die Ausgangsamplitude über den
Referenzspannungseingang einstellen. Diese Referenzspannung könnte dann
von einen zweiten DA Wandler für die Pegeleinstellung stammen.
Was du auf jeden Fall brauchst ist ein Tiefpass höherer Ordnung hinter
dem Signalform DA Wandler. Der Tiefpass sollte die Taktfrequenz bei
einen 12 Bit Wandler um 72 db unterdrücken. Sonst hast du ein
treppenförmigen Verlauf der Ausgangsspannung, und unter Umständen
Aliasingprodukte.
Ralph Berres
Hi Ralph,
okay, das ist auch ne Möglichkeit, mit externem DAC. Hm... Dann werd ich
mich mal auf die Suche nach einem multiplizierenden DAC begeben, danke.
Und den Tiefpass muss ich halt gucken, wie ich den berechne.
Ralf
oder "Filterlab" von Microchip - ebenfalls zur Berechnung von aktiven
Filtern. Mit Deinen Anforderungen brauchst zu wohl ein Chebycheff-Filter
mindestens 9. Ordnung. Unbedingt beruecksichtigen - die Op-Amps muessen
ein VIEL hoereres Gain-Bandwidth-Produkt haben als Deine 10-200 kHz
Bandbreite, damit so ein aktiver Filter auch wirklich gut funktioniert.
So um die 10 MHz sollten es schon sein. Am besten natuerlich mit Spice
simulieren.
12 bit Aufloesung ist fuer Audio keinesfalls uebertrieben (Soundkarten
haben typischerweise 16 bit, obwohl der analoge Teil meist kaum soviel
ausnutzt).
Wolfgang
Du solltest aber schauen das die differenzielle und integrale
Nichtlinearität unter 0,5 LSB bleibt, sonst steigt der Klirrfaktor.
Das Filterprogramm ist das was ich meine.
Schaue mal unter DAC1220 Der könnte eventuell auch ein kanidat sein. Hat
aber parallele Eingänge.
Ralph Berres
Hi Ralph,
> Du solltest aber schauen das die differenzielle und integrale> Nichtlinearität unter 0,5 LSB bleibt, sonst steigt der Klirrfaktor.
Oh, ich sehe schon, da gibt es wohl viel zu beachten, wenn man sich das
erste Mal mit so etwas beschäftigt :(
Wenn ich das DB des von mir vorgeschlagenen DACs richtig interpretiere,
wäre er also doch nicht so geeignet, bzw. nur max.die 10-Bit Variante,
wenn ich von den typischen Werten ausgehe und die maximalen ignoriere.
> Schaue mal unter DAC1220 Der könnte eventuell auch ein kanidat sein. Hat> aber parallele Eingänge.
Der DAC1120 scheint preislich eher höher angesiedelt zu sein. Ausserdem
hat er wohl eine hohe Einschwingzeit, ist aber mit seriellem Interface.
Meintest du wirklich den DAC1120?
Ralf
Hi Ralph,
sorry für die späte Rückmeldung. Der DAC1222 ist bei Digikey/Mouser wohl
nicht mehr erhältlich. Der MAX543 ist preislich relativ happig, wobei
das für die Auflösung und den INL/DNL-Werten wohl normal zu sein scheint
:)
Ich schau mal noch weiter, ob ich was passenderes finde, evtl. sogar für
3V.
Gibt es einen speziellen Zusammenhang zwischen der Sprungweite der
Adressen, wenn man DDS verwendet? Oder ergibt sich das automatisch?
Ich bin mir noch nicht ganz sicher ob ich das bis ins letzte Detail
verstanden habe.
Mal angenommen, ich verwende einen 10-Bit-DAC und lege eine
Werte-Tabelle mit 1024 Werten an, und durchlaufe die Tabelle so schnell,
dass meine langsamste Wunschfrequenz erreicht wird, wie bestimme ich
dann die schnellste Frequenz? Oder andersrum gefragt, wenn ich die
schnellste Wunschfrequenz kenne, wie optimiere ich die DDS-Funktion?
Suche ich mir eine passable Anzahl an Frequenzschritten aus und rechne
das um auf die Adress-Sprünge?
Ralf
Bei www.csd-electronics.de bekommst Du einen CS4344 für gut 4EUR. Das
ist ein 24-Bit Audio DAC, den Du an einen XMEGA anschließen könntest.
Das I2S-Interface lässt sich mit einem UART im Master-SPI-Modus und
einem Timer nachbilden. Füttern kann man es über einen DMA-Channel. Die
Wellenformen kannst Du im internen Flash ablegen und in der gewünschten
Geschwindigkeit auslesen. Mischen kannst Du die Wellenformen digital im
Register für die DAC-Ausgabe.
Die Taktfrequenz muss mindestens 2mal ( wohl besser 3mal ) schneller
sein als die zu generierende Frequenz. ( Shannontheorie ).
Welche Speicherplätze in welcher Reihenfolge abgetastet werden ergibt
sich aus dem Verhältnis eingegebene Frequenz zu Taktfrequenz, und ist
somit mehr oder weniger zufällig ( obwohl eigentlich falsch
ausgedrückt).
Dies macht sich als ( in der Regel nicht störender ) leichter
Phasenjitter bemerkbar. Eventuell sieht man das mit einen
hochauflösenden
Frequenzzähler oder Spektrumanalyzer.
Bei langsamen Frequenzen werden praktisch immer alle Speicherplätze in
einer mehr oder weniger gleichmäßigen Reihenfolge abgetastet. Bei hohen
Frequenzen werden die Stützstellen immer weniger, aber da ein Tiefpass
hinter dem DA Wandler folgt ( zwingend erforderlich ) werden die
fehlende Stützstellen durch den Tiefpass quasi rekonstruiert (
Shannontheorie ).
Das ganze wird ja dadurch noch unterstützt, das mit jeder Periode andere
Stützstellen aufgerufen werden.
Mache dir also nicht unnötig einen Kopf welche Taktfrequenz zu welcher
ausgegebener Frequenz passt. Ich würde die Taktfrequenz so wählen , das
die kleinste mögliche Schrittweite der Frequenz eine ganze Zahl ist.
Die kleinst mögliche Schrittweite ist die Taktfrequenz / Wortbreite des
Addierers. Also wenn dein Addierer z. B. 12 Bit breit ist, währen das
4096
schritte.
Wenn man jetzt den AD Wandler nicht an das höchste bit anschließt
sondern da wo also bei maximaler Frequenz noch die Taktfrequenz 4mal
höher ist, dann würde bei einer Taktfrequnenz von 4,096 MHz die
niedrigigste Frequenz
4,096MHz : 4 : 1024 = 1KHz betragen. das wäre dann auch gleichzeitig die
niedrigste Schrittweite der Frequenz. Man kann jetzt den Addierer z.B.
beliebig breiter machen. z.B. 24Bit oder 32 Bit . Die niedrigste
Schrittweite und damit die niedrigste einzugebende Frequenz wird dann
entsprechend kleiner. Damit die niedrigste Frequenz wieder eine ganze
Zahl wird und nicht ein Bruch, wird man die Taktfrequenz sinnvollerweise
wieder anpassen. Oder man muss mit dem Mikroprozessor rechnen. Aber der
ist mit dem DDS eh andauernd beschäftigt. Vielleicht wäre es zu
überlegen den DDS Synthesizer zu Fuß mit TTL-Gattern aufzubauen, und den
Mikroprozessor nur für die Eingabe zu benutzen. Die Eingabe verlangt ja
ein binäres Wort.
Für die Anzeige wäre aber eine Eingabe in BCD Worten praktischer, wenn
man keinen Prozessor einsetzen will. In deisem Falle würde man aber
einen DA Wandler mit parallelen Port benötigen. Vielleicht baue ich
irgendwann noch mal ein Synthesizer mit einen 16bit DA Wandler.
Ralph Berres
Hallo Ralph,
vielen Dank für die ausführliche Erklärung. Ich werde mich die Tage mal
an den Lötkolben setzen und ein paar Probeschaltungen aufbauen sowie
eine Testsoftware proggen. Mal sehen was ich hinbekomme :)
Nochmals vielen Dank.
Ralf