Forum: Mikrocontroller und Digitale Elektronik quadrature encoder noch schneller auslesen?


von chrys (Gast)


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

von m.n. (Gast)


Angehängte Dateien:

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.

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.