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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.