Forum: FPGA, VHDL & Co. PWM über eine Logic


von Rouven D. (lowrey)


Lesenswert?

Hallo,

ich muss über eine Logic ein PWM-Signal generieren welches von der
Frequenz von 0,1Hz bis 100kHz varieren soll. Die Schrittbreite soll im
unteren Bereich  bei 0,1Hz und im oberen Bereich bei 100Hz liegen. Der
darauf aufliegende Puls soll auch variabel einstellbar sein im Bereich
von 0-100%, wobei dort die Schrittweite bei 0,1% liegen sollte.
Über einen µC soll ein Startwert, ein Endwert und die Dauer, bis wann
der Endwert erreicht werden soll übergeben werden.
Soweit zu den Gegebenheiten. :-)
Nun hab ich mir schon folgende Gedanken gemacht.
Achja vielleicht noch vorab, meine externe Quartzfrequenz soll unter
20MHz bleiben.
Also zu meinen Überlegungen. Ich habe einen 10MHz Quartz genommen und
eine Teiler der max bis auf 78,125kHz runterteilen kann. mit den
unterschiedlichen Frequenzen steuere ich dann einen Counter an. mit den
gezählten Werten steuere ich zwei Komperatoren parrallel an. Der eine
generiert daraus die Frequenz und der andere das Tastverhältnis. Den
ersten Teiler lege ich dann auf den Setzeingang eines FlipFlops und den
zweiten auf den Rücksetzeingang. Daraus wird dann mein PWM generiert.
Nun zur Frage:
Im unteren Bereich klappt das ja alles super, aber bei zum Beispiel
100kHz kann ich damit mein Tastverhältnis nich mir auf 0,1% genau
einstellen nur auf 1%. Hat jemand vielleicht ne Idee wie ich das
hinbekommen könnte?

von Daniel R. (daniel_r)


Lesenswert?

Vergiss 100KHz. Mit 20MHz Eingangstakt und 8Bit Auflösung kämst Du
gerade mal auf 39,68 KHz.

Um auf 100KHz bei 8 Bit zu kommen bräuchtest Du 51MHz Eingangstakt.

von Mirco (Gast)


Lesenswert?

Die 51 müssten aber mit einer PLL/DCM kein Problem sein.

von Daniel R. (daniel_r)


Lesenswert?

Hört sich irgendwie so an, als ob er das mit separaten ICs aufbauen
will.
Im FPGA wäre es natürlich kein Problem, wenn man davon absieht, dass
die Vorgabe unter 20MHz zu bleiben, nicht eingehalten werden kann.

von Rouven D. (lowrey)


Lesenswert?

Danke für die schnelle Resonanz auf meine Frage.

Natürlich ist es denkbar bzw. vielleicht sogar sinnvoll diese ganze
Logic über einen FPGA zu realisieren. Wobei mir noch nicht ganz klar
ist wie ich das alles auf einem FPGA realisieren könnte.
Meine Überlegen waren halt bisher nur mit seperaten ICs, wobei ich die
Komperatoren auf jeden Fall in einer Programierbaren Logic machen
wollte.

Nun versteh ich aber nicht ganz wie ihr auf die 51MHz Eingangstakt
kommt. Ich komme da immer auf 100Mhz, da ich ja für die Einstellbarkeit
von 0,1% einen minimalen Zählerstand von 1000 benötige. Die 1000 mal der
Ausgangfrequenz von 100Khz ergibt doch dann 100MHz oder nicht?
Ich hab mir aber auchnoch überlegt, dass vielleicht über einen PLL
meine externe Quarzfrequenz intern hochtakte auf den benötigten Wert.
Was meint ihr dazu?

von Daniel R. (daniel_r)


Lesenswert?

Eine PWM ist in Hardware ein Zähler, der immer auf und ab zählt(immer
bis max, dann wieder bis min usw...). Die PWM Frequenz ergibt sich
daraus, wie viel mal pro Sekunde der Zähler das MAX. erreicht.
Bei 8 Bit muss er ja bis 255 zählen. Das ist aber dann nur ein halber
Takt. Deshalb muss man 2*255 rechnen. Also mit 510.
Deine Ausgangsfrequenz soll 100KHz sein.
Also: 510 * 100000Hz = 51MHz.

Deine 0,1% Auflösung bekommst Du nur, wenn Du die Breite des Zählers
erhöhst(und resultierend dadurch auch die Eingangsfrequenz). Wird
schwer, sowas zu realisieren, ist aber nicht unmöglich.
Was willst Du denn machen?

Daniel

