Forum: Mikrocontroller und Digitale Elektronik Mein Drehencoder und ich (verstehen uns ned so richtig)


von Santiago (Gast)


Lesenswert?

Hallo,

habe inzwischen eine kleine Testschaltung aufgebaut, in der ich u.a. 
einen Drehencoder (STEC12E06 vom großen R) betreibe. Ich habe ihn 
"falsch herum" eingebaut, d.h. er hat pulldown-Widerstände bekommen.

Zur Auswertung nehme ich die Graustufenbestimmung von Peter Dannegger 
(aus der Codesammlung) in Verbindung mit einem Timer-Interrupt.

Laut Datenblatt sollen die Prellungen unter 3 ms liegen - ich betreibe 
also die Tina mit Original 1 MHz intern und den Timer mit Vorteiler 8 => 
alle 2 ms einen Timer Überlauf. Um über die 3 ms Samplezeit zu kommen, 
prüfe ich den Drehencoder nur alle paar Überläufe (habe jetzt von 2-8 
ausprobiert).

Im Moment sieht es so aus, als ob 4 Pulse pro Rasterung kommen.
Das ziemlich stabil vor und zurück. Ich gebe den Zähler auf einer 
Segmentanzeige aus und wenn ich den Encoder ganz langsam von einer Raste 
zur nächsten drehe, sehe ich, dass ich kein Problem mit der Anzeige 
habe. Es werden alle einzelen Werte angezeigt. In Normaltempo gedreht 
tanzt er Diskofox.

Alternativ habe ich auch mal probiert, den Timer mit Vorteiler 64 zu 
fahren, dann verliere ich allerdings Takte, d.h. ich muss unkontrolliert 
drehen um einen Schritt weiter zu kommen.

Wie kann ich denn hier wieder zu verlässlichen Einzelschritten kommen?

Muss ich dem Encoder noch irgendwelche analogen Bauteile spendieren, 
oder habe ich schlicht einen falschen Encoder gekauft?

von Peter D. (peda)


Lesenswert?

Santiago wrote:

> Im Moment sieht es so aus, als ob 4 Pulse pro Rasterung kommen.
> Das ziemlich stabil vor und zurück.

Dann funktioniert er doch richtig.
Der Code liefert die Differenz zur letzten Lesung.
Um größere Wertebereiche zu erzielen, muß man dieses Delta z.B. zu nem 
16Bit Wert signed addieren.
So, nun hast Du die 4-fache Pulszahl, also den 16Bit Wert zur Ausgabe 
durch 4 teilen und gut is.

Wenns beim schneller Drehen falsch zählt, dann die Timerinterruptzeit 
verringern, 3ms ist schon ziemlich viel.
Das Entprellen macht nicht das Timerintervall, sondern der Algorithmus.
Dazu muß er aber alle 4 Phasen zuverlässig einlesen können.


Peter

von Santiago (Gast)


Lesenswert?

Hallo Peter,

danke für Deine Unterstützung.

> So, nun hast Du die 4-fache Pulszahl, also den 16Bit Wert zur Ausgabe
> durch 4 teilen und gut is.

Ich habe eine Anwendung, in der ziemlich viele (kleine) Werte geändert 
werden sollen, deshalb hatte ich bislang die Zähler in einem Bitfeld 
angeordnet.
Manche Werte sind 6bittig, andere nur 1bittig ...
... letztere sind nicht gerade prädestiniert, mittels Encoder 
eingestellt zu werden, wenn man dadurch aber alle Taster spart ...

Jetzt alle Zähler um das 4fache erhöhen verbraucht doch ziemlich viel 
Speicher (der nichtmal sinnvoll verwendet wird). Das ist schon eher 
ärgerlich ;)

Gibt es (empfehlenswerte und erhältliche) Encoder, die nur einen Puls 
per Raste erzeugen?

> Wenns beim schneller Drehen falsch zählt, dann die Timerinterruptzeit
> verringern, 3ms ist schon ziemlich viel.

OK, danke für die Hausnummer. Ohne Erfahrung ist es nicht leicht, die 
richtige Richtung zu finden.

> Das Entprellen macht nicht das Timerintervall, sondern der Algorithmus.
> Dazu muß er aber alle 4 Phasen zuverlässig einlesen können.

Das hatte ich schon so verstanden.
Werde trotzdem mal eine schnellere Abtastung ausprobieren.

von Peter D. (peda)


Lesenswert?

Santiago wrote:

> Ich habe eine Anwendung, in der ziemlich viele (kleine) Werte geändert
> werden sollen, deshalb hatte ich bislang die Zähler in einem Bitfeld
> angeordnet.
> Manche Werte sind 6bittig, andere nur 1bittig ...
> ... letztere sind nicht gerade prädestiniert, mittels Encoder
> eingestellt zu werden, wenn man dadurch aber alle Taster spart ...

Dann schau Dir mal das Assemblerlisting an, welche Codemonster Dir 
daraus der Compiler basteln muß.

Es ist unsinnig, um ein Bit SRAM zu feilschen und dafür 100 Byte mehr 
Code zu haben, die AVRs haben massig SRAM.

Nimm für 1..6 Bit ein Byte, für 7..14 Bit 2 Byte als Zählvariable und 
gut is. Dann zur Ausgabe 2*rechts schieben, damit der Wert /4 geteilt 
wird.


Peter

von Santiago (Gast)


Lesenswert?

Hallo Peter,

> Dann schau Dir mal das Assemblerlisting an, welche Codemonster Dir
> daraus der Compiler basteln muß.

Äh - meinst Du jetzt aus den Bitfeldern?

> Es ist unsinnig, um ein Bit SRAM zu feilschen und dafür 100 Byte mehr
> Code zu haben, die AVRs haben massig SRAM.

Hm - ich feilsche gerade mit einem tiny2313 herum - so üppig ist das mit 
dem Speicher imho nicht. Aber bis ich Assembler nicht nur lesen, sondern 
auch schreiben/denken kann, fließt noch viel Wasser den Bach runter.

> Nimm für 1..6 Bit ein Byte, für 7..14 Bit 2 Byte als Zählvariable und
> gut is. Dann zur Ausgabe 2*rechts schieben, damit der Wert /4 geteilt
> wird.

Ok, werde mir das mit den Bitfeldern mal genauer anschauen.
Das mit dem Schieben hatte ich sowieso schon drin, weil meines Wissens 
die Tina sich mit dem Multiplizieren schwer tut.


Bleibt noch die Frage, ob mir nicht jemand einen Encoder empfehlen kann, 
der nur einen Puls pro Rasterung liefert?

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.