Hallo zusammen, ich nutze ein Xilinx Spartan 3an Starter Kit mit 50 Mhz Takt. Hiermit erzeuge ich ein Rechtecksignal mit 25 kHz. Bei einer Taktzeit von somit 20ns entspricht das 2000 Takten Periodenzeit, von denen 1000 high und 1000 low sind. Da ja nur volle Takte möglich sind wäre die nächst größere Periodendauer 2002 Takte von denen 1001 high und 1001 low sind. Das entspricht dann einer Frequenz von 24975,02 Hz und somit einer Frequenzschrittweite von 25 Hz. Ist die einzige Möglichkeit diese Schrittweite zu verringern, den Takt zu erhöhen? Oder gibt es auch andere Möglichkeiten? Danke schon mal!
DDS ist eine andere Möglichkeit. So wird Auflösung im Zeitbereich durch Auflösung im Amplituden/Phasen-Bereich ersetzt. Muss es ein Rechteck sein? Wie hoch sind die Anforderungen an die spektrale Reinheit? Welcher Frequenzbereich soll erzeugt werden?
Raymund H. schrieb: > Wie hoch sind die Anforderungen an die spektrale Reinheit? Anders herum gefragt: reicht es aus, wenn die Frequenz über einen längeren Zeitraum stimmt? Darf der einzelne Puls jittern (also mal 1000:1001 oder 1000:1000 oder 1000:1001 oder 1001:1001 haben)?
Die Frequenzen variieren im Bereich 15-25kHz und es muss ein Rechteck sein. Ein Sinus wäre auch möglich, wobei der wieder höhere Anforderungen und ein D/A voraussetzt. Ein leichtes Jitter wäre sicherlich zu verkraften, im Mittel muss die Frequenz über einen längeren Zeitraum passen. Gibts da ein Tutorial wie man DDS nutzt? Und wird das dann wieder über einen digitalen Pin rausgegeben?
Hans schrieb: > im Mittel muss die Frequenz über einen längeren Zeitraum > passen. Dann bietet sich eine DDS mit 1-Bit Ausgang ohne LUT an, also das MSB des Phasenakkumulators ist Ausgang. Um mögliche auffällige Töne je nach Bruchteil der Ausgangsfrequenz von der Samplefrequenz Spektral etwas zu verteilen könnte man noch dithern mit Pseudozufallsgenerator. Bei dem Verhältnis Takt/Signal von 2000 ist das aber evtl. schon zu viel des guten. DDS, NCO: http://de.wikipedia.org/wiki/Digitally_Controlled_Oscillator ... http://www.edaboard.com/thread97213.html
Hans schrieb: > Ein leichtes Jitter wäre sicherlich zu verkraften Eine Zahl hast du da auch? > Gibts da ein Tutorial wie man DDS nutzt? Da ist ja nicht viel dran: ein breiter Akku (als Zähler) und ein Register für den Incrementwert. Das wars... http://www.lothar-miller.de/s9y/categories/31-DDFS > Und wird das dann wieder über einen digitalen Pin rausgegeben? Wie gesagt: einfach das MSB des Akkus auf einen Pin geben. Fertig.
:
Bearbeitet durch Moderator
Hallo zusammen, sorry für die späte Rückmeldung. Ich habe das Ganze jetzt mal umgesetzt:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | |
6 | entity Signal_Fast_Axis is |
7 | port ( CLK : in STD_LOGIC; |
8 | FREQUENCY_PARAM : in INTEGER; |
9 | OUTPUT : out STD_LOGIC |
10 | );
|
11 | end Signal_Fast_Axis; |
12 | |
13 | architecture Behavioral of Signal_Fast_Axis is |
14 | |
15 | -------------------------------------------------------------------------------
|
16 | ---------- Deklarationen
|
17 | signal s_counter : UNSIGNED (25 downto 0) := (others => '0'); |
18 | |
19 | begin
|
20 | |
21 | ----------------------------------------------------------------------------------
|
22 | ---------- Sequentieller Prozess für die Signalgenerierung
|
23 | process begin |
24 | |
25 | wait until rising_edge(CLK); |
26 | |
27 | s_counter <= s_counter + to_unsigned(FREQUENCY_PARAM,26); |
28 | |
29 | end process; |
30 | |
31 | |
32 | |
33 | ----------------------------------------------------------------------------------
|
34 | ---------- Ausgabe des Signals
|
35 | |
36 | OUTPUT <= s_counter(s_counter'left); |
37 | |
38 | end Behavioral; |
Jedoch habe ich dann ein ähnliches Problem wie vorher: Im oberen Beispiel sei FREQUENCY_PARAM = 30093: Daraus folgt bei meinem Takt (50MHz) eine Frequenz von 22421,03 Hz. Erhöhe ich FREQUENCY_PARAM auf 30093 dann ändert sich die Frequenz auf 22421,777 Hz. Das ist ein kleiner Frequenzsprung - alles super! Aber, wenn ich das Signal jetzt auf meinen digitalen Output gebe, dann erziele ich wieder minimal 10 Hz Sprünge aufgrund meines Taktes von 50Mhz. Soll heißen: Er rechnet (2^24)/30093 bzw. (2^24)/30094. Das ist in beiden Fällen gerundet 2230 Takte, und bei 20ns ein Frequenz von 22421,525 Hz. Das heißt ich muss so viele kleine Schritte gehen, bis die Anzahl der Takte um mindestens 1 variert, damit ich unterschiedliche Frequenzen ausgeben kann. Das bringt mir dann aber nichts, weil ich dann auch über die Zeit/Frequenz Definition gehen kann. Also irgendwo habe ich noch einen Denkfehler...?
Ich habe mir das Signal auf dem Oszi angeschaut und die Frequenz springt immer zwischen zwei Werten (Delta 10Hz) hin und her. Bedeutet das, dass die Frequenz stimmt wenn ich über einen langen Zeitraum mittel? Dann würde das meinen Anforderungen nicht genügen. Ich bräuchte schon eine fein einstellbare Frequenz, die auch am Oszi darstellbar ist.
Hans Peter schrieb: > Ich habe mir das Signal auf dem Oszi angeschaut und die Frequenz > springt > immer zwischen zwei Werten (Delta 10Hz) hin und her. Bedeutet das, dass > die Frequenz stimmt wenn ich über einen langen Zeitraum mittel? Dann > würde das meinen Anforderungen nicht genügen. Ich bräuchte schon eine > fein einstellbare Frequenz, die auch am Oszi darstellbar ist. Also, ich habe die Frequenzen jetzt mal über 65000 Werte gemittelt und selbst dann erreiche ich minimal einen 7 Hz Sprung. Also ist da irgendetwas faul. Hat jemand eine Idee?
Hans Peter schrieb: > Jedoch habe ich dann ein ähnliches Problem wie vorher: > > Im oberen Beispiel sei FREQUENCY_PARAM = 30093: Daraus folgt bei meinem > Takt (50MHz) eine Frequenz von 22421,03 Hz. Erhöhe ich FREQUENCY_PARAM > auf 30094 dann ändert sich die Frequenz auf 22421,777 Hz. Das ist ein > kleiner Frequenzsprung - alles super! Aber, wenn ich das Signal jetzt > auf meinen digitalen Output gebe, dann erziele ich wieder minimal 10 Hz > Sprünge aufgrund meines Taktes von 50Mhz. Soll heißen: Er rechnet > (2^26)/30093 bzw. (2^26)/30094. Das ist in beiden Fällen gerundet 2230 > Takte, und bei 20ns ein Frequenz von 22421,525 Hz. Das heißt ich muss so > viele kleine Schritte gehen, bis die Anzahl der Takte um mindestens 1 > variert, damit ich unterschiedliche Frequenzen ausgeben kann. Das bringt > mir dann aber nichts, weil ich dann auch über die Zeit/Frequenz > Definition gehen kann. Also irgendwo habe ich noch einen Denkfehler...? Waren zwei Darstellungsfehler drin. Jetzt passt es!
Ich würde das Signal mit einem DDS 9850 generieren wie er in der Arduino-Szene verwendet wird. Er bietet die Feinauflösung, und wenn man einen externen Referenz-Bezug braucht könnte man ihn (Das Arduino DDS Modul hat einen 125 MHz Oszillator on Board) auch extern versorgen. Leicht über SPI zu programmieren ist er auch. Nur das wahlweise Rechtecksignal wird vielleicht nicht jedem Anspruch gerecht, dann muss man eben selbst Hand anlegen und das ausgegebene Sinus- Signal "zu Fuß" nach TTL wandeln.
Ja, ich würde das Signal aber gerne direkt mit dem FPGA generieren. Die Frage ist,ob 50Mhz Systemtakt zu langsam ist, um ein Rechtecksignal mit DDS zu erzeugen und Frequenzschritte unter 10Hz bei einer Nutzfrequenz von 23kHz? Und laut den Antworten oben ist das ja möglich. Habe ich also einen Denkfehler in meiner Vorgehensweise?
@ Hans Peter (Gast) >Ich habe mir das Signal auf dem Oszi angeschaut und die Frequenz springt >immer zwischen zwei Werten (Delta 10Hz) hin und her. Das nennt sich Jitter. > Bedeutet das, dass >die Frequenz stimmt wenn ich über einen langen Zeitraum mittel? Ja. > Dann >würde das meinen Anforderungen nicht genügen. Ich bräuchte schon eine >fein einstellbare Frequenz, die auch am Oszi darstellbar ist. Ist sie doch, nur halt mit Jitter. Wenn man es besser haben will, muss man halt echt ala DDS mit einem DAC den (jitterbehafteten) Sinus ausgeben, GUT filtern und dann wieder über einen Komparator in ein Rechteck wandeln. Dann ist der Jitter deutlich reduziert.
@ Hans Peter (Gast) >Also, ich habe die Frequenzen jetzt mal über 65000 Werte gemittelt und >selbst dann erreiche ich minimal einen 7 Hz Sprung. Also ist da >irgendetwas faul. Hat jemand eine Idee? Messfehler? Bei 22421,777 Hz hat man ~44,6us Periodendauer bzw. ~ 2230 Takte bei 50 MHz. Wenn man über 65000 Perioden mittelt, sinkt natürlich der relative Fehler von 1:2230 (10Hz) bzw. auf 1:(2230*65000) (0,000155 Hz) Sollte reichen, oder?
@ Hans Peter (Gast) >Frage ist,ob 50Mhz Systemtakt zu langsam ist, um ein Rechtecksignal mit >DDS zu erzeugen und Frequenzschritte unter 10Hz bei einer Nutzfrequenz >von 23kHz? Nein. Aber der absolute Jitter liegt nun mal absolut bei 1 Takt, hier 20ns. Nur durch Mittelwertbildung (Messung) über mehrere Ausgangsperioden sinkt der relative Frequenzfehler, weil der absolute Fehler konstant bleibt.
Wie ich sagte kann man ja noch dithern. Wo wird das Signal denn verwendet? So lässt sich evtl. besser entscheiden wie man dithered.
Letztendlich muss das Signal schon von der Frequenz passen. Ich habe ein schwingendes System mit hoher Güte, das ich regeln muss. Hierfür muss ich eben die Frequenz fein einstellen können und das geregelte System folgt natürlich der vorgegebenen Frequenz (mit Phasenoffset). Kann es sein, dass das Oszi eventuell nicht so genau anzeigen kann. Also wenn ich über mehrere Perioden messe, müsste dann ja eine Feinjustierung erkennbar sein. Bei mir springt der Frequenzwert irgendwann um 7Hz. Ich hätte erwartet, dass ich bei einer Mittelung der Werte immer feinere Frequenzschritte sehen müsste?
Hans Peter schrieb: > Kann es sein, dass das Oszi eventuell nicht so genau anzeigen kann. Ich tippe auf etwas wie aliasing effekte der Frequenzmessfunktion. Die schaut vielleicht nur die erste Periode an die sie findet und mittelt nicht über viele Perioden. Wenn das Gerät eine FFT hat, dann mal das Signal mit einer FFT ansehen. Wenn damit ein System hoher Güte gesteuert wird sollten die Störfrequenzen neben der Hauptfrequenz eh kein Problem sein, denn die werden dann gefiltert. Wenn es um die Anregung eines Schwingers geht dann ist wohl das Ziel die Energie auf die gewünschte Frequenz zu konzentrieren. Das passiert schon durch den "Teiler" von ~2000 recht gut. Was stören könnte ist falls der gebrochene Teiler des NCO nahe zu einer ganzen Zahl kommt dass Phasensprünge im Signal selten also die Nebenfrequenzen in den hörbaren Bereich kommen. Da müsste man dithern. Das würde die schmalen Störspitzen im Spektrum zu einem breiten Teppich also zu unauffälligem Rauschen machen, der gebrochene Teil des Teilers hätte kaum noch statistischen Effekt auf die Position und Höhe der Störspitzen im Spektrum.
@ Hans Peter (Gast) >Letztendlich muss das Signal schon von der Frequenz passen. Das ist immer ein Frage des beobachtungs/Messzeitraums. > Ich habe ein >schwingendes System mit hoher Güte, das ich regeln muss. Hierfür muss >ich eben die Frequenz fein einstellen können und das geregelte System >folgt natürlich der vorgegebenen Frequenz (mit Phasenoffset). Bei DDS pendelt die Ausgangsfrequenz fast immer zwischen zwei diskreten Werten hin und her, nur im MITTEL über viele Perioden ist die Frequenzauflösung sehr hoch. Wenn das stört, muss man wie bereits geschrieben filtern und dann wieder per Komparator ein Rechtecksignal erzeugen. >Kann es sein, dass das Oszi eventuell nicht so genau anzeigen kann. Je nach Messung, ja. Ein Oszi ist kein Frequenzzähler, auch wenn moderne Oszis einen einfachen Frequenzzähler für den Trigger eingebaut haben. > Also >wenn ich über mehrere Perioden messe, müsste dann ja eine Feinjustierung >erkennbar sein. Ist sie auch. Aber 65000 Perioden siehst du sicher NICHT auf deinem Oszi ;-) > Bei mir springt der Frequenzwert irgendwann um 7Hz. Ich >hätte erwartet, dass ich bei einer Mittelung der Werte immer feinere >Frequenzschritte sehen müsste? Ist auch so. Nimm einen echten Frequenzzähler und miss mit größer werdenen Torzeiten 1ms, 10ms, 100ms. Dann siehst du das. Mein LeCroy WaveJet314 hat einen Frequenzzähler mit 6 Stellen für den Trigger, der geht auch relativ genau. Allerdings steht nirgendwo, welche Messzeit benutzt wird. Ist aber auch nur ein Gimmick.
Hans Peter schrieb: > Letztendlich muss das Signal schon von der Frequenz passen. Ich habe ein > schwingendes System mit hoher Güte, das ich regeln muss. Hierfür muss > ich eben die Frequenz fein einstellen können und das geregelte System > folgt natürlich der vorgegebenen Frequenz (mit Phasenoffset). Solange der Jitter nicht stört, kein Problem. > > Kann es sein, dass das Oszi eventuell nicht so genau anzeigen kann. Also > wenn ich über mehrere Perioden messe, müsste dann ja eine Feinjustierung > erkennbar sein. Bei mir springt der Frequenzwert irgendwann um 7Hz. Ich > hätte erwartet, dass ich bei einer Mittelung der Werte immer feinere > Frequenzschritte sehen müsste? Mit dem Osci kannst du so kleine Abweichungen nicht ohne weiteres messen, da schlicht das Messintervall zu kurz ist. Ein DDS, bzw eigentlich DCO bzw NCO, springt immer zwischen 2 Frequenzen hinn und her. Wenn die Zielfrequenz dabei sehr nahe an einer der beiden Frequenzen ist passiert das halt sehr langsam. Dithern bringt in diesem Zusammenhang nichts, das verteilt nur den Phasenoise über einen grösseren Bereich statt ihn in Peaks zu haben. Bei einer DDS Anwendung bedeutet das besserer SFDR. Im Zussamenhang mit fractional PPLs hatte ich schon mal gesehen, dass man diese Situation vermeiden kann, indem durch geeignete Wahl der Parameter dafür sorgt dass die Fraction immer immer Bereich 0.2 bis 0.8 ist. Hat den Vorteil dass der Loopbackfilter den Jitter besser filtern kann. Bei einer Regelschleife in einer Trackinganwendung ist das natürlich nicht so einfach wenn der Regelbereich grösser als die Differenz sein soll. Mit viel Gehirnacrobatic sollte es aber möglich sein. Mit einem ODDR kann man übrigens den Jitter halbieren, ohne den Grundtakt zu verdoppeln. Alles was es braucht ist Brain und ein paar Simulationsrunden. PS: DCO: Digitally Controlled Oscillator. NCO: Numerically Controlled Oscillator.
Lattice User schrieb: > Ein DDS, bzw eigentlich DCO bzw NCO, springt immer zwischen 2 Frequenzen > hinn und her. Wenn die Zielfrequenz dabei sehr nahe an einer der beiden > Frequenzen ist passiert das halt sehr langsam. Sorry aber das was du meinst das ist ein Fraktionalteiler, der hat nichts mit einem DDS zu tun. Ein DDS hat im Idealfall keinerlei Phasen- bzw Frequenzsprünge. Die einzigen Sprünge die es gibt sind die Phaseninkremente des Schritt-Akkumulators (Quantisierung des Schrittweiten- Registers), und die werden durch das (obligatorisch nach dem DAC-Ausgangg nachzuschaltende) Tiefpassfilter weg-geglättet.
Eberhard F. schrieb: > Lattice User schrieb: >> Ein DDS, bzw eigentlich DCO bzw NCO, springt immer zwischen 2 Frequenzen >> hinn und her. Wenn die Zielfrequenz dabei sehr nahe an einer der beiden >> Frequenzen ist passiert das halt sehr langsam. > > Sorry aber das was du meinst das ist ein Fraktionalteiler, der > hat nichts mit einem DDS zu tun. Deswegen habe ich ja DCO, bzw NCO geschrieben. Diese Anwendung als DDS zu bezeichnen stammte nicht von mir. Ausserdem ist es durchaus verwandt.
@ Eberhard F. (loocee) >Ein DDS hat im Idealfall keinerlei Phasen- bzw Frequenzsprünge. DDS ist nicht gleich DDS. Hier geht es um die einfachste Form, bei der nur das MSB des Phasenakkus als Rechtecksignal genutzt wird. Nix Sinus-ROM, nix DAC, nix. Filter. >Die einzigen Sprünge die es gibt sind die Phaseninkremente >des Schritt-Akkumulators (Quantisierung des Schrittweiten- >Registers), und die werden durch das (obligatorisch nach dem >DAC-Ausgangg nachzuschaltende) Tiefpassfilter weg-geglättet. Eben DEN hat der OP NICHT! Wenn gleich der Ausgangsfilter viel Jitter und Phasenrauschen wegmacht, ALLES kann er nicht entfernen, vor allem nicht niederfrequentes Phasenrauschen!
@ Hans (Gast) >ich nutze ein Xilinx Spartan 3an Starter Kit mit 50 Mhz Takt. Man kann problemlos bei diesem FPGA den Takt per DLL/DCM auf 200 MHz vervierfachen und dann nochmal mittels DDR-Ausgangsregister praktisch verachtfachen, sprich 400MHz = 2,5ns Schrittweite. Die DDS baut man 8 mal parallel auf und füttert sie mit um 1/8 phasenverschobenem Akkustartwert. Die 8 MSBs werden dann über ein Register und Schieberegister mit dem 400 MHz Takt ausgegeben. Schon ist der absolute Jitter auf 1/8 gefallen. Hab ich vor langer Zeit mal gemacht, lief problemlos. Mit einem großen Virtex und Gigabittranceivern haben das andere Leute schon mit 10 GHz gemacht. Ob das hier für deine Anwendung aber WIRKLICH nötig ist, wissen wir nicht.
Falk Brunner schrieb: > Hier geht es um die einfachste Form, bei der > nur das MSB des Phasenakkus als Rechtecksignal genutzt wird. Nix > Sinus-ROM, nix DAC, nix. Filter. Naja, worum es hier geht ist dass jemand eine Feinauflösung in der Frequenz braucht, und die bekommt man nun mal mit einer PLL mit Fraktionalteiler oder mit einer vollständigen DDS Implementierung.
:
Bearbeitet durch User
Eberhard F. schrieb: > ist dass jemand eine Feinauflösung in der > Frequenz braucht Die hat er doch, nur mit spektralen Störlinien die leider auch in ihrer Position abhängig vom Bruchteil des effektiven Teilers wandern. Bei dem Verhältnis 50e6/25e3 aber gar nicht so stark, siehe Bild des Spektrums mit und ohne Dither. Mit dem Ohr ist da kaum ein Unterschied zu hören. Eberhard F. schrieb: > Ein DDS hat im Idealfall keinerlei Phasen- bzw Frequenzsprünge. Nur wenn die Sinustabelle die gleiche Auflösung wie der Phasenakkumulator hat, also praktisch nie. Das hier ist sehr wohl eine DDS, mit der Auflösung von einem Bit für die Sinustabelle.
Hallo zusammen! Vielen Dank für die Antworten. Auf dem Oszi ließ sich aus den genannten Gründen die feine Frequenzschrittweite nicht rauslesen. Ich habe das Signal trotzdem mal auf mein System gegeben und optisch die Amplitude gemessen und tatsächslich lässt sich das System deutlich feiner einstellen. Also ist schlichtweg das Oszi nicht in der Lage eine gemittelte Frequenz (bzw. FFT) anzuzeigen. Ich versuche damit jetzt mal zu regeln und melde mich dann nochmal.
Hans Peter schrieb: > Ich versuche damit > jetzt mal zu regeln und melde mich dann nochmal. Darf ich fragen um was es dabei geht? Eine Art Induktionsheizer? (Oh, geht wohl kaum optisch zu messen) Irgend eine Art mechanischer Schwinger zum Reinigen oder Materialbearbeiten? Soll die Leistungsabgabe auf Resonanzmaximum geregelt werden?
:
Bearbeitet durch User
@ Hans Peter (Gast)
>Ein mechanischer Schwinger auf Resonanz geregelt ;)
Da hast du doch schon deinen Ausgangsfilter!
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.