Hallo, ich suche einen Sinusgenerator, mit dem ich auf meinem Spartan3-Board über den Atium Designer einen Sinus erzeugen kann, bei dem ich eine genaue Frequenz vorgeben kann. Er soll u.a. über Treiber und MOSFET einen Tiefsetzsteller ansteuern und eine über Brückenschaltung eine Sinus-Dreieck-PWM ermöglichen. Wichtig, wie gesagt, ist eine genaue Zielfrequenz, die sich nach Möglichkeit einfach ändern lassen soll. So kann ich z.B: die Buttons mit verschiedenen Wunschfrequenzen belegen, z.B. 48,13 kHz. Hatte zunächst ein eine DDFS gedacht. Die Sinus-PWM von Lothar Miller funktioniert großartig und hat auch gleiche eine Totzeit mit an Bord. Jedoch habe ich dort das Problem, dass ich die Sinusfrequenz nur durch Erhöhung des Zählwertes in definierten Schritten erhöhen kann. Diese Schrittweite kann ich zwar durch Änderung der Boardfrequenz oder durch Anpassung des Akkumulators ändern. Jedoch kann ich nicht völlig frei alle beliebigen Sinusfrequenzen erreichen, sondern immer nur sukzessive um eine bestimmte Frequenz erhöhen. http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html Gibt es andere Möglichkeiten der Sinuserzeugung auf FPGA, um einen Sinus mit genauer Zielfrequenz zu erzeugen? Wo kann ich weiterführende Infos dazu finden? Vielen Dank für Eure Hilfe.
Steffen B. schrieb: > Gibt es andere Möglichkeiten der Sinuserzeugung auf FPGA, um einen Sinus > mit genauer Zielfrequenz zu erzeugen? Definiere "genau". Du arbeitest mit einem digitalen System, dort gibt es den Begriff "stufenlos" nicht. Du wirst immer irgendwelche Diskretisierungsstufen haben (du kannst dir ein wenig "Analogfeeling" vorgaukeln, indem du eine feste Frequenz gegen ein wenig gegen Rauschen tauschst). BTW: warum brauchst du eigentlich eine Sinusfrequenz(!) von 48,xx kHz?
Hallo, die 48,xx waren nur ein Beispiel. Konkret geht es darum, im Bereich von ca. 10 kHz eine Frequenz einzustellen, die ich im Kilohertzbereich auf min. eine Nachkommastelle genau wählen kann. Also z.B. 10,2 kHz würde reichen.
Sorry, das war falsch. Eine Nachkommastelle allg. ist notwendig. Also z.B. 10123,1 Hz. Die Zielfrequenz liegt bei ca. 10 kHz. Im Moment fuchse ich mich etwas ein. Später soll ein Messstromgenerator betrieben werden - deswegen bereits jetzt die Anforderung an die Genauigkeit.
Also du willst auf 0,1 Hz genau die Frequenz einstellen können, wenn ich dich richtig verstehe. Dann musst du dir als nächstes überlegen, ob du eine Periode immer mit exakt der gleichen Anzahl zeitlicher Quantisierungen "abfahren" willst oder ob die Anzahl der Quantisierungsschritte immer feiner werden soll, je geringer die Frequenz ist. Daraus ergibt sich dann, ob du eine Tabelle mit n Werten anlegst, und über die eingestellte Frequenz entscheidest, wieviel Zeit du zwischen den einzelnen Quantisierungsschritten verstreichen lässt oder ob du eine sehr feine Tabelle anlegst und anhand der Frequenz entscheidest, wieviele Tabelleneinträge du jeweils überspringst. Um die geeignete Methode (oder einen Mix aus beiden) festlegen zu können, musst du dir Gedanken darüber machen, in welchem Frequenzbereich du arbeiten willst und wie grob oder fein sowohl die zeitliche Auflösung als auch die der Amplitude sein soll. Letztendlich kann man sowas ganz elegant über eine Tabelle im RAM machen, in der die Stützpunkte einer Sinusperiode abgelegt sind und die man dann Einrag für Eintrag in variabelen Zeitabständen durchläuft oder eben variabel Tabellenwerte überspringt.
Nachtrag: Mit "immer feiner" meinte ich bezogen auf eine Periode des Sinus. Was umgekehrt bedeutet, dass die Abstände zwischen den zeitlichen Quantisierungen konstant sind.
Wenn die Frequenz nur im Mittel stimmen muss kann man auch eine Division mit Rest durchführen und erhält eine jitter-behaftete Ausgangsfrequenz.
Der Jitter ist dann natürlich bei entsprechend hoher Taktfrequenz und niedriger Ausgangsfrequenz ziemlich klein...
Und die Aufgabe kann wieder mit einer entsprechend skalierten DDFS erledigt werden. Bei 50MHz Eingangstakt kann ich z.B. mit einem Akku von 30 Bit Breite eine Stufung von 0,1Hz erreichen. Latürnich mit entsprechendem Jitter, weil sich 50MHz mit Ganzzahlen nicht genau auf jedes zehntel Hertz teilen lassen. So hat das LSB bei einem Vorteiler von 30Bit eine Abstufung von 46,56613mHz. Blöde Zahl. Ein Takt mit 53,6870912 MHz wäre günstiger, weil dann bei einer Akkubreite von 29 Bit jeder Schritt im LSB eine Frequenzänderung von 0,1 Hz bewirken würde... Siehe http://www.lothar-miller.de/s9y/archives/87-DDFS-Frequenz.html Steffen B. schrieb: > Eine Nachkommastelle allg. ist notwendig. Also z.B. 10123,1 Hz Welche Taktquelle verwendest du denn überhaupt? Ein "normaler" Oszillator mit 30ppm ist hier weit überfordert, du musst hier schon mit deutlich weniger als 10ppm auffahren...
:
Bearbeitet durch Moderator
CORDIC wurde noch nicht genannt, ist zwar einfach aufgebaut, für höhere Frequenzen wird es aber aufwendig, da man dann nicht seriell verarbeiten kann. es gibt ein paar Artikel hier: http://www.mikrocontroller.net/articles/Digitale_Sinusfunktion http://www.mikrocontroller.net/articles/Sinusgenerator_mit_IIR-Filter http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_%28CORDIC%29
Mein Quartus-2 hat dafuer ein NCO-Plugin. Gibts sowas bei Xilinx nicht?
./. schrieb: > Mein Quartus-2 hat dafuer ein NCO-Plugin. Und was macht das "Plugin"? Warum braucht so ein bisschen Frequenzgenerator so viele Ressourcen? Und wie schafft es die Hardware, eine Genauigkeit von 10^16 einzuhalten (immerhin werden vom Wizzard 16 Nachkommastellen angezeigt)?
:
Bearbeitet durch Moderator
> Und wie schafft es die Hardware, eine Genauigkeit von 10^16 einzuhalten > (immerhin werden vom Wizzard 16 Nachkommastellen angezeigt)? Das wuerde ein besserer Taschenrechner sicherlich mit den gleichen Praezision ausrechnen. Aus der DDS Taktfrequenz und dem Phasenakkumulatorincrement. Der XP-Wind00ftaschenrechner liefert: 1000000.000931322574615478515625 Zumindest scheint das Plugin richtig rechnen zu koennen. Das die Frequenz so genau getroffen wird, ist ein Glueckstreffer. Ein Step des NCO sind 0,023 Hz. Mit 565 LEs auf einem Cyclone ist man dabei. Mit ein paar LEs mehr auch mit FM- oder Phasenmodulator...
./. schrieb: > Mein Quartus-2 hat dafuer ein NCO-Plugin. > > Gibts sowas bei Xilinx nicht? Den gibt es bei Xilinx auch, allerdings nicht so kompfortabel und modulierbar wie beim Altera Quartus. Nee lumpige DDS ist aber direkt zu instanziieren. Bei der Problematik des TE scheint mir aber die GEnauigkeitsanforderung gfs der limiter. Implementierbar ist das locker -siehe die Artikel dazu hier im Forum.
./. schrieb: > Das die Frequenz so genau getroffen wird, ist ein Glueckstreffer. Sie wird sicher nicht getroffen, weil kein Taktgeber hinreichend stabil und jitterfrei ist. > Zumindest scheint das Plugin richtig rechnen zu koennen. Es könnte aber bei 1ppm langsam mal anfangen zu runden und nicht noch 10 weitere unbrauchbare Stellen abliefern...
Ok, danke schon mal für die Hinweise. Werde nächste Woche versuchen das Script anzupassen und den Akku zu vergrößern. Weiß jemand, ob es bei Xilinx ein NCO-Plugin gibt und falls ja, wie es heißt?
Taktquelle ist übrigens ein 50 MHz Quarz, der onboard auf dem Spartan3-Board sitzt.
Steffen B. schrieb: > Taktquelle ist übrigens ein 50 MHz Quarz, der onboard auf dem > Spartan3-Board sitzt. Und wie genau ist der? 0,1Hz von 10 000Hz sind 10ppm, wenn ich mich jetzt nicht verrechnet habe. Leistet das der Quarz? Oder ist deine Anforderung an die Genauigkeit auf dem Board eventuell gar nicht realisierbar?
Gute Frage, ob der Quarz 10 ppm leistet. Das weiß ich nicht. Konnte kein Datenblatt finden. Auf dem Quarz steht: "FCO-736B" "50.000" "Fcom 4D" Habe mal eine Messung mit dem Oszilloskop gemacht, jedoch kann ich da nur einige Takte messen. Das sah ganz gut aus, aber ist nicht so aussagekräftig. Müsste eigentlich mit einem Frequenzcounter arbeiten :-( Das Spartan 3-Handbuch spricht von einer "50 MHz Epson SG-8002JF series clock oscillator source". Das deckt sich leider nicht mit den eingravierten Angaben auf dem Quarz. Alternativ lässt sich auf dem S3-Board aber ein anderer Oszilator mit 8-pin DIP-footprint nachrüsten.
Steffen B. schrieb: > Gute Frage, ob der Quarz 10 ppm leistet. Das weiß ich nicht. Tut er nicht. > Konnte kein Datenblatt finden. 2 Minuten http://www.fujicom.jp/FCO-700.pdf > Auf dem Quarz steht: > "FCO-736B" > "50.000" > "Fcom 4D" >
Schlumpf schrieb: > Steffen B. schrieb: >> Taktquelle ist übrigens ein 50 MHz Quarz, der onboard auf dem >> Spartan3-Board sitzt. > > Und wie genau ist der? > 0,1Hz von 10 000Hz sind 10ppm, wenn ich mich jetzt nicht verrechnet > habe. Leistet das der Quarz? Oder ist deine Anforderung an die > Genauigkeit auf dem Board eventuell gar nicht realisierbar? Wenn das board als alleinige Plattform hergenommen werden soll, ist das in der Tat ein wichtiger Punkt. Üblicherweise wird man aber bei hochpräzisen Applikationen nicht den FPGA-Takt oder dessen PLL nehmen, um die Daten auszugeben, sondern einen DAC mit eigener PLL, der die Daten über einen aFIFO abholt. Dessen PLL wiederum wird aus einem hochgenauen Taktgenerator gespeist. Das FPGA hängt nur "lose" davor und darf ruhig jittern. Die ganze Geschichte haben wir auch schon vor längerer Zeit im Rahmen des FPGA-DDS-Generators diskutiert, meine ich. Es braucht einen guten Mastertakt, der gfs selbst präzise aus einer DDS kommt.
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.