Drehgeberauswertung nach Peter Dannegger

Gast #1178528
Lesenswert?

Hallo,

eine Frage zu Peter Danneggers Drehgeberauswertung von hier:

http://www.mikrocontroller.net/articles/Drehgeber

Mein Geber hat hat 30 Raststellen. Eigentlich verhält er sich exakt wie 
im Diagramm des Artikels angegeben.

Unabhängig davon welche der drei Funktionen ich Aufrufe mein Ergebnis 
ist nach einer Umdrehung IMMER 60!?

Ich hätte erwartet, wenn ich encode_read2( void ) aufrufe bekomme ich 
als Ergebnis 1 Schritt pro Rastpunkt! Das wären dann 30 Schritte pro 
Umdrehung...genau soviele wie Rastpunkte.

Wo ist denn mein Denkfehler?

Danke und Gruß


Ralf
Gast #1178550
Lesenswert?

Hi,

ja das ist klar. Ich dachte nur genau um das auszugleichen wäre die 
Funktion encode_read2( void ) da. Bzw. auch die encode_read4( void ) 
falls er nur alle 4 Takte Rastet. Das wäre dann alle LL Zustände.



Gruß Michael
Gast #1178619
Lesenswert?

Hallo Peter,

ich danke Dir für Deine konstrukitve Unterstützung. Wahrscheinlich 
überprüfst Du Deinen Quellcode auch noch einmal gründlich ;-)

Wie auch immer ich schau es mir noch einmal in Ruhe an...oder machs 
besser gleich selber :-))

Gruß Ralf
#1178645
Lesenswert?

Ralf wrote:
> ich danke Dir für Deine konstrukitve Unterstützung. Wahrscheinlich
> überprüfst Du Deinen Quellcode auch noch einmal gründlich ;-)

Ja, das tue ich bei den Codebeispielen.
Und es muß mindestens noch einer geprüft haben, das "Solide Lösung" habe 
nämlich nicht ich geschrieben.

Du kannst auch gerne andere C-Programmierer fragen, sie werden Dir 
bestätigen, daß bei:
1
return val;
2
return val >> 1;
3
return val >> 2;
niemals das gleiche rauskommen kann.


Peter
Gast #1178656
Lesenswert?

Hey Peter,

daran zweifel ich auch sicher nicht.
Dann würde ich schon eher daran zweifeln, dass mit

enc_delta = 0;
enc_delta = val & 1;
enc_delta = val & 3;

die gleiche Eingangsbedingung für die Timerfunktion gilt.

Allerdings schreibst Du irgendwo, dass Du die beiden unteren Bits 
bewusst maniplierst. Also wird es daran auch nicht liegen.


Gruss Michael
#1178659
Lesenswert?

Peter Dannegger wrote:

> Du kannst auch gerne andere C-Programmierer fragen, sie werden Dir
> bestätigen, daß bei:
>
1
> 
2
> return val;
3
> return val >> 1;
4
> return val >> 2;
5
> 
6
>
> niemals das gleiche rauskommen kann.

Kann es sein, dass das trotzdem falsch (bzw. nicht ganz richtig) ist?
Vermutlich willst du die Werte durch 2 und durch 4 teilen, aber das 
macht >> 1 und >> 2 nicht richtig bei negativen Werten.
Ob der kleine Unterschied zum mathematisch korrekten Ergebnis allerdings 
in dieser Anwendung eine Auswirkung auf hat, habe ich mir nicht genauer 
angeschaut. Ist mir nur gerade aufgefallen, auf sowas fällt man ja 
schnell mal rein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren