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