Hallo, Ich möchte eine Rechteckfrequenz eines Inkrementalgebers von maximal 20 kHz, typisch eher 16 kHz um einen nicht-ganzen Teiler, z.B. 3,25 teilen. Das ganze möchte ich mit einem uC machen, damit der Teiler programmierbar ist und ich mehrere verschiedene Teiler auf verschiedene Ausgänge realisieren kann. Das Ausgangssignal soll von der Impulsbreite auch variabel sein, im Endeffekt will ich also eher 3,24 Eingangsimpulse zählen und einen eingestellten Ausgangsimpuls ausgeben. Mein Ansatz bis jetzt: Die ganzen Pulse können einfach über Erkennung der High-Flanke des Eingangssignals gezählt werden. Mit dem uC könnte man außerdem die Dauer bis zum nächsten Impuls messen, diese z.B. durch 8 teilen, und dann mit einem weiteren Timer die Achtelimpulse zählen und vergleichen. Das wird aber sehr schnell sehr ungenau und man kann nur große Intervalle realisieren (z.B. Achtel oder Sechzehntel). Nun habe ich ein wenig über PLLs gelesen und folgenden Ansatz gehabt: Man könnte die Eingangsfrequenz mit einer PLL z.B. mit 128 multiplizieren, und das resultierende Signal am uC per Interrupt auswerten und somit 128-tel der Eingangsfrequenz zählen. Bis jetzt habe ich aber nur PLLs und Anwendungen dieser gefunden, bei denen sehr hohe Frequenzen im MHz-Bereich verarbeitet werden. Gibt es PLLs die eine "niedrige" Frequenz multiplizieren können? Oder habt ihr andere Anregungen, wie man dieses Problem lösen kann? Was muss ich beim Umgang mit PLLs beachten? Genutzt wird ein Arduino M0 Pro, allerdings ohne Arduino Libraries, also im Endeffekt ein Atmel SAMD21. Ich freue mich über jeden Ratschlag! Grüße
Lukas V. schrieb: > Mit dem uC könnte > man außerdem die Dauer bis zum nächsten Impuls messen, Je nach Controller könnte ein Timer mit Input Capture auch ausreichen. Am Beispiel eines STM32F103 mit 72MHz-16bit-Timern: Damit müsste sich eine Genauigkeit von ca. 14ns erreichen lassen, was bei 20kHz Signal 0.027% entspricht, in 3600 Schritten pro Periode. Mit der gleichen Auflösung kann man auch Pulse ausgeben. Das Hauptproblem wird die Latenz zwischen Eingangs- und Ausgangs-Puls sein. Wenn man die Timer-Synchronisation nutzt lässt sich vermutlich eine Latenz von 1 Takt (ca. 14ns) erreichen. Andere Controller können ggf. auch noch mehr. Reicht das vielleicht schon?
Lukas V. schrieb: > Gibt es PLLs die eine "niedrige" Frequenz multiplizieren können? 4046. Im alten CMOS-Original als CD4046, oder neuer als 74xx4046. https://www.elektronik-kompendium.de/public/schaerer/pll4046.htm
Ich nehme an Input Capture bedeutet, dass der Timer auf einen Eingang eingerichtet werden kann, und dann die Dauer zwischen den High-(oder Low, je nach Einstellung) Flanken misst? Wenn ich das richtig verstanden habe, hätte ich dann ja immer noch die Problematik, dass ich ausrechnen müsste, wieviele Pulse denn nun z.B. 3/8 sind. Beispiel: 16 Bit- Timer läuft mit 96 MHz, Eingangsfrequenz 18 kHz Der Timer misst 5333 Pulse je Periode. Der Controller rechnet durch schieben nach rechts: 5333 / 8 = 666 (jetzt könnte man noch aufrunden, in dem man schaut ob Bit 2 1 oder 0 ist, aber das sei jetzt mal geschenkt) Ein weiterer Timer der auch mit 96 MHz läuft, kann nun 666 Pulse zählen und hat damit 1 Achtelperiode gezählt. Die gezählten Achtelperioden kann ich dann mit einem Wert vergleichen und ggf. den Ausgangspuls ausgeben. Ich merke grade, dass ich vorher einen Denkfehler hatte. Ich dachte, wenn ich durch Bits schieben durch z.B. 128 Teile, würde ich mehr als 1 Puls "verlieren", aber ich habe ja maximal eine Ungenauigkeit von einem Puls, oder 0,5 Pulse wenn ich das ganze noch ggf. aufrunde. So wäre die resultierende Ungenauigkeit ja doch sehr gering. @Rufus Danke für den Link!
:
Bearbeitet durch User
Lukas V. schrieb: > Ich nehme an Input Capture bedeutet, dass der Timer auf einen Eingang > eingerichtet werden kann, und dann die Dauer zwischen den High-(oder > Low, je nach Einstellung) Flanken misst? Korrekt. Je nach Controller kannst du zwischen High-Flanken, Low-Flanken, oder High- und Low- Flanken messen (d.h. ganze Periode, positive Pulse, negative Pulse). Lukas V. schrieb: > Wenn ich das richtig verstanden habe, hätte ich dann ja immer noch die > Problematik, dass ich ausrechnen müsste, wieviele Pulse denn nun z.B. > 3/8 sind. Ja. Daher hast du immer eine gewisse Latenz wenn sich das Eingangssignal ändert. Wenn du einen Cortex-M3 Controller nimmst (wie STM32F103) hast du eine Hardware-Divisionseinheit, die innerhalb von 12 Takten alles dividieren kann, somit musst du dich nicht auf 2er-Potenzen und Shiften beschränken. Bei einem Cortex-M4 (z.b. STM32F4) hast du sogar eine FPU, mit der du innerhalb von 1 Takt mit beliebigen float-Zahlen multiplizieren kannst (+ je 1 Takt für Int->Float und zurück Konvertierung), falls du das brauchst. Musst du eigentlich die Frequenz des Ausgabesignals ändern, oder reicht es wenn die Ausgangsfrequenz gleich zum Eingang ist, aber nur der Duty Cycle angepasst wird? Mir fällt gerade auf dass im ersteren Fall meine vorherige Aussage Quatsch ist: Dr. Sommer schrieb: > Wenn man die Timer-Synchronisation nutzt lässt sich vermutlich eine > Latenz von 1 Takt (ca. 14ns) erreichen.
@ Lukas V. (lukas_v888) >Ich möchte eine Rechteckfrequenz eines Inkrementalgebers von maximal 20 >kHz, typisch eher 16 kHz um einen nicht-ganzen Teiler, z.B. 3,25 teilen. Warum? Was soll da am Ende rauskommen? Ein Rechtecksignal nicht ganzzahligen zu teilen kriegt man hin, auch daraus wieder ein Quadratursignal eines Inkrementalgebers zu machen. Aber das alles klingt eher nach Krampf, weil jemand unpassende Komponenten zusammengeschaltet hat. Da ist es es besser, in der verarbeitenden Software den Korrekturfakter 3,25 einzuarbeiten.
Die Ausgangsfrequenz soll geändert werden, und zwar so, dass sie immer im gleichen Verhältnis zur Eingangsfrequenz steht. Die Impulsdauer der Ausgangsimpulse möchte ich anpassen können. Momentan bin ich auf den Cortex M0 beschränkt, trotzdem sind die Informationen bezüglich M3 und M4 sehr hilfreich, vielen Dank!
@ Lukas V. (lukas_v888) >Die Ausgangsfrequenz soll geändert werden, und zwar so, dass sie immer >im gleichen Verhältnis zur Eingangsfrequenz steht. Die Impulsdauer der >Ausgangsimpulse möchte ich anpassen können. Das ist aber nicht das Gesamtproblem sondern nur ein Teilaspekt. >Momentan bin ich auf den Cortex M0 beschränkt, trotzdem sind die >Informationen bezüglich M3 und M4 sehr hilfreich, vielen Dank! Völlig nebenbsächlich. Jeder uC kann eine Frequenz messen und mittels DDS in Software eine nahezu beliebig gut aufgelöste Ausgangsfrequenz erzeugen.
Falk B. schrieb: > Völlig nebenbsächlich. Jeder uC kann eine Frequenz messen und mittels > DDS in Software eine nahezu beliebig gut aufgelöste Ausgangsfrequenz > erzeugen. Okay, dann werde ich mich da nochmal genauer informieren. Kannst du mir so schon Tipps geben, eventuelle Keywords nach denen ich suchen kann/ über die ich mich informieren muss?
@Lukas V. (lukas_v888) >Okay, dann werde ich mich da nochmal genauer informieren. Kannst du mir >so schon Tipps geben, eventuelle Keywords nach denen ich suchen kann/ >über die ich mich informieren muss? ??? Ja, Netiquette. Sag uns, was bei deinem Projekt INSGESAMT erreicht werden soll. Niemand baut so einen Frequenzteiler einfach nur so. Ist es eine Motorsteuterung?
Es geht bei Falks Frage um etwas Anderes. Ich zitiere hier mal aus der Netiquette: "... Gerade am Anfang ist es immer gut zu sagen, was man insgesamt erreichen will und nicht so sehr Annahmen darüber zu treffen, wie man es erreichen könnte und dann das Wie zu hinterfragen. Oft ist der Denkfehler nämlich schon im Ansatz und man kann besser helfen, wenn man das Ziel des Fragenden kennt." Ich habe mit Absicht, den Teil über Anfänger vor dem Zitat weggelassen. Soweit ich Deinen Überlegungen folgen kann, bist Du vermutlich kein Anfänger. Ob ein Denkfehler vorliegt, kann man so nicht sagen: Es ist jedenfalls für mich nicht abschätzbar, ob es so ist oder nicht, wenn ich das Ziel nicht kenne. Es könnte für Dich hilfreich sein, wenn man Deinen Ansatz erst einmal hinterfragt. Vielleicht kommt dabei heraus, dass es so gemacht werden sollte. Vielleicht aber auch nicht; vielleicht gibt es eine bessere Lösung für Dein Problem. In jedem Fall gewinnst Du dabei, denke ich.
Ich möchte dazu nicht zu viel erzählen, da es sich dabei um ein Projekt um eine Firma handelt und ich nicht weiß, wieviel ich davon so erzählen darf. Ein System soll in Abhängigkeit der Drehgeschwindigkeit eines Motors getriggert werden. Die Triggersignale sollen variabel in ihrer Länge sein und alle x,x Pulse ausgegeben werden.
:
Bearbeitet durch User
Lukas V. schrieb: > Ich möchte dazu nicht zu viel erzählen, da es sich dabei um ein Projekt > um eine Firma handelt und ich nicht weiß, wieviel ich davon so erzählen > darf Dann kläre das oder die Fa. muss einen Fachmann bezahlen. nicht_maker
Lukas V. schrieb: > Ich möchte eine Rechteckfrequenz eines Inkrementalgebers von maximal 20 > kHz, typisch eher 16 kHz um einen nicht-ganzen Teiler, z.B. 3,25 teilen. Mit einer PLL eine Frequenz durch eine Kommazahl zu teilen, wird allgemein nicht möglich sein. Nur wenn die Kommazahl zufällig auch als Rationale Zahl mit halbwegs kleinem Nenner darstellbar ist, hast du eine Chance. Bei deinen 3.25 ist das einfach. Behandle sie als 13/8. http://www.hobbyelektronikwerkstatt.info/pll/ (Bild 2)
Ich würde mit Input-Capture die Eingangsperiode messen, mit dem Teilerfaktor multiplizieren und dann über Output-Compare ausgeben.
Die Grundfrage ist mMn, wie sich die Eingangsfrequenz ändern kann. Kann sich diese nur langsam ändern, kann das so klappen, wie oben vorgeschlagen. Kann sich diese schnell und sprunghaft ändern, dann kommt es sehr darauf an wie groß der Fehler werden darf, ob das überhaupt geht. nicht_maker
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.