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
Leider erst Reklame wegdrücken, aber dann: http://electronicdesign.com/article/analog-and-mixed-signal/flash-rom-based-multichannel-arbitrary-waveform-ge.aspx
sorry, sollte heissen "Velleman PCSGU250" und "1 MHz"
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
es gibt bei TI ein Filterberechnungsprogramm zum downloaden. Ralph Berres
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
Hallo Ralph, ich glaub ich hab schon einen passenden DAC gefunden: http://ww1.microchip.com/downloads/en/DeviceDoc/22250A.pdf Mit dem werde ich es mal probieren. Einem DAC gebe ich eine feste Referenzspannung, der andere bekommt die Ausgangsspannung des ersten als Referenz, mal sehen ob das klappt. Du meintest dieses Filterprogramm, oder? http://focus.ti.com/lit/an/sbfa001b/sbfa001b.pdf Ralf
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
sorry den dac1022 Ich hatte mich vertippt. Ich weis allerdings nicht ob es den noch gibt. Ralph Berres
Muss mich jetzt nochmals berichtigen DAC1222
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
Hallo Andreas, Danke für den Link. Das enthaltene PDF mit der Beschreibung leg ich mir mal unter's Kopfkissen :) Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.