von Rouven D. (lowrey)


Lesenswert?

Ich mache zur Zeit ein Praktikum, und in dem Praktikum soll ich eine
solche Logik erstellen mit den gegeben vorgaben. Also eine Baugruppe
die am Ausgang ein völlig variables PWM Signal generiert. Besser gesagt
die Baugruppe soll das acht mal generieren.

Jetzt verstehe ich deinen Wert von 51MHz. Ich hatte mir das halt so
gedacht, das ich einen breiteren Zähler benutze und den aber immer nur
zu einem bestimmten Wert hoch Zählen lass und ihn dann Resete. Der
Reset kommt dann von einem Komperator der den gezälten Wert mit dem
Wert des vom µC oder durch eine weiter Logik berechneten Wertes
vergeleicht. Weißt du wie ich das meine?
Dieser erste vergleich ist dann für die Frequenz. Außerdem mache ich
mit einem zweiten Komperator eine weiteren vergleich mit dem ich dann
quasi die Pulsweite einstelle. Beides kommt dann auf ein RS-FlipFlop.

Dadurch komme ich wegen der Genauigkeit von 0,1% auf einen kleinsten
Zählerwert von 1000 und daraus resultierend als Eingangsfrequenz
100MHz.
Was hälst du von dem Vorschlag mit dem PLL? Kann ich mit einem PLL die
externe Frequenz von 10MHz intern auf 100MHz hochtakten?

von Daniel R. (daniel_r)


Lesenswert?

Sorry, ich verstehe nicht so ganz, wie Du das machen willst.

Das mit der PLL wäre durchaus denkbar. Wenn Du grad eine da hast...
Oder Du machst alles im FPGA, dann brauchst Du keine externe PLL.

Daniel

von Axel (Gast)


Lesenswert?

Lass Dich vom Daniel nicht verrükt machen. Um die Auflösung zu
erreichen, brauchst Du die 100 MHz. Die kannst Du mit der internen PLL
erzeugen.

Um damit dann 100 kHz zu erreichen muss Du eben einen entsprechend
breiten Zähler nehmen (11 Bit).

Und wie Du geschrieben hast, wird der Zähler bei Erreichen eines Wertes
resettet (um die Frequenz einzustellen) und  über einen Komparator wird
die Pulsweite eingestellt.

Ist mit einem FPGA kein Hexenwerk. Ist aber auch diskret nich so schwer
aufzubauen, allerdings brauchst Du dann einen 100 MHz Takt, den Du
irgendwie generieren muss. Aber vielleicht gibt es ja solche
Oszillatoren.

Gruss
Axel

von Rouven D. (lowrey)


Lesenswert?

Hallo Axel,
danke für deine Antwort.
Also könnte ich mit dem Lösungansatz die Problemstellung lösen
allerdings ist mir noch eins nicht ganz klar. Ein normaler PLL gibt mir
doch nach dem multiplizieren ein Sinussignal aus, ist das bei dem
internen PLL anders. Wenn nicht könnte ich den ja gar nicht so ohne
weiters an meinen Zähler anlegen, oder?

Gruß Rouven

von Wissender (Gast)


Lesenswert?

Deine Loesung ist keine PWM, sondern eine FM. Du aenderst die Frequenz,
nicht die Pulsweite. Bei 11 Bit Aufloesung und 100KHz PWM-Frequenz
ergibt sich eine Eingangsfrequenz von rund 400MHz. 2*(2^11)*100KHz
=409,6MHz
Anders gehts nunmal nicht.

von Alexander Lindert (Gast)


Lesenswert?

Ich glaube schon, dass dieses Problem mit ein bis zwei Clock-Domains
lösbar ist. 2*(2^11)*100KHz=409,6MHz. Von wo her kommt die 2* am
Anfang? Das ist doch ein PWM und kein Takt.

Vielleicht geht das:

Der Speed-Eingang geht als Eingang in den Strobegenerator.
Bei einem Strobe wird aus dem Sinus-ROM der PWM Wert gelesen, +
AdressAddierer <= AdressAddierer + Countval;
Da der PWM sehr schnell sein muss, liegt dieser bei Bedarf in einer
eigenen schnellen 205 MHZ Clock Domain. Somit muss der PWM den die
Werte des ROM-Daten-Registers einsynchronisieren.
Sollte zu wenig Rom vorhanden sein (ziemlich sicher), so muss der Speed
Eingang über eine Kombinatorik gehen, wo der Strobegeneratoreingangswert
und der Countval berechnet werden.

mfg
Alexander

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.