INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Pins am Drehregler (Rotary Encoder)
07.03.2015, 18:09 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2015 12:11 von HaWe.)
Beitrag #41
RE: Pins am Drehregler (Rotary Encoder)
nein, mach delay(50) !

edit:
das eine ist dein Steuer-Regel-Intervall (50 ms), hier misst du die Geschwindigkeit und regelst deine inc+/-
das andere ist dein dein Encoder-Pin-Mess-Intervall (250µs bzw. ursprünglich 1ms), der rechnet nur den nackten Encoderwinkel aus.

ps,
ich sage ja gar nicht: nimm meine Lösung weil es die einzige Richtige ist -
ich sage nur: wenn du sich für eine entscheidest, dann behalte sie mit allen Implikationen bei.
Du kannst nur nicht aus jeder beliebigen Lösung igendwelche Fragmente bunt zusammenklauben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 11:16
Beitrag #42
RE: Pins am Drehregler (Rotary Encoder)
(07.03.2015 18:09)HaWe schrieb:  nein, mach delay(50) !

das eine ist dein Steuer-Regel-Intervall (50 ms),
das andere ist dein dein Encoder-Pin-Mess-Intervall (250µs bzw. ursprünglich 1ms)

ps,
ich sage ja gar nicht: nimm meine Lösung weil es die einzige Richtige ist -
ich sage nur: wenn du sich für eine entscheidest, dann behalte sie mit allen Implikationen bei.
Du kannst nur nicht aus jeder beliebigen Lösung igendwelche Fragmente bunt zusammenklauben.

Hallo HaWe, sorry, dass ich mich erst so spät melde, aber bei dem schönen Wetter waren wir draußen unterwegs :-(

Das ist mir schon klar, aber du muss mir auch zustimmen, wenn ich sage, dass der rote Faden (meine Schuld) sehr schnell gerissen war, es war keine böse Absicht Lösungsfragmente zu mischen, bloss ich wusste irgendwann nicht mehr, auf welchen Code ich deine Vorschläge anwenden sollte, bzw. ich musste nicht wo mir die Codeschnipsel oder kurzen Tipps hin gehören, darum habe ich einen der letzen Post versucht "klar Schiff zu machen", darum auch die fordernden Fragen nach dem was ich nun machen sollConfused

Ich habe deinen Rat befolgt und Drehgeber mit Timer-Interrupt

Genommen, funktioniert auch wunderbar, ich muss sagen, dass ist die bessere Lösung:

a) habe ich keine Ausreisser mehr, als zwischen drin negative Werte
b) kann ich dadurch meinen Code noch umbauen, da die Arbeit ja im Interrupt erledigt wird und ich somit nur immer den Encoderwert abfragen muss, somit kann ich noch meine Funktionen erweitern, was ich mit meinen alten Code nicht gekonnt hätte, sehr genial.

Hier kurz die bisherige Lösung:





Sieht nur ein wenig schlimm aus mit dem Pflaster, aber ich habe noch keinen Drehknopf und ohne das Plaster würde ich rutschen.
Ich muss noch einmal mit dem richtigen Drehknopf probieren ob die Geschwindigkeit und haptik passen!

Vielen Dank für die aufwendige Hilfe!
Ich werde mich bessern Tongue

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 11:31
Beitrag #43
RE: Pins am Drehregler (Rotary Encoder)
hi,
freut mich sehr, dass es klappt!
Ich wäre auch gar nicht böse gewesen, wenn es mit einem anderen Code geklappt hätte - man muss sich manchmal eben einfach nur entscheiden zwischen hü oder hott, mehr wollte ich nicht zum Ausdruck bringen.

wenn du jetzt noch den kompletten Code posten könntest, das wäre schön Big Grin

wiel Spaß weiterhin! Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 11:38
Beitrag #44
RE: Pins am Drehregler (Rotary Encoder)
Lass mich noch ein bisschen den Code hübsch machen dann poste ich ihn!
Kein Problem!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 18:21
Beitrag #45
RE: Pins am Drehregler (Rotary Encoder)
Hallo, wie versprochen der hübsche und bereinigte Code:

Code:
#include <Arduino.h>

/************************************************************
*
* Demo-Programm zur Auswertung eines händisch betriebenen
* Drehencoders (Quadraturencoder) mit dem Arduino im
* Timer-Interrupt mit einer Abfragefrequenz von rd. 1kHz
*
* Copyright (C) 2014 Ralf Hübben - www.meinDUINO.de
*
* Dieses Programm ist freie Software. Sie können es unter den
* Bedingungen der GNU General Public License, wie von der
* Free Software Foundation veröffentlicht, weitergeben und/oder
* modifizieren, entweder gemäß Version 3 der Lizenz oder (nach
* Ihrer Option) jeder späteren Version.
*
* Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
* dass es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE
* GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE
* oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details
* finden Sie in der GNU General Public License.
*
* Sie sollten ein Exemplar der GNU General Public License
* zusammen mit diesem Programm erhalten haben. Falls nicht,
* siehe <http://www.gnu.org/licenses/>.
* Inoffizielle deutsche Übersetzung:
* http://www.gnu.de/documents/gpl.de.html
*
**************************************************************/

// An die Pins 3 und 4 ist der Encoder angeschlossen
#define encoderA 3
#define encoderB 4

// Globale Variablen zur Auswertung in der
// Interrupt-Service-Routine (ISR)
volatile int8_t altAB = 0;
volatile int encoderWert = 0;

// Die beiden Schritt-Tabellen für volle oder 1/4-Auflösung
// 1/1 Auflösung
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/4 Auflösung
int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};

float anzeigewert=0;
bool enc_change=false;

const int buttonNull = 5; //Null Botton

float finc=0;


/*************************************************************
*
* Interrupt Service Routine
*
* Wird aufgerufen, wenn der entsprechende Interrupt
* ausgelöst wird
*
*************************************************************/
ISR(TIMER1_COMPA_vect) {
  altAB <<= 2;
  altAB &= B00001100;
  altAB |= (digitalRead(encoderA) << 1) | digitalRead(encoderB);
  encoderWert += schrittTab[altAB];
}


/*************************************************************
*
* void setup()
*
* Wird einmal beim Programmstart ausgeführt
*
*************************************************************/
void setup() {
  pinMode(encoderA, INPUT);
  pinMode(encoderB, INPUT);

  noInterrupts(); // Jetzt keine Interrupts
  TIMSK1 |= (1<<OCIE1A);  // Timer 1 Output Compare A Match Interrupt Enable

  TCCR1A = 0; // "Normaler" Modus

  // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
  //        Stimmen OCR1A und Timer überein, wird der Interrupt
  //        ausgelöst
  // Bit CS12 und CS10 setzen = Vorteiler: 1024
  TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);

  // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz
  // Überlauf bei 14, weil die Zählung bei 0 beginnt
  OCR1A = 14;

  interrupts(); // Interrupts wieder erlauben

  pinMode(buttonNull, INPUT);  //Null Botton for Input
  Serial.begin(9600);
}


/*************************************************************
*
* void loop()
*
* Wird immer wieder durchlaufen
*
*************************************************************/
void loop() {
if (digitalRead(buttonNull)){
      anzeigewert=0;
      enc_change=true;
      delay(50);
     }


if (encoderWert==1) {
            finc=0.01;
            enc_change=true;}
else if (encoderWert>=2 && encoderWert< 3){
             finc=0.1;
             enc_change=true;}
else if (encoderWert>=3 && encoderWert< 6){
            finc=1;
            enc_change=true;}
else if (encoderWert>=6){
            finc=10;
            enc_change=true;}
    //---------------------------------------------------------
else if (encoderWert==-1) {
            finc=-0.01;
            enc_change=true;}
else if (encoderWert<=-2 && encoderWert> -3) {
            finc=-0.1;
            enc_change=true;}
else if (encoderWert<=-3 && encoderWert> -6) {
            finc=-1;
            enc_change=true;}
else if (encoderWert<=-6){
            encoderWert=0;
            finc=10;
            enc_change=true;}

if (enc_change) {
            anzeigewert+=finc;
            Serial.print(anzeigewert);
            Serial.print("  ");
            Serial.print(encoderWert);
                 }
encoderWert=0;
finc=0;
enc_change=false;
delay(50);
}

Ich hoffe ich bekomme ihn nicht um die Ohren gehauen aber für Verbesserungen habe ich immer ein offenes Ohr!

Gruß Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.11.2015, 09:59
Beitrag #46
RE: Pins am Drehregler (Rotary Encoder)
Ich habe den code nun am Leonardo probiert, aber bekomme keine Reaktion. Serielle Ausgabe kommt keine
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.11.2015, 10:59
Beitrag #47
RE: Pins am Drehregler (Rotary Encoder)
Hallo Noxx, ein bisschen Code , eine Schaltskizze oder wenigstens ein Foto wie du ihn abgeklemmt hast, würde sehr helfen.
Ansonsten stehen wir vor dem berühmten Heuhaufen ...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.11.2015, 19:04
Beitrag #48
RE: Pins am Drehregler (Rotary Encoder)
Da der Post von Noxx ein Crossposting ist, hat er wohl nicht gemerkt, dass er im falschen Forum ist..

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Uno gehen zwei digital Pins nicht edlosijagen 15 592 07.07.2016 19:22
Letzter Beitrag: Bitklopfer
  mehr PWM Pins WIMunios 8 1.119 20.03.2016 00:19
Letzter Beitrag: hotsystems
  Welche Pins für Software Serial BennIY 1 504 27.01.2016 23:02
Letzter Beitrag: hotsystems
  Mit Rotary Encoder Tastatur simulieren? noxx 9 1.477 17.11.2015 17:18
Letzter Beitrag: Binatone
  Wie viele PINs werden für LCD 2x16 benötigt? torsten_156 4 1.337 05.02.2015 09:11
Letzter Beitrag: xuino
  Belastbarkeit des +5Volt Pins Kyrill 2 1.257 16.01.2015 06:33
Letzter Beitrag: Kyrill
  I²C Pins "verlegen" Marcel5291 2 1.224 18.11.2014 15:18
Letzter Beitrag: rkuehle
  Frage zu motorshield und PINs torsten_156 9 4.897 27.10.2014 15:53
Letzter Beitrag: torsten_156
  Arduino Due: pins mit 5V ?? pins 22-24, 50-53? HaWe 1 1.892 27.10.2014 13:19
Letzter Beitrag: Bitklopfer
  LCD Shield & 4Kanal Relais Shield gleiche Pins hannes77 3 1.676 04.06.2014 00:25
Letzter Beitrag: ArduTux

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste