Forum: Mikrocontroller und Digitale Elektronik Suche Lösung für Waveformgenerator mit frei wählbarem Signalverlauf


von Ralf (Gast)


Lesenswert?

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

von Henrik V. (henrik_v)


Lesenswert?

Soundkarte??

von ich (Gast)


Lesenswert?

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€.

von Wolfgang M. (womai)


Lesenswert?

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

von hp-freund (Gast)


Lesenswert?


von Wolfgang M. (womai)


Lesenswert?

sorry, sollte heissen "Velleman PCSGU250" und "1 MHz"

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

es gibt bei TI ein Filterberechnungsprogramm zum downloaden.

Ralph Berres

von Wolfgang M. (womai)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Ralph B. (rberres)


Lesenswert?

sorry den dac1022 Ich hatte mich vertippt.

Ich weis allerdings nicht ob es den noch gibt.

Ralph Berres

von Ralph B. (rberres)


Lesenswert?

Muss mich jetzt nochmals berichtigen DAC1222

von Ralph B. (rberres)


Lesenswert?

noch besser für dich geeignet der MAX543A

Ralph Berres

von Ralf (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Ralph B. (rberres)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Ralf (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.