• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


Funktionsgenerator
du machst doch mit dem Pollin->Xilinx cpld
hat das ding soviel jitter ?
zeig doch mal ein oszi-bild....wenn möglich
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Der Jitter kommt durch den Phasenakku (also durchs DDS-Prinzip) und wird brutal deutlich bei meiner Rechteck-Ausgabe, wozu ich das oberste Bit (vom 32 Bit-Akku) ausgebe.

Wenn ich zum Beispiel 9,9 MHz bei 20 MHz Clock ausgeben will, dann sieht man es schön. Jeder zehnte Impuls ist angeditscht.

Es gibt allerdings Ideen, wie man diesen systembedingten Effekt reduzieren kann. Dazu wird zusätzlich zum Frequenz- ein Randomwert addiert und so der Phasenfehler "gestreut".

 
Denken wir uns mal einen mit 20 Mhz getakteten 8-Bit-Akku und eine 10MHz liegende Sollfrequenz:

0000.0000 + 1000.0000 = 1000.0000 => high (im obersten Bit)
1000.0000 + 1000.0000 = 0000.0000 => low
0000.0000 + 1000.0000 = 1000.0000 => high
1000.0000 + 1000.0000 = 0000.0000 => low
0000.0000 + 1000.0000 = 1000.0000 => high
1000.0000 + 1000.0000 = 0000.0000 => low

usw...

=> alles bestens.

Aber nun eine Sollfrequenz knapp unter 10 MHz

0000.0000 + 0111.0000 = 0111.0000 => low
0111.0000 + 0111.0000 = 1110.0000 => high
1110.0000 + 0111.0000 = 0101.0000 => low
0101.0000 + 0111.0000 = 1100.0000 => high
1100.0000 + 0111.0000 = 0011.0000 => low
0011.0000 + 0111.0000 = 1010.0000 => high
1010.0000 + 0111.0000 = 0001.0000 => low
0001.0000 + 0111.0000 = 1000.0000 => high
1000.0000 + 0111.0000 = 1111.0000 => high Angry

...ist natürlich logisch. Sieht aber schrecklich aus.

Beim Sinus als Ausgabe ergibt dieser Effekt eine langsame Amplitudenmodulation, so ne Art Schwebung. Hässlich, hässlich.
 
Ich denke, dass es das beste sein wird, wenn ich im RAM des Boards - wie bisher - die vom Controller berechnete Wellenform ablege und dann den CPLD einfach nur zur linearen RAM-Adresserzeugung verwende und ihn dazu von einem VCO takte.

Die Frequenz dieses von einem PWM-Kanal des Controllers angesteuerten VCOs könnte simultan vom CPLD vermessen werden und als Korrekturgröße in einen digitalen Regelkreis einfließen.

Von der Hardware kommt nur der 20MHz-VCO dazu.
 
ahh, jetzt ....bei / ab welchen frequenzen fällt das auf?
(DDS ist natürlicherweise wohl bei F-out unterhalb Fclk /10 brauchbar, vermute ich mal..)
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Zitat:Original geschrieben von alfsch
ahh, jetzt ....bei / ab welchen frequenzen fällt das auf?
(DDS ist natürlicherweise wohl bei F-out unterhalb Fclk /10 brauchbar, vermute ich mal..)

Ich hab mich von den Specs der AD-DDS-Chips verulken lassen. Die sind angeblich bis "Fclk / 2" brauchbar, zb. 10 MHz bei Fclk = 20MHz. Das stimmt auch, wenn die Sinus machen und wenn man auf die Amplitudenschwebung nicht achtet.

Aber bei Dreieck (Bypass der Sinus-Table) und besonders bei Rechteck (MSB-Nutzung) kann man das Ausgangssignal tatsächlich nur bis 1 MHz oder so nutzen.

Wenn mein RAM also mit 20 MHz getaktet wird, so komm ich bestenfalls auf 1 MHz. Indiskutabel.
 
Wenn Du mehr Bits ausgibst, verschwindet der Effekt. Wink

Anhand des Zählerstands im Phasenakku kannst Du zwischen 2 Samples interpolieren.
 
Ich denke dass das Problem die Zeit-Quantisierung ist,
mehr bits nützen da nicht viel.
Ich habe selbst mal einen RAM-basierten Arb-Genererator gebaut.
Mit 16bit Datenbreite und 24bit-Adress-Akkumulator bei 4MHz Abtastrate. Gesteuert wird das Ganze über 4 CursorTasten und ein Inkrementalgeber für die Parametereingabe.
Als CPU werkelt der HD64180. Die Signalfrequenz hatte ich auf 1MHz begrenzt, der Sinus geht da gerade noch soeben durch, mit schon deutlich erkennbarem jitter.
Davon abgesehen fungiert der auch heute noch als mein Audio-Signalgeber,
das code-EPROM ist nun schon 21 Jahre alt und zeigt noch keine Fehler Confused
...mit der Lizenz zum Löten!
 
Zitat:Original geschrieben von Hans Dorn
Wenn Du mehr Bits ausgibst, verschwindet der Effekt. Wink
Anhand des Zählerstands im Phasenakku kannst Du zwischen 2 Samples interpolieren.

1. Mehr Bits (Du scheinst das Problem noch nicht gerafft zu haben):

0000.0000.0000.0000 + 0111.0000.0000.0000 = 0111.0000.0000.0000 => low
0111.0000.0000.0000 + 0111.0000.0000.0000 = 1110.0000.0000.0000 => high
1110.0000.0000.0000 + 0111.0000.0000.0000 = 0101.0000.0000.0000 => low
0101.0000.0000.0000 + 0111.0000.0000.0000 = 1100.0000.0000.0000 => high
1100.0000.0000.0000 + 0111.0000.0000.0000 = 0011.0000.0000.0000 => low
0011.0000.0000.0000 + 0111.0000.0000.0000 = 1010.0000.0000.0000 => high
1010.0000.0000.0000 + 0111.0000.0000.0000 = 0001.0000.0000.0000 => low
0001.0000.0000.0000 + 0111.0000.0000.0000 = 1000.0000.0000.0000 => high
1000.0000.0000.0000 + 0111.0000.0000.0000 = 1111.0000.0000.0000 => high ;deal2

2. Interpolation: WAS soll ich da beim Rechteck "interpolieren"? misstrau


Natürlich hast Du Recht, dass man beim Sinus oder beim Dreieck per Interpolation die Schwebungen vermindern kann. Aber beim Rechteck (und ähnlichen sprunghaften Wellenformen) scheitert das Verfahren.


Voltwides Arb-Generator ist zielführender als dieser DDS-Krempel. Allerdings will ich ne PLL (wie schon beschrieben) zur kontinuierlichen Taktfrequenzeinstellung verwenden.
 
btw PLL -> hab mal ne drollige idee gesehen: ein avr, tiny2312 oder so, mit einer festen schleife: werte aus tabelle-> auf port ausgeben;
ein 2. tiny produziert per timer variablen takt, oder per PLL-ic stufenlosen takt -> die clk für den "DAC"-tiny
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Zitat:Original geschrieben von Rumgucker
2. Interpolation: WAS soll ich da beim Rechteck "interpolieren"? misstrau
Wenn Du vom idealen Rechteck mit unendlicher Steilheit zu einem realen mit endlicher Steilheit übergehst, dann gibt es gültige Zwischenschritte zwischen 0 und 5V.
 
@Hans: mein RAM kann nur mit maximal 20 MHz getaktet werden. Wenn ich mir einen Zwischenschritt erlaube, so erhalte ich ein Dreieckssignal mit lediglich 5 MHz. Ein Dreieckssignal, dessen Amplitude trotzdem unverändert "wabert".

Ich hab DDS abgehakt.

Ich hab sogar den NCO abhakt, denn er leidet ja auch unter den gleichen Phasensprüngen. Tatsächlich haben die simplen PLLs mit NCO und Phasenvergleicher am Analogausgang ebenso mit Störungen vom NCO zu kämpfen - dann im analogen Filter.

Dieses Problem kann ich vermeiden, wenn ich den VCO mit einem PWM-Signal ansteuere und den PWM-Timer per Frequenzmessung regele. Nur das gibt ein phasenreines Signal und, da ich aktiv in den Regelprozess eingreifen kann, auch ein schnelles Einrasten auf die Sollfrequenz.
 
Zitat:Original geschrieben von voltwide
das code-EPROM ist nun schon 21 Jahre alt und zeigt noch keine Fehler Confused

Der Satz machte mir nen richtigen Schreck. Ich bin überall rumgestiefelt und hab mir überlegt, wo EPROMs drin sein könnten.

Eben hab ich endlich fünf ziemlich unersetzliche EPROMs 2732 gesichert. Ging nur am WE.

Die waren nun seit 23 Jahren im Dauerbetrieb in schön molliger Umgebung. Allerdings ziemlich dunkel.

Puh... mir ging der Arsch ganz schön auf Grundeis. Besonders auch beim Rausfummeln dieser Uralt-Dinger aus ihren Sockeln. Aber alles gut gegangen.
 
So... nun gehts mal wieder hier weiter.

Erste Übung: es muss ein 20 MHz-VCO gebaut werden, der sich von einem PWM-Ausgang 1:10 verstellen lässt.
 
Ausgedacht ist der VCO. Er besteht lediglich aus 4 passiven Bauteilen. Die aktiven Elemente des VCOs sollen sich gleich im CPLD befinden.

Mal gucken, ob das auch in der Praxis so schön hinhaut.
 
VCO ist im CPLD drin. Statt VHDL hab ichs per Schaltbild erfasst. Ging ratz-fatz. Ach.... vielleicht werden xilinx und ich ja doch noch Freunde.

Aber obs auch funktioniert? misstrau
 
;pop;corn;
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Ich musste noch ne kleine Schleife drehen, weil ich mich entschieden hab, dass das Pollin-Board auch gleich die Power für den ganzen Generator bereitstellen soll.

Nun erst konnte ich das CPLD erstmalig anwerfen. Die statische Funktionalität des VCO ist da. Nun muss das Dingens nur noch schwingen.

Hey... ich hab ein gutes Gefühl.
 
Klasse. Auch dynamisch einfach klasse. Alles im ns-Bereich. Mein erstes sinnvolles CPLD-Projekt beginnt.

 
Mit etwas Glück wird heute der CPLD komplett fertig. Der ist aber mit der Aufgabe noch weit unterfordert.

BTW: da das ja ein echter arbiträrer Generator wird, kann man die acht Datenbits zwar zum Analogwert umwandeln... muss es aber nicht. Ich werde also die 8 Digitalkanäle auch noch gesondert rausführen, um irgendwelche Bitmuster ausgeben zu können. 128.000 Bitmuster mit bis zu 20MHz - nicht sooo schlecht.

Die Ladezeit des RAMs wird rund 100ms betragen. Das RAM wird bei Änderungen der Kurvenform/des Bitmusters und bei geänderter Kurvensymmetrie neu errechnet und geladen, ggfls. auch von der seriellen Schnittstelle, die ja auf dem Pollin-Board auch mit drauf ist.

Nene... ich glaub, dass ich jetzt auf richtigen Pfaden wandere. Das könnte was werden...