mikrocontroller mit mehr als einem Quadrature-Decoder Timer

Sep 19, 2019 Last reply: 7 years ago 90 Replies
Jump to replies (90)

Hi,



ich hab immer mal wieder Quadratur-Encoder (Drehgeber u.ä.) an einen Mikrocontroller anzuschliessen. Irgendwie geht das mit jedem Controller (im schnellen Timerinterrupt die zwei Pins einlesen und dekodieren), besonders glücklich bin ich dabei aber meist nicht - denn das ist zu langsam (der Encoder verliert dann doch mal Impulse, weil man zu schnell dreht) und belastet die CPU mit recht vielen und häufigen Interrupts, bzw. man darf dann im Hauptprogramm tunlichst nie Interrupts sperren, damit der Encoder fehlerfrei funktioniert. D.h. ich will da lieber ne Hardware im Controller, die das macht. Welche Controller haben (möglichst mehrere) Timer, die auch Quadratur- Dekodierung können? Ich hab schon recherchiert, leider ist das nicht leicht rauszufinden. Da das Feature kaum in den Filtern der Distris oder Hersteller auftaucht, muss man sich erst durch Datenblätter oder Appnotes kämpfen... Also beim STM32 können es nur die "Advanced timer" und da hat man oft nur einen davon drin, in den größeren Controllern aber manchmal sogar schon zwei und ganz selten sogar drei.

formatting link
Welche Controller gibt es noch? (Mir reichen da Typen mit 16 MHz Takt und ein paar kB RAM, gern auch mehr, Hauptsache sie sind keine Stromschlucker ;-).



M.



--


Am 19.09.2019 um 08:36 schrieb Matthias Weingart:

Bist Du sicher? Ich hab jetzt mal spontan in das Datenblatt des STM32F7xx und STM32L4xx reingeschaut, und dort unterstützen die Advanced-Timer und die General-Purpose-Timer quadrature Encoder. Und davon gibts dann schon mehr als 2.

Z.B. STM32L072, 6 GP-Timer, die Drehgeber unterstützen.

=?UTF-8?Q?Thorsten_B=c3=b6ttcher?= <thorsten snipped-for-privacy@gmx.net:

Nee eben nicht. Drum frag ich ja auch hier :-). In der unten verlinkten App- Note steht das leider auch wieder nicht eindeutig drin - d.h. ich hätte auch noch die Datenblätter wälzen müssen und dabei kenne ich mich mit den Dinger noch gar nicht aus.

Super, danke.

M.

--

Am 19.09.2019 um 10:20 schrieb Matthias Weingart:

Ich hab' grad mal durchgespielt. Ich krieg bei dem nur 4 Stück hin.

Um das STM32-Zeuch schnell auszuprobieren, solltest Du den STM32CubeMX benutzen.

formatting link
Gruß Andreas

Andreas Fecht snipped-for-privacy@aftec.de:

Mhh ja, aber dabei bin ich doch gerade erst dabei mir einen neuen Controller auszusuchen. Da wollte ich eigentlich ohne Installationsorgien auskommen. ;-) AT XMEGA und Pics kommen ja auch noch in Frage und bestimmt viele andere mehr

- nur die MSP430-Timer z.B. können das gar nicht ;-).

M.

--

Am 19.09.2019 um 10:43 schrieb Andreas Fecht:

Ich hab das Datenblatt nur überflogen, kann sein dass nicht alle von den Timern das unterstützen. Aber definitiv gehts auch mit den GP-Timern, und nicht nur mit den Advanced.

"Matthias Weingart" snipped-for-privacy@pentax.boerde.de> schrieb im Newsbeitrag news: snipped-for-privacy@penthouse.boerde.de...

Na ja, schlechte Programmierung, man kann bereits mit einem AVR vier Encoder mit 1 Mio Abtastungen pro Sekunde einlesen.

Siehe

formatting link
Der H8/3003 und H8S (2 Kanäle) H8SX (4 Kanäle), ATXmega (3 Kanäle bis Osz/4) und STM32F4 (6 Kanäle) machen das in Hardware

Am 19.09.2019 um 08:36 schrieb Matthias Weingart:

Quadratur-Dekodierung ist ein Klacks für jeden Controller. Deiner Beschreibung entnehme ich, daß Du möglicherweise das Meßverfahren ändern solltest, mit Interrupt vom Encoder statt von einem Timer?

Wieviele Encoder hast Du denn, mit wievielen Impulsen pro Sekunde maximal?

DoDi

Am 19.09.2019 um 12:17 schrieb Hans-Peter Diettrich:

Potentiell prellende Encoder direkt an einen Interrupt zu hängen ist meist keine gute Idee.

Bernd

"Hans-Peter Diettrich" snipped-for-privacy@aol.com schrieb im Newsbeitrag news: snipped-for-privacy@mid.individual.net...

Das ist ungefähr das blödeste, was man machen kann, denn wenn es dann wirklich mal prellt, wird der Controller mit haufenweise Interrupts überfahren, schneller als er sie abarbeiten kann. Welche er verliert ist Zufall.

Man muss dann vorher per Hardware entprellen, damit kann man sich die Software-Entprellung ganz sparen.

Am 19.09.2019 um 12:35 schrieb Bernd Laengerich:

Prellende Encoder sind eine dumme Idee. Prellen können AFAIR nur mechanische Kontakte, und die sind so langsam, daß sie per Software entprellt werden können. Wenn das so nicht mehr funktioniert, ist ein Entprellen auch mit Hardware nicht mehr möglich. Andere Encoder können nicht prellen, eignen sich also für eine Abfrage per Interrupt.

DoDi

Andreas Fecht snipped-for-privacy@aftec.de:

Mhh, hab das jetzt mal installiert. Man muss aber trotzdem wissen, an welchen Flags man drehen muss? Auf Anhieb sehe ich da nicht, welche Register ich verändern muss, um einen Timer auf Quadrature-Modus zu bekommen. Was hast Du da eingestellt?

M.

--

"MaWin" snipped-for-privacy@private.net:

Naja mit Port-Interrupts - das hab ich schön bleiben lassen. Zuverlässig funktioniert Quadraturdekodierung nur, wenn man die Signale mit einem festen Takt abtastet - dann stört auch prellen nicht wirklich - da wackelt dann der Wert nur um ein Digit hin- und her, es gehen keine Zählimpulse verloren - was ihmo das wichtigste ist. (sofern nur eine Flanke prellt, wenn natürlich beide gleichzeitig Prellen ist das ganz schön böse ;-).

M.

--

Es hindert dich keiner auch mehr Pins gleichzeitig einzulesen wenn du sie geschickt an einem 8Bit-Port verteilst.

Es gibt sicher Anwendungen wo man einen Hardwareencoder zu schaetzen weiss, aber IMHO eher selten. Einfach deshalb weil die Mechanik nicht die schnellste ist.

Kann das sein das du nur Controller kennst wo man die Interruptprioritaeten nicht frei einstellen kann?

Ich kann jetzt aus dem Kopf keine Nummern nennen, aber ich bin mir sicher das bei Renesas bei den Industriekontrollern gesehen zu haben.

Olaf

Am 19.09.2019 um 15:39 schrieb Matthias Weingart:

Ja wenn Du so ein Experte bist, kann ich diesen Thread ja killen.

DoDi

Am 19.09.2019 um 15:35 schrieb Matthias Weingart:

Klick auf einen Timer, der das unterstützt (z.B. TIM2). Bei Combined Channels kann man dann "Encoder Mode" auswählen.

Gruß Andreas

Am 19.09.19 um 15:39 schrieb Matthias Weingart:

Dann musst Du die Entprellung noch optimieren... Irgendwann ist dann natürlich die Grenze in Bezug auf die Drehgeschwindigkeit erreicht.

Gerald

Am 19.09.2019 um 15:39 schrieb Matthias Weingart:

Ich hab das vor Jahren mal so gemacht, 3 Drehgeber in einem System, Interrupt auf die steigende Flanke. Im Interrupt den 2. Pin gelesen und daran entschieden ob ich inkrmentieren oder dekrementieren muss. Das hat immer Problemlos funktioniert, und ist IMHO noch heute im Einsatz.

Naja, es geht auch einfacher, ohne den Prozessor ständig zu unterbrechen.

Andreas Fecht snipped-for-privacy@aftec.de:

Ahhh, da steckt das! Danke. Sogar der LowPower-Timer kann Encoder-Mode. Damit kann dann z.B. sogar der nur 32 pinnige STM32L0 sogar 4 Encoder (sofern man einen Timer nicht für andere Zwecke braucht).

M.

--

olaf snipped-for-privacy@criseis.ruhr.de>:

Naja, irgendwie kommt man dann doch oft schneller an die Grenzen des Systems als man vorher denkt ;-). Hatte mal einen Linearencoder - Auflösung 10um - wenn man den ein wenig schneller bewegte, verlor der gleich Impulse trotz

100kHz Abtastrate. Da hatte ich mich "verschätzt" und eine Baustelle mehr. Das Encodersystem konnte mit 10MHz liefern! Da wäre ein Hardwreencoder toll gewesen.

Naja das nützt ja nix, wenn in der Hauptschleife DINT; "tu was kritisches"; EINT; gekapselt werden muss. Z.B. wenn man 64bit Variablen auf einem 8 bit System sauber und sicher lesen will, die in einem Interrupt verändert werden.

Ja stimmt, Renesas war auch immer toll bei der Ausstattung der Controller.

M.

--

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required