Forum: Mikrocontroller und Digitale Elektronik Arbiträre Funktion mit DDS erzeugen


von Ludwig (Gast)


Lesenswert?

Hallo,
ich habe im Prinzip das gleiche Anliegen wie hier beschrieben:
Beitrag "DDS mit arbitrary waveform?"
ich suche also einen DDS wo ich den LUT mit einer beliebigen Wellenform 
neu beschreiben kann. Hat sich vielleicht in den letzten 6 Jahren da was 
ergeben?
VG,
Ludwig

von Heinz (Gast)


Lesenswert?

Ludwig schrieb:
> Hat sich vielleicht in den letzten 6 Jahren da was
> ergeben?
Dazu nimmt man einen FPGA, ggf. einen SRAM und einen DAC.

Grüße,
Heinz

von c-hater (Gast)


Lesenswert?

Ludwig schrieb:

> ich habe im Prinzip das gleiche Anliegen wie hier beschrieben:
> Beitrag "DDS mit arbitrary waveform?"
> ich suche also einen DDS wo ich den LUT mit einer beliebigen Wellenform
> neu beschreiben kann. Hat sich vielleicht in den letzten 6 Jahren da was
> ergeben?

Was, seit sechs Jahren warst du nicht in der Lage, diese überaus 
primitive Erweiterung zu einem der vielen existierenden frei verfügbaren 
DDS-Codes hinzuzuprogrammieren? (von selbst Geschriebenem brauchen wir 
wohl vermutlich erst garnicht reden?!)

von Mike (Gast)


Lesenswert?

Ludwig schrieb:
> ich suche also einen DDS wo ich den LUT mit einer beliebigen Wellenform
> neu beschreiben kann.

Das kann sehr einfach sein, das kann aber auch eine aufwändige 
Angelegenheit werden. Das kommt sehr drauf an, was du für Anforderungen 
an das Ding hast.

von hp-freund (Gast)


Lesenswert?

AD9102 ?

von Jonas K. (jonas_k)


Lesenswert?

hp-freund schrieb:
> AD9102 ?

ich denke, so einen konkreten IC kann man kaum empfehlen, wenn man nicht 
weiß, was für Anforderungen oder zumindest Vorstellungen zu Frequenzen, 
Bandbreite, Anzahl der Ausgabekanäle (IQ?), SNR bzw. SINAD und Auflösung 
existieren.

von Hans-Georg L. (h-g-l)


Lesenswert?

Hallo Ludwig,

ich überlege gerade so etwas gerade mit dem AD9854 und einem FPGA zu 
realisieren.

Der AD9854 hat 2 12Bit DAC, die man direkt mit 100 MByte/s ansteuern 
kann
und damit müssten 1 Kanal mit 50Msps oder 2 Kanal mit 25 Msps machbar 
sein.

Ich hab so ein China Modul mit dem Chip und einem ATMEGA32A darauf, aber 
der ATMEGA steuert den AD9854 seriell über SPI an und die Verbindung zum 
PC ist nur 9600Baud.

jetz muss ich erstmal die Firmware umschreiben auf parallel und 256 
KBaud, dann kann ich die direkte Ansteuerung der DAC mal ausprobieren.

Wenn das funktioniert will ich den ATMEGA runterwerfen und ein FPGA 
daran hängen.

siehe: Beitrag "DDS AD9854 China- Modul"

: Bearbeitet durch User
von Ludwig (Gast)


Lesenswert?

Erstmal vielen Dank für die (hilfreichen) Antworten.
Es geht darum ein Signal bestehend aus der Summe mehrerer 
Sinusschwingung zu erzeugen. Die Frequenz der einzelnen Komponenten 
bewegen sich zwischen 1 und 20 Mhz, Genauigkeit sollte bei mindestens 12 
Bit liegen. Da ich im Frequenzbereich sehr dynamisch sein muss, wäre 
eine hohe Sampling Rate von 150 MS/s praktisch.

Ich benutze dafür bis jetzt einen Waveformgenerator von Rigol. Ich hätte 
aber gerne eine flexiblere Lösung. Ein eigenes FPGA dazu zu verwenden 
möchte ich wegen des Programmieraufwandes wenn möglich vermeiden. Der 
AD9102 sieht schon mal sehr interessant aus, ich werde ihn mir mal 
genauer anschauen.
Viele Grüße,
Ludwig

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Wie soll der DDS mehrere Sinusschwingungen gleichzeitig erzeugen? Das 
geht doch nur, wenn in das RAM soviele Schwingungen reinpassen, dass das 
kleinste gemeinsame Vielfache aller Frequenzen erreicht wird.

Also in ein RAM mit z.B. 128M*12Bit passen bei 100 MHz Auslesetakt 128 
Schwingungen von 1 MHz oder 32 Schwingungen von 4 MHz usw., jedenfalls 
immer eine ganzzahlige Schwingungszahl, sonst gibt es Sprünge in der 
Sinusform.
Die kann man dann beliebig überlagern, eine Komponente dann aber nur 
noch mit entsprechend reduzierter Amplitude.
Das DDS-Prinzip nutzt dabei nichts, es ist einfach ein Zähler mit 
schnellem RAM.

: Bearbeitet durch User
von vorticon (Gast)


Lesenswert?

Christoph Kessler (db1uq) schrieb:
> Wie soll der DDS mehrere Sinusschwingungen gleichzeitig erzeugen? Das
> geht doch nur, wenn in das RAM soviele Schwingungen reinpassen, dass das
> kleinste gemeinsame Vielfache aller Frequenzen erreicht wird.

natuerlich muss man den sinus nur ein einziges mal ueber eine periode 
abspeichern und nicht 128 mal... alle sinusse mit beliebiger frequenz 
gehen durch einfache rechenoperationen daraus hervor.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Er will doch mehrere Sinusschwingungen unterschiedlicher Frequenz 
gleichzeitig auf einem DA-Wandler ausgeben. Das geht mit einem einzigen 
DDS nicht (Man kann höchstens viele DDSse parallel arbeiten lassen und 
analog zusammenmischen).
Erst nach einer Zeitspanne, in der alle beteiligten Schwingungen wieder 
denselben Zustand erreichen, z.B. alle einen Nulldurchgang haben, darf 
der Kurvenformspeicher wieder von vorn anfangen. Sonst macht irgendeine 
Sinusschwingung einen Sprung.

von Kein Troll (Gast)


Lesenswert?

Es geht darum je Frequenz einen Phaserraum Register zu haben, mit diesem 
in die Sinus Lookup table rein, der Wert rausziehen, Alle Werte 
addieren, und ueber den DAC raus. Das waer dann am Besten ein FPGA.

Sorry, alles andere ist nur muehsam.

von c-hater (Gast)


Lesenswert?

Christoph Kessler (db1uq) schrieb:

> Er will doch mehrere Sinusschwingungen unterschiedlicher Frequenz
> gleichzeitig auf einem DA-Wandler ausgeben. Das geht mit einem einzigen
> DDS nicht

Natürlich geht das. Jeder primitive Funktionsgenerator für 4,95EUR oder 
so bietet das. Der Trick ist einfach: Man berechnet eine beliebige 
Waveform (z.B. die Überlagerung etlicher Sinusse) vor und spielt sie 
dann ab. Die gesamte Waveform kann man dann beliebig DDS-mäßig "tunen", 
wobei sich die Frequenz jeder einzelnen enthaltenen Frequenzkomponente 
natürlich proportional ändert.

Eben ein arbitrary function generator. Steht fast genauso schon von 
Anfang an als Thema des Threads...

Das Problem des TO ist nach wie vor, daß er wohl zu blöd ist, das selber 
zu tun und daß er keinen fertigen Code findet, wo diese primitive 
Scheiße (das Füllen eines Puffers mit einer berechneten Waveform) 
explizit vorexerziert wird. Die typischen Probleme von 
Copy&Paste-"Programmierern" halt.

Nicht weiter wichtig, darüber nachzudenken, das sind allein deren 
Probleme.

von Jonas K. (jonas_k)


Lesenswert?

Ludwig schrieb:
> Es geht darum ein Signal bestehend aus der Summe mehrerer
> Sinusschwingung zu erzeugen. Die Frequenz der einzelnen Komponenten
> bewegen sich zwischen 1 und 20 Mhz, Genauigkeit sollte bei mindestens 12
> Bit liegen. Da ich im Frequenzbereich sehr dynamisch sein muss, wäre
> eine hohe Sampling Rate von 150 MS/s praktisch.

Also eine Bandbreite von 20MHz, und dabei 12Bit ENOB, also gilt mit 
einer OSR von 75/20=3,5 (bzw. 150MS/s und 20MHz)
12 * 6 = N * 6 + 10 * lg(3,5) nach [1]
N=11

Also braucht der DAC 11 Bit ENOB bzw ein SNR von knapp 70 dB über die 
vollen 75 MHz. Das ist schon mal nicht so wenig, also ich denke 
mindestens 14 Bit Auflösung werden da schon nötig sein (je nach DAC 
halt, siehe Datenblatt SINAD oder SNR). Das ist vom ganzen analogen Teil 
(Masseführung, Versorgung sonstiges Layout) schon mal ein 
anspruchsvoller Bereich.

> Ich benutze dafür bis jetzt einen Waveformgenerator von Rigol. Ich hätte
> aber gerne eine flexiblere Lösung. Ein eigenes FPGA dazu zu verwenden
> möchte ich wegen des Programmieraufwandes wenn möglich vermeiden. Der
> AD9102 sieht schon mal sehr interessant aus, ich werde ihn mir mal
> genauer anschauen.
Mit dem AD9102 wird das höchstwahrscheinlich nicht funktionieren, der 
hat einen recht eingeschränkten internen Speicher. Also zumindest wenn 
die Frequenzen relativ beliebige Vielfache voneinander haben können, 
wird das aus schon genannten Gründen nicht funtkionieren, weil man das 
kleinste gemeinsame Vielfache der Periodendauern speichern muss. Dann 
kommst vermutlich um ein FPGA nicht herum ;)

> Das Problem des TO ist nach wie vor, daß er wohl zu blöd ist, das selber
> zu tun und daß er keinen fertigen Code findet, wo diese primitive
> Scheiße (das Füllen eines Puffers mit einer berechneten Waveform)
> explizit vorexerziert wird. Die typischen Probleme von
> Copy&Paste-"Programmierern" halt.
So einfach ist eine eine Digital-Analog-Wandlung mit den genannten 
Parametern jetzt nicht aufzubauen, würd ich mal sagen. V.a. wenn dann 
noch grundlegendere Kenntnisse fehlen. Also mit dem fertigen Code ists 
da lange noch nicht getan... :D


[1] 
https://de.wikipedia.org/wiki/Quantisierungsrauschen#Erh.C3.B6hung_des_SNR_durch_.C3.9Cberabtastung

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ok Kein Troll, das entspricht ja meinem Vorschlag für n überlagerte 
Sinusschwingungen auch n DDSse aufzubauen. Mehrere DDS-Zähler (je ein 
Addierer und Register) und mindestens eine Sinustabelle, die dann aber 
seriell von allen DDSsen benutzt werden müsste, das kostet Zeit.

Mein Vorschlag war ein schnelles RAM mit ebenso schnellem 
Synchronzähler, das so lang ist dass eine ganze Periode der arbiträren 
Schwingung reinpasst. Ist die aus Sinusschwingungen zusammengesetzt, 
dann ist ihre Periodendauer gleich dem kleinsten gemeinsamen Vielfachen 
der einzelnen Sinus-Periodendauern. Wenn die Frequenzen nicht genau 
vorgegeben sind, kann man sich passende wählen.

Die Amplitudenauflösung einer Einzelschwingung fällt aber mit deren 
Zahl, pro Zweierpotenz ein Bit. Also ein 12 Bit DAC kann zwei Frequenzen 
mit 11 Bit Auflösung oder 4 mit 10 Bit, 8 mit 9 Bit usw. erzeugen, ohne 
einen Überlauf befürchten zu müssen. Die Verwendung eines 16 Bit DAC ist 
also zu empfehlen.

von Jonas K. (jonas_k)


Lesenswert?

Christoph Kessler (db1uq) schrieb:
> Ok ...... wählen.
klingt ja ganz vernünftig (und schon fast nach FPGA;)

> Die Amplitudenauflösung einer Einzelschwingung fällt aber mit deren
> Zahl, pro Zweierpotenz ein Bit. Also ein 12 Bit DAC kann zwei Frequenzen
> mit 11 Bit Auflösung oder 4 mit 10 Bit, 8 mit 9 Bit usw. erzeugen, ohne
> einen Überlauf befürchten zu müssen. Die Verwendung eines 16 Bit DAC ist
> also zu empfehlen.
Das glaube ich nicht. Außerdem bringst du da wohl iwie Auflösung und 
Genauigkeit durcheinander.
1) ein 12 Bit DAC hat keine 12 Bit Genauigkeit.
2) Dem Quantisierungsrauschen ist es egal, ob du da jetzt einen oder 10 
Sinusse ausgibts, das bleibt (näherungsweise) immer gleich.

Ein 16 Bit-DAC wäre vermutlich aber aus Grund 1) nicht verkehrt.

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.