Forum: FPGA, VHDL & Co. Sinustabelle mit 2 Geschwindigkeiten


von Heinz (Gast)


Lesenswert?

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

von Volker Z. (vza)


Lesenswert?

DDS

von Heinz (Gast)


Lesenswert?

>> DDS

vielleicht etwas ausführlicher?

von ingo (Gast)


Lesenswert?

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

von Volker Z. (vza)


Lesenswert?

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?

von Heinz (Gast)


Lesenswert?

>> 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

von Volker Z. (vza)


Lesenswert?

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.

von Heinz (Gast)


Angehängte Dateien:

Lesenswert?

> 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?

von Klaus F. (kfalser)


Lesenswert?

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.

von Heinz (Gast)


Lesenswert?

> ...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

von Klaus F. (kfalser)


Lesenswert?

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)?

von Heinz (Gast)


Angehängte Dateien:

Lesenswert?

...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

von ingo (Gast)


Angehängte Dateien:

Lesenswert?

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

von ingo (Gast)


Lesenswert?

Der Beitrag steht hier:
Beitrag "Re: Frage zu Wechselrichter"
mfG ingo

von J. S. (engineer) Benutzerseite


Lesenswert?

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. :-)

von Klaus F. (kfalser)


Lesenswert?

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 ....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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... ;-)

von Heinz (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Heinz (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Heinz (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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;

von Segor (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.