Gast
#4763695
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