Hallo Leute aus dem mi´krontroller.net-Fotum, ich bin auf den VHDL-Code von Lothar Miller gestoßen(http://www.lothar-miller.de/s9y/archives/57-Sinusausgabe-mit-PWM.html#extended), der einen Sinus erzeugt. Nun möchte ich gerne eine Modifikation durchführen. Das Array der Sinus-Werte soll in zwei unterschiedlichen Geschwindigkeiten durchlaufen und ausgegeben werden. Theoretisch könnte ich das Design duplizieren und mit verschiedenen Takten betreiben. Es soll soll aber in der gleichen Tabelle je nach 1 oder 0 die Ausgabe des Sinus in der Frequenz variieren. Könnte jemand einen Tipp dafür geben? Heinz
Zeiger mit unterschiedlichen Inkrementen bewegen, Bsp: Zeiger 16Bit, obere 8 Bit werden zur Adressierung einer Tabelle mit 256 Werten genutzt; Inkrement=256 bedeutet jeder Schritt ein Tabelleneintrag, 128 jeder zweite.. lässt sich beliebig verfeinern. Wäre im Prinzip DDS. mfG ingo
In diesem Forum gibt es 470 Threads mit DDS. Sucht man nach "dds vhdl" erhält man immer noch 190 Treffer. Da wird sicher auch eine "Copy&Paste"-Lösung dabei sein! Du wolltest doch nur einen Tipp, oder?
>> Du wolltest doch nur einen Tipp, oder?
Am Liebsten wäre mir natürlich eine Lösung.
Ich sehe bei mir das Problem die gewünschen FSK-Frequenzen von 1200Hz
und 2200Hz auf diese Wise nicht genau ralisieren zu können.
Heinz
Die Frequenzen wirsd du genau "treffen". Dein Problem könnte eher das Zeitgerechte umschalten sein. Übrigens,die Suche mit "FSK und vhdl" ergiebt hier im Forum ca 90 Treffer.
> Zeiger mit unterschiedlichen Inkrementen bewegen, Bsp: > Zeiger 16Bit, obere 8 Bit werden zur Adressierung einer Tabelle mit 256 > Werten genutzt; Inkrement=256 bedeutet jeder Schritt ein > Tabelleneintrag, 128 jeder zweite.. lässt sich beliebig verfeinern. Wäre > im Prinzip DDS. Wie würde es konkret bei diesem Design von Lothar Miller aussehen?
Heinz schrieb: >>> Du wolltest doch nur einen Tipp, oder? > > Am Liebsten wäre mir natürlich eine Lösung. > Ich sehe bei mir das Problem die gewünschen FSK-Frequenzen von 1200Hz > und 2200Hz auf diese Wise nicht genau ralisieren zu können. > > Heinz Wenn Du nur beliebig zwischen 2 Tabellen herumspringst, dann wirst Du an den Umschaltzeitpunkten Unstetigkeiten im Signal haben, deshalb ist wahrscheinlich 1 Tabelle und unterschiedliche Inkremente besser. Möglicherweise muss man zwischen 2 Punten auch interpolieren. Und das Wort "genau" gibt es in der Technik nicht. Es gibt nur "genau genug" und das heißt dass 1200 Hz möglicherweise auch 1190 oder 1210 sein können.
> ...deshalb ist > wahrscheinlich 1 Tabelle und unterschiedliche Inkremente besser. Wären auch konkrete Hilfestellungen bezüghlich des obigen Designs möglich? > Möglicherweise muss man zwischen 2 Punten auch interpolieren. Eine andere Möglickeit bestünde meines Erachtens indem der Sinus höher aufgelöst wird. Heinz
Heinz schrieb: > Eine andere Möglickeit bestünde meines Erachtens indem der Sinus höher > aufgelöst wird. Heißt das nicht in der Mathematik GGV (größtes gemeinsames Vielfaches)?
...so langsam sind wir vom eigentlichen Problem abgewichen. Wie lässt sich diese Idee: > Zeiger mit unterschiedlichen Inkrementen bewegen, Bsp: > Zeiger 16Bit, obere 8 Bit werden zur Adressierung einer Tabelle mit 256 > Werten genutzt; Inkrement=256 bedeutet jeder Schritt ein > Tabelleneintrag, 128 jeder zweite.. lässt sich beliebig verfeinern. Wäre > im Prinzip DDS. konkret umsezten? Alles andere bringt mich nicht wirklich weiter Heinz
Kenne mich in VHDL leider nicht so gut aus, in C würde ich es ungefähr so wie im Anhang lösen, step wird periodisch (z.B. Timerinterrupt) aufgerufen. Vor kurzem frug hier mal jemand nach einem frequenzvariablem Wechselrichter, da zeigte ich einen Assemblerquelltext für AVR, wo ich auf diese Weise den Sinus zur PWM geschickt habe. Vielleicht finde ich den Thread noch, dann setz ich ihn hier rein. mfG ingo
Du musst die DDS-Tabelle einfach multiplexen. Mache ich in meinem VHDL-Synthesizer auch so: Es gibt eine große DDS-Tabelle mit nachgeschaltetem Filter, die wie ein RAM in einzelne Kanäle interlaced wird. Da ich nur 192kHz benötige, kann ich bis zu 500 Kanäle bedienen. In der V5 Version packe ich nunmher 1024 Sinus-Generatoren mit jeweils vollkommen unterschiedlichen Frequenzen :-) >Heißt das nicht in der Mathematik GGV (größtes gemeinsames Vielfaches)? Jojo, nicht zu verwechseln mit dem KGT, dem kleinsten gemeinsamen Teiler. Der erste ist übrigens ->Unendlich und der zweite Wert immer 1. :-)
J. S. schrieb: >>Heißt das nicht in der Mathematik GGV (größtes gemeinsames Vielfaches)? > Jojo, nicht zu verwechseln mit dem KGT, dem kleinsten gemeinsamen > Teiler. > > Der erste ist übrigens ->Unendlich und der zweite Wert immer 1. :-) Und dabei habe ich es meinem Sohn erst letztes Schuljahr erklärt ....
Heinz schrieb: > Ich sehe bei mir das Problem die gewünschen FSK-Frequenzen von 1200Hz > und 2200Hz auf diese Wise nicht genau ralisieren zu können. Was genau bedeutet genau? Welche Taktfrequenz hast du? Und warum willst du es gleich so aufwendig machen? Wenn du unbedingt die DDFS von meiner HP verwendest und 50MHz Takt hast, dann kommst du entsprechend dem Beitrag "Frequenz DDFS" auf einen Teiler von 50,3316 für 1200Hz/23,8418. Und damit auf eine Abweichung von 0,33/50 = 0,66%. Oder andersrum: du kannst statt 1200Hz nur entweder 1192 Hz oder 1215 Hz einstellen. Bei 2200 Hz wären das dann 2193 Hz bzw 2217 Hz... Natürlich kann man da eine deutlich genauere Annäherung erreichen, man muß nur wie schon erwähnt ein wenig mit dem Teiler und der Sinustabelle herumspielen. Aber ich würde mal vorschlagen, dass du dir das einfach mal ein wenig überlegst. Da ist nun wirklich nichts kompliziertes dran... ;-)
Also zwei Frequenzen habe ich nun. Ansatz zur Erweiterung: Frequenzen sollen bei Data_in '0' oder '1'hin un her geschaltet werden. geht es laut Beitrag "Frequenz DDFS" so in dem ich Data_Freq je nach 0 oder 1 ändere? Habe es so probiert, dann tut die PWM nicht. Heinz
Heinz schrieb: > Habe es so probiert, dann tut die PWM nicht. Da ist grarantiert was in der Zeile 42 falsch. Soll heißen: wie soll man da ohne Code was sagen können?
Lothar Miller schrieb: > Soll heißen: wie soll man da ohne Code was sagen können? Anbei die 3 Quelldateieln. Freq_Data wird nun in DDFS je nach 1 oder 0 entschieden. Über Data in kommt 0 oder 1 hinein.
Mal abgesehen davon, dass der Takt beim Entscheider nicht nötig ist,
sollte das durchaus funktionieren. Was sagt denn die Simulation?
> Habe es so probiert, dann tut die PWM nicht.
Was geht nicht? Wie stellst du das fest?
Lothar Miller schrieb: > Was geht nicht? Wie stellst du das fest? Jetzt geht es, die Componente DDFS war vorher nicht eingebunden. Ziel ist es einen FSK-Modulator zu bauen. Müsste der "Sinus"(Nach TP der PWM) bei einer '1' von Data in, nicht bei 0 beginnen? Oder spielt da die Phasenverschiebung keine Rolle? Oder muss ledigliech die Frequenz innerhalt einer '1' oder '0' stimmen? Heinz
Der Akku zählt ja einfach nur mit einer neuen Geschwindigkeit weiter. Wenn du die Frequenzumschaltung im Sinusnulldurchgang willst, dann darfst du den neuen Wert für Freq_Data erst übernehmen, wenn die Adresse der LUT gerade eben 0 ist. So etwa:
1 | process begin |
2 | wait until rising_edge(CLK); |
3 | if Address="0000000" then |
4 | if Data_in='1' then |
5 | Freq_Data <= x"32"; |
6 | else
|
7 | Freq_Data <= x"5B"; |
8 | end if; |
9 | end if; |
10 | end process; |
Ist das zweckmäßig? Das gibt doch erst den Sprung, der Ärger macht.
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.