Go Down

Topic: Encoder beschleunigen (Read 126 times) previous topic - next topic

AxelMunshine

Hallo geehrte Community

Ich möchte meinem Rotary Encoder gerne mitteilen, dass, je schneller ich ihn drehe, er grössere Schritte ausführen soll.
Er gibt Zahlenwerte von 0 bis 127 aus. Bei einer Beschleunigung darf er gerne 3 bis 5 Schritte übergehen.

 Es gibt da ein kleines Beispiel in den Libraries, aber das ist eingebunden als "isr" in einem Interrupt, und für mich absolut zu kompliziert, um es auch nur im Ansatz zu verstehen.

 Ich wäre also sehr dankbar, wenn mir hier jemand das einfach erklären könnte...

Danke im Voraus

Code: [Select]
int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWert = 0;

void setup() {
 pinMode(14, INPUT);
 pinMode(15, INPUT);
 Serial.begin(31250);
}

void loop() {
 messungPin1 = digitalRead(14);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW))
 {if (digitalRead(15) == HIGH)
 {if (encoderWert < 127) encoderWert++;}
 else {if (encoderWert > 0) encoderWert--;}
 Serial.println (encoderWert);}
messungPin1Alt = messungPin1;}

MaHa76

#1
Jan 20, 2019, 08:05 pm Last Edit: Jan 20, 2019, 08:07 pm by MaHa76
Dann zähle doch die Zeit zwischen 2 Impulse und sage dann, dass er die aktuelle Position nicht um 1, sondern um 2 oder 3 Schritte je Impuls erhöhen soll.

Ich muss aber anmerken, dass ich die Drehencoder bisher immer ohne lib genutzt habe.

AxelMunshine

Jep, das klingt erstmal sehr logisch...
Danke

postmaster-ino

Hi

Naja - das Beispiel oben sieht nun ja auch nicht nach einer Lib aus.
Was ich auf jeden Fall ändern würde:
- Pin-Nummer 14 als Variable im Header
- Pin-Nummer 15 als Variable im Header
- Maximal-Wert des Encoder per Variable im Header
- Minimal-Wert des Encoder per Variable im Header

Da Du int benutzt - brauchst Du negative Werte?
Wenn Es eh nur bis 127 gehen soll, reicht byte als Typ, wenn negative Zahlen benötigt werden, char (-128...127), drüber int (-32368...32767), drüber long (... ne, Die müsste ich nachgucken - 2^31).
Dinge, Die konstant sind, auch so deklarieren - z.B. werden sich die Pin-Nummern und die Grenzen des Encoder-Wertes wohl während der Laufzeit nicht ändern.
Code: [Select]

const byte Encoder_Pin_A=14;
const byte Encoder_Pin_B=15;
const byte Endocer_Min=0;
const byte Encoder_Max=127;
char schrittweite;
byte encoderwert;
...
if (digitalRead(Encoder_Pin_A)==HIGH){
...
//je nach Drehrichtung schrittweite + oder -, je nach Geschwindigkeit auch größer als 1
...
if (schrittweite>0){ //positive/r Schritt/e
  encoderwert=min(encoderwert+schrittweite,Encoder_Max);  //das Minimum von neuem Schrittwert
}else if (schrittweite<0){
  encoderwert=max((char)encoderwert+schrittweite,Encoder_Min);
}
...

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

AxelMunshine

Nee, das ist mein eigener Sketch, keine Lib...

Aber was du da sagst, ist schon sehr interessant.
Ich brauche keine negativen Werte.
Richtig, weder Pin noch Grenzen werden sich ändern.
Danke, ich werde das gleich mal umsetzen in mein Sketch...

Danke vielmals

Go Up