Forum: Mikrocontroller und Digitale Elektronik Frequenz um Kommazahl teilen mit PLL und uC


von Lukas V. (lukas_v888)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Lukas V. (lukas_v888)


Lesenswert?

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
von Dr. Sommer (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Lukas V. (lukas_v888)


Lesenswert?

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!

von Falk B. (falk)


Lesenswert?

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

von Lukas V. (lukas_v888)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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

von Theor (Gast)


Lesenswert?

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.

von Lukas V. (lukas_v888)


Lesenswert?

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
von nicht_maker (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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)

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> Behandle sie als 13/8.

Uups - 13/4

von Peter D. (peda)


Lesenswert?

Ich würde mit Input-Capture die Eingangsperiode messen, mit dem 
Teilerfaktor multiplizieren und dann über Output-Compare ausgeben.

von nicht_maker (Gast)


Lesenswert?

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