Encoder verliert Schritte bei hohen Geschwindigkeiten

Um die Geschwindigkeit abzulesen (reply 85):
https://forum.arduino.cc/index.php?topic=140205.75

Um die Position zu lesen (reply 4):
https://community.atmel.com/forum/quadrature-decoder

sorry für die verspätete Antwort. Hier wurde offenbar schon wild spekuliert.
Also der Motor dreht mit 10 1/s. Der Encoder hat eine Auflösung von 500 Schritte/Umdrehung. Nach dem Nyquistkriterium fa>=2xfs komme ich dann auf die 10khz Abtastrate.

Offenbar hatten schon mehrere das Problem, dass mit Encoder Lib von Paul Stoffregen bei hohen Geschwindigkeiten Schritte verloren gehen können. Für alle die es noch interessiert: Der Due hat wohl einen Hardware Interrupt der speziell für Encoder ausgelegt ist. Der Link wurde hier auch schon gepostet: Arduino Due reads encoder | Details | Hackaday.io
Damit sollte es besser gehen, allerdings habe ich hiermit das Problem, dass bei negativer Drehrichtung die Schrittzahl plötzlich 2^32-x beträgt, wie ich auch schon in einem anderen Thread hier schrieb.

Faktor 2 reicht nicht. Angenommen das Tastverhältnis des Encoders ist nicht 50%, dann kann eine Abtastung mit der doppelten Frequenz immer nur den Impuls oder die Pause treffen. Auch Aliasing ist zu berücksichtigen, genaugenommen müßte ein Tiefpass zwischengeschaltet werden.

Deshalb kann ich nicht verstehen, warum so ein Signal mit einer festen Frequenz abgetastet werden soll. Wofür gibt es denn Interrupts und Zähler?

Der Due hat wohl einen Hardware Interrupt der speziell für Encoder ausgelegt ist.

Vermutlich meinst du den Hardwaredecoder, welcher in den Timer integriert ist.
Von einem Interrupt sehe ich da erstmal nichts.

Damit sollte es besser gehen, allerdings habe ich hiermit das Problem, dass bei negativer Drehrichtung die Schrittzahl plötzlich 2^32-x beträgt, wie ich auch schon in einem anderen Thread hier schrieb.

Mache dich über die verwendeten Datentypen kundig.
Modelliere dir deine Datentypen, und deine Zugriffsmethoden, wie du sie brauchst.

Klarer:
Ich sehe dein Problem nicht.
Vermute, dass da auch keins ist.
Oder anders gesagt: Das scheinbare Problem steckt nur in deiner Denke.


2^32-x

Was ist das?
Wo kommt das x her?
Was willst du erreichen?
Wie soll es bei einem Über-/Unterlauf reagieren.


Das jetzt auf 2 Threads aufzuteilen, ist eine weniger gute Idee von dir gewesen.
Glaube ich.
Denn es hilft dir nicht.
Verärgert eher die Helfer. (hier und jetzt, mich)

ItsUnreal:
allerdings habe ich hiermit das Problem, dass bei negativer Drehrichtung die Schrittzahl plötzlich 2^32-x beträgt, wie ich auch schon in einem anderen Thread hier schrieb.

das verstehe ich jetzt nicht ganz.
Wenn man eine unsigned long Variable hat dann kommt nach 0 die Zahlen 2^32-x und nicht negative Zahlen.
grüße Uwe

D

combie:
Das jetzt auf 2 Threads aufzuteilen, ist eine weniger gute Idee von dir gewesen.
Glaube ich.
Denn es hilft dir nicht.
Verärgert eher die Helfer. (hier und jetzt, mich)

Ich hatte nicht vor dieses Problem hier neu zu Diskutieren, daher die Vermerkung von mir, dass ich dieses Problem in einem anderen Thread geschildert habe.

@DrDiettrich: Ich hatte auch schon 20kHz und darüber probiert ohne Besserung.

Du solltest die digitale Signalverarbeitung besser verstehen, bevor Du unbrauchbare Annahmen triffst.

ItsUnreal:
Ich hatte nicht vor dieses Problem hier neu zu Diskutieren, daher die Vermerkung von mir, dass ich dieses Problem in einem anderen Thread geschildert habe.

Auch dieses klingt nicht nach Einsicht.
Sondern eher nach Beharren.

Merksatz:

Der Kopf ist rund,
damit das Denken die Richtung ändern kann.

Etwas mehr Flexibilität, im denken, wäre sicherlich angemessen.
Und etwas mehr Fachkunde, in Sachen Datentypen ebenfalls.

Du musst deinem DUE schon "sagen", was du von ihm willst.
Auf "wünschen" reagiert er nicht.

Um ihm zu "sagen", was man von im will, muss man das korrekt ausformulieren, so dass es auch so funktioniert, wie man will.
Dazu ist es in deinem Fall unumgänglich, sich mit den hier genutzten Datentypen zu beschäftigen.

@OP
wie ist denn nun den Datentyp für deine Encoderwerte?
Tatsächlich unsigned long?
besser wäre IMO int32_t, da ja auch negative Werte möglich sind bzw. sein müssen; evtl kannst du auch explizit per (int32_t) casten, auch in deinen #defines.

(Generell würde ich sowieso immer explizite C Datentypen wie in stdint empfehlen.)