mikrocontroller.net

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


Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Sinusa...), 
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

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDS

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> DDS

vielleicht etwas ausführlicher?

Autor: ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heinz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Heinz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: ingo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Beitrag steht hier:
Beitrag "Re: Frage zu Wechselrichter"
mfG ingo

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Heinz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  process begin
    wait until rising_edge(CLK);
    if Address="0000000" then
      if Data_in='1' then
        Freq_Data <= x"32";
      else
        Freq_Data <= x"5B";
      end if;
    end if;
  end process;

Autor: Segor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das zweckmäßig? Das gibt doch erst den Sprung, der Ärger macht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.