quadrature encoder noch schneller auslesen?

Gast #4763695
Lesenswert?
• ▲
▼
Hallo zusammen

Ich habe auf einem atmega64 6 PID controller laufen. Die regeln je einen 
DC-Motor. Dies tut soweit ganz gut aber das Auslesen der ABI Signale der 
Encoder dauert. Dies geschieht mittels Polling in einer Timer ISR mit 
momentan max. 20kHz. Jetzt möchte ich aber 10 controller auf einem 
atmega128 laufen lassen und mache mir sorgen, dass es dann nicht mehr 
reicht und ich die Frequenz weiter senken muss und dann laufe ich Gefahr 
Flanken zu verpassen.

Meine Timer ISR schaut im Moment so aus (weiter unten), einfach das 
Ganze x6...

Bis jetzt habe ich leider nichts schnellers gefunden und hoffe jemand 
kann mir da weiter helfen!

Vielen Dank schon im Voraus und sorry für den hässlichen Code.
Bin natürlich auch dankbar wenn jemand bessere Varianten kennt!

Gruss Chrys

----ISR----
static uint8_t AB1 = 0;
static uint8_t AB_alt1 = 0;

AB_alt1 = AB1;
AB1 = 0;
AB1 |=  ( ( (!!(pinEncA_A & (1<<EncA_A))) << 1 ) | ( (!!(pinEncA_B & 
(1<<EncA_B))) << 0 ) ); // AB = 0b000000AB

if(AB1 != AB_alt1)
{
AB_alt1 = AB_alt1 << 2; //0b0000ab00 (ab = AB_alt)
AB_alt1 = AB_alt1 | AB1; //0b0000abAB

  switch(AB_alt1)
  {
  case 0b00000111: //1000 0001 0111 1110
    position1++;
    break;
  case 0b00000001:
    position1++;
    break;
  case 0b00001110:
    position1++;
    break;
  case 0b00001000:
    position1++;
    indexx = indexx + (!!(pinEncA_I & (1<<EncA_I)));
    break;
  case 0b00001011: //0100 0010 1011 1101
    position1--;
    break;
  case 0b00000010:
    position1--;
    break;
  case 0b00001101:
    position1--;
    break;
  case 0b00000100:
    position1--;
    indexx = indexx - (!!(pinEncA_I & (1<<EncA_I)));
    break;
  } //Switch case
Gast #4763802
Lesenswert?
• ▲
▼
Ich hatte mal etwas für 4 Kanäle gemacht. 'neuer_wert' besteht aus 4 x 2 
Bit der Phasen A und B. Man kann gut erkennen, daß 4 x in etwa die 
gleiche Auswertung verwendet wird. Nur so als Möglichkeit.

Am besten packst Du das direkt in die ISR des Timers.
Noch schneller läuft es, wenn man es in Assembler schreibt.
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.