Forum: Projekte & Code schneller Quadratur-Dekoder A/B+Index mit RP2040, Arduino


von Mi N. (msx)


Angehängte Dateien:

Lesenswert?

Der auf dem Pico-Board verbaute RP2040 bietet mit seinen PIO-Einheiten 
die Möglichkeit, einen 4-fach Quadratur-Dekoder mit hoher Zählrate zu 
implementieren, sodaß Signaländerungen bis zu 1 x 10^7 Flanken/s erfasst 
werden können. Ferner kann der Index-Impuls von Weg- oder Drehgebern 
ausgewertet werden, der den internen Zähler auf 0 oder einen frei 
wählbaren Vorgabewert setzt.

Die Schaltung besteht aus dem fertigen RP2040-Pico-Board, an dessen 
Eingänge GPIO10 und GPIO11 die beiden Phasen A/B des Gebersignals 
angeschlossen werden. Der Index-Impuls wird an GPIO12 erwartet und ist 
beim gezeigten Programm mit '0'-Pegel aktiv. Wird '1'-Pegel benötigt, 
kann der GPIO-Pin umprogrammiert werden.
Sofern die Gebersignale Pegel > 3,3 V liefern, müssen Spannungsteiler 
oder zumindest Schutzwiderstände in die Signalleitungen eingefügt 
werden.

Das Demoprogramm ist für die Arduino-IDE geschrieben und gibt den 
aktueller Zählerstand bei Änderung über die USB-Schnittstelle aus. Die 
.uf2-Datei kann im Boot-Modus ohne Verwendung einer Arduino-IDE direkt 
auf das Pico-Board geschrieben werden. Das Programm-Modul 'pio_qcnt.c' 
kann auf andere IDEs übertragen werden. Sollte die Dateiendung aus 
Gründen der Kompatibilität zu Arduino auf '*.ino' umbenannt werden, muß 
'rp2040_arduino.h' verwendet werden, um keine doppelten Definitionen zu 
erhalten.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Da würde mich schon interessieren, welche Mechanik in der Lage ist, sich 
mit 10MHz zu bewegen.
Ich hatte mal einen Glasmeßstab für Positionierung im µm Bereich 
auslesen müssen, da hat ein AT89C51 mit 50kHz Interrupt völlig gereicht.

von Mi N. (msx)


Lesenswert?

Peter D. schrieb:
> Ich hatte mal einen Glasmeßstab für Positionierung im µm Bereich
> auslesen müssen, da hat ein AT89C51 mit 50kHz Interrupt völlig gereicht.

Damit gehörst Du nicht zu der Zielgruppe meines Vorschlages.
50 kHz können schon von inkrementalen Kurzhubtastern (beispielsweise 
Heidenhain MT12, MT25) überschritten werden. Wenn der Zähler zudem das 
Index-Signal nicht auswerten kann, ist Schluß mit lustig.
Optische, inkrementale 'Multiturn'-Drehgeber können locker MHz Signale 
liefern.

Noch einmal zur Verdeutlichung: gezeigt ist ein Quadratur-Dekoder mit 
PIO1.
Der Zähler läuft völlig ohne Interrupt im Hintergrund und der aktuelle 
Zählerstand ist als Variable 'q_cnt' ohne spezielle Abfragesequenzen 
direkt verfügbar. Wenn beispielsweise ein Profil erfaßt werden soll, 
kann 'q_cnt' per Timer und DMA ohne weiteren Softwareeingriff direkt in 
ein Array geschrieben werden.
Bei Bedarf kann ein weiterer Zähler mit PIO0 realisiert werden.
Alles zusammen auf einem µC zu 1 Euro oder einem Demo-Board für < 5 
Euro.

Aber gut, das braucht nicht jeder und ist ja auch nicht schlimm.

von 900ss (900ss)


Lesenswert?

Mi N. schrieb:
> Der auf dem Pico-Board verbaute RP2040 bietet mit seinen PIO-Einheiten
> die Möglichkeit

Diese PIOs in dem RP2040 sind eine wirklich leistungsfähige Peripherie. 
Da lässt sich viel mit machen ohne CPU. Mich wundert das andere 
Hersteller so etwas nicht mit anbieten.
Ich finde eines der besten (wirklichen!) Neuerungen der letzten Jahre in 
der uc-Welt.

von Walter T. (nicolas)


Lesenswert?

Peter D. schrieb:
> Da würde mich schon interessieren, welche Mechanik in der Lage ist, sich
> mit 10MHz zu bewegen.

Naja. Schon die billigen optischen Drehgeber mit 600 Strichen halten 
6000 U/min aus. Das gibt dann 240000 Flanken/Sekunde.

von Veit D. (devil-elec)


Lesenswert?

900ss schrieb:
> Mich wundert das andere Hersteller so etwas nicht mit anbieten.

Andere haben das auch. :-) Mit neueren 8Bit AVRs gehts auch.
https://ww1.microchip.com/downloads/en/AppNotes/00002434A.pdf

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Veit D. schrieb:

> 900ss schrieb:
>> Mich wundert das andere Hersteller so etwas nicht mit anbieten.
>
> Andere haben das auch. :-) Mit neueren 8Bit AVRs gehts auch.
> https://ww1.microchip.com/downloads/en/AppNotes/00002434A.pdf

Naja... Ich habe auch mit dem Eventsystem und der CCL neuzeitlicher AVR8 
schon recht viel gearbeitet. Das ist wirklich oft eine hilfreiche Sache, 
wenn's in reiner Software eng wird.

Aber, was damit möglich ist, reicht natürlich nicht annähernd an die 
Flexibilität der PIOs eines Pi Pico heran. Von der Geschwindigkeit 
wollen wir gar nicht erst anfangen zu reden.

von 900ss (900ss)


Lesenswert?

Veit D. schrieb:
> Andere haben das auch. :-) Mit neueren 8Bit AVRs gehts auch.

Na ja, ein wenig haben die AVRs. Aber es reicht bei weitem nicht an die 
Möglichkeiten der PIO im RP2040 ran. Und die PIO läuft mit 125MHz wenn 
man möchte.

von Norbert (der_norbert)


Lesenswert?

900ss schrieb:
> Und die PIO läuft mit 125MHz wenn
> man möchte.

Das ist zwar korrekt, aber eine durch und durch konservative 
Betrachtung.
Insbesondere da ich hier schon > 320MHz Systemtakt problemlos laufen 
hatte.
Und die PIOs werden mit demselben Takt versorgt.

Warum man sich auf default 125MHz festgelegt hat – die M0+ dual cores 
können laut Datenblatt ja bereits 133MHz – entzieht sich mir ebenfalls.

von 900ss (900ss)


Lesenswert?

Norbert schrieb:
> Das ist zwar korrekt, aber eine durch und durch konservative
> Betrachtung.

Nein. Es ist innerhalb der Spezifikation die du ignorierst. Das ist ein 
Vorgehen was mir fern liegt. Auch wenn es hier und da funktioniert. Kann 
man als Sport mal machen....

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

900ss schrieb:
> Norbert schrieb:
>> Das ist zwar korrekt, aber eine durch und durch konservative
>> Betrachtung.
>
> Nein. Es ist innerhalb der Spezifikation die du ignorierst. Das ist ein
> Vorgehen was mir fern liegt. Auch wenn es hier und da funktioniert. Kann
> man als Sport mal machen....

Siehst du, das ist ja seltsam.
Ich dachte immer das die Datenblätter maßgeblich wären.
In meinem steht Dual Core M0+ 133MHz.
Nix 125MHz.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

900ss schrieb:

> Nein. Es ist innerhalb der Spezifikation die du ignorierst.

Die erlaubt allerdings definitiv 133Mhz. Auch für die PIOs.

Die 125Mhz stammen nur aus der default-Konfig der SDKs. Das ist NICHT 
die Spezifikationsgrenze.

Alles über 133MHz hinaus ist aber natürlich jenseits der Spezifikation 
und damit wirklich mehr oder weniger Glücksspiel.

von Mi N. (msx)


Lesenswert?

900ss schrieb:
> Na ja, ein wenig haben die AVRs. Aber es reicht bei weitem nicht an die
> Möglichkeiten der PIO im RP2040 ran.

Auf ersten Blick sieht man es nicht, aber der RP2040 ist insgesamt schon 
recht clever konzipiert. Gut, man könnte sich hier und da noch andere 
Möglichkeiten wünschen, muß aber die Kompromisse beim Design verstehen 
und akzeptieren. Dazu jeder PIO-Befehl in einem Takt - echt schnell.

> Und die PIO läuft mit 125MHz wenn man möchte.

Auch locker mit 300 MHz wie auch der restliche µC, wenn man die interne 
'Kern'-Spannung auf 1,3 V erhöht. Das ist ganz wichtig und kein 
Glücksspiel!
Falls irgendetwas zu langsam läuft, ist noch reichlich Reserve 
vorhanden.
Gut, bei Raumfahrtanwendungen nehme ich ganz brav 133 MHz.

Mittlerweile habe ich obiges Programm etwas verändert und auf explizit 
zwei Kanäle (0 und 1) erweitert. Um Kollisionen mit ggf. anderen 
Funktionen / Libs zu vermeiden ist Kanal1 zu empfehlen, weil PIO1, die 
oberen DMA-Kanäle und nun GPIO13-15 verwendet werden. 
'Standardanwendungen' werden vermutlich mit GPIO0, PIO0 und DMA_CH0 
anfangen ;-)
http://mino-elektronik.de/mt12_iic/mt12_iic.htm#qcnt_pico

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe jetzt nicht in die Details vom RP2040 geschaut. Takten die I/O 
wirklich mit vollen CPU Takt? Ist bei ARM-Kernen nicht eher der I/O Teil 
"abgekoppelt"? Oder trifft das nur bei noch höher getakteten 
Rechenkernen zu?

von Norbert (der_norbert)


Lesenswert?

Veit D. schrieb:
> Takten die I/O
> wirklich mit vollen CPU Takt?

Yep, tun sie. Da hat sogar mein betagtes 50MHz Scope das Handtuch 
geworfen.
Allerdings nur die ›normale‹ Taktfrequenz getestet. Würde mich aber 
nicht wundern wenn das noch viel höher ginge.
Per SIO direkt von den CPU-Kernen.
Per PIO direkt aus der Hardware.

Nicht schlecht für'n Euro

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Norbert schrieb:
> Nicht schlecht für'n Euro

Nicht schlecht. ;-)  Danke.

von 900ss (900ss)


Lesenswert?

Norbert schrieb:
> In meinem steht Dual Core M0+ 133MHz.
> Nix 125MHz.

Ob S. schrieb:
> Die 125Mhz stammen nur aus der default-Konfig der SDKs. Das ist NICHT
> die Spezifikationsgrenze.

Da haben wir ja zwei richtige Klugscheißer.

Zeigt mir mal wo ich geschrieben habe, dass 125MHz die Spezifikations 
Grenze ist.

Und ich bin wirklich beeindruckt dass ihr eine CPU übertakten könnt. Das 
ist ziemlich cool. Respekt.

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

900ss schrieb:
> Zeigt mir mal wo ich geschrieben habe,

Sag mal, ist dir das nicht peinlich?

Erst bist du unfähig deine Gedanken vernünftig darzustellen.
Dann gibst du anschließend den Unschuldigen?

Na ja, jeder wie er kann…

von 900ss (900ss)


Lesenswert?

Norbert schrieb:
> Erst bist du unfähig deine Gedanken vernünftig darzustellen.

Ich kann nichts dafür, wenn du nicht verstehen kannst.

von Norbert (der_norbert)


Lesenswert?

900ss schrieb:
> Ich kann nichts dafür,

Nein, natürlich nicht. Du kannst wirklich gar nichts…

von 900ss (900ss)


Lesenswert?

Norbert schrieb:
> Du kannst wirklich gar nichts…

gähn..... Ich zeigs dir nur nicht :)

Ist gut jetzt, geht hier um was anderes.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

900ss schrieb:

> Da haben wir ja zwei richtige Klugscheißer.

Nur Leute, die Specs lesen können. Offensichtlich im Gegensatz zu dir. 
Der halt alles, was er weiss (oder glaubt zu wissen) irgendwelchen 
Standardeinstellungen eines SDKs entnommen hat.

> Zeigt mir mal wo ich geschrieben habe, dass 125MHz die Spezifikations
> Grenze ist.

Hast du nicht explizit, aber implizit.

> Und ich bin wirklich beeindruckt dass ihr eine CPU übertakten könnt. Das
> ist ziemlich cool. Respekt.

Hier schon wieder. Nein, 133MHz sind eben einfach mal 
spezifikationsgerecht! Wer die nutzt, übertaktet die CPU eben nicht, 
sondern nutzt sie vollkomen im Rahmen ihrer Spezifikation.

Dass du wohl nicht in der Lage dazu bist, deinen Produkten diese 
Geschwindkeit zu verleihen, zeigt nur eins: Dass du keinerlei ernsthafte 
Ahnung hast. Sonst wüßtest du erstens, dass das erstens absolut zulässig 
ist und zweitens wüsstest du auch, wie man's macht...

Nixwisser. Das allein ist noch nicht ganz schlimm (selbst du könntest 
vermutlich dazu lernen). Schlimm wird's erst dadurch, dass du dein 
Nixwissen zum Axiom erhebst.

Das produziert unweigerlich den Widerspruch der Leute, die wirklich was 
wissen. Die nennst du dann "Klugscheißer". Findest du das nicht selber 
ziemlich armselig?

von 900ss (900ss)


Lesenswert?

Ob S. schrieb:
> Hast du nicht explizit, aber implizit
Da war nichts implizit, das ist rein deine Interpretation die zuweilen 
eben daneben liegt.

Ob S. schrieb:
> Nein, 133MHz sind eben einfach mal  spezifikationsgerecht! Wer die
> nutzt, übertaktet die CPU eben nicht, sondern nutzt sie vollkomen im
> Rahmen ihrer Spezifikation.

Habe nirgends geschrieben, dass 133MHz nicht innerhalb der Spezifikation 
ist. Auch wieder so eine Erfindung.
Die z.B. erwâhnten 320MHz nicht. 133MHz ist halt das Maximum laut 
Datenblatt. Dass mehr gehen kann, hat hat in meinen Augen mit seriösem 
Design nichts zu tun. Ich haben lediglich erwähnt das die PIOs mit 
125MHz laufen können aber nicht dass es das Maximum sei. Ist ja auch ein 
signifikanter Unterschied zu den erlaubten 133MHz. Meine Güte.... %-/

Bei dem Rest deiner Äußerungen lass ich dich mal in dem Glauben den du 
hast :)
Ist eh chancenlos....

.

: Bearbeitet durch User
von Mi N. (msx)


Lesenswert?

Bei dem verlinkten Programm für zwei Kanäle, hatte ich der Einfachheit 
halber, die Funktion von PIO1 auf PIO0 kopiert. Das ging schnell, ist 
aber nicht sonderlich geschickt. Daher zeige ich hier eine Verbessung 
und Erweiterung auf max. 4 Kanäle, die allesamt mit PIO1_SM0 - SM3 
umgesetzt sind. PIO0 bleibt frei verfügbar.
http://mino-elektronik.de/progs/RP2040/Pico-qcnt4x.zip

Die beiden ersten Kanäle 0 und 1 arbeiten wie zuvor mit jeweils zwei 
DMA-Kanälen.
Kanäle 2 und 3 sind etwas abgemagert, haben keinen INDEX_PIN-Eingang und 
werden (zur Demonstration) Faktor 10 langsamer betrieben. Das spart 
jeweils einen Eingangspin und einen DMA-Kanal. Der verwendete DMA-Kanal 
(CH6 / CH7) wird bei jedem Lesen des Zählerstandes zurückgesetzt, was in 
der Praxis keine Einschränkung darstellen sollte. Eine Alternative wäre, 
das Nachtriggern nach 2^32 - 1 Flankenwechseln per ISR zu erledigen.

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.