Problema de velocidad o sincronización con motor a alta velocidad

Saludos

Este es mi primer tópico así que saludos a todos. Tenemos un proyecto de un motor con tres bobinas que hace girar un rotor con 12 imanes. A baja velocidad todo va bien pero cuando alcanza unas 100 RPM empieza a frenarse. No se porque no alcanza más velocidad. O el código no traduce los ticks de manera correcta (no creo porque a baja velocidad va bien), o el arduino no puede alcanzar a leer y disparar las bobinas lo suficientemente rápido. No se, porque son 2048 ticks del encoder y 36 pulsaciones de las bobinas por revolución, por lo que no debería de tener problemas. Lo que pienso es que el código no está bien depurado ya que soy muy novato con esto de la programación. Os dejo el código por si alguien pudiese ayudarme:

/* read a rotary encoder with interrupts
Encoder hooked up with common to GROUND,
encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
it doesn't matter which encoder pin you use for A or B

uses Arduino pullups on A & B channel outputs
turning on the pullups saves having to hook up resistors
to the A & B channel outputs

*/
#include <digitalWriteFast.h>;

#define encoder0PinA 2 // Definimos pines de entrada (Canal A y B del encoder y el potenciometro)
#define encoder0PinB 4
#define potpin 2
#define bobina1 13 // Definimos pines de salida (tres bobinas)
#define bobina2 12
#define bobina3 8

volatile unsigned long _Grados = 20; // Variable _Grados que traduce los ticks del encoder a 360
volatile unsigned long encodertick = 0; // Variable para contar los ticks del encoder
volatile unsigned long contador = 0; // Contador para detectar los cambios en grados
unsigned int dur; // Duración del pulso en grados
unsigned int durAnt;
volatile unsigned long disparador = 20; // Disparador de las bobinas

void setup() {

Serial.begin(9600);
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
pinMode(bobina1, OUTPUT);
pinMode(bobina2, OUTPUT);
pinMode(bobina3, OUTPUT);

attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2
Serial.println ("Hasi");
}

void loop(){

if (disparador > 29){ // Limita el disparador a 30 grados
disparador=0;
}
if (_Grados>contador){ // Si se mueve un grado aumenta disparador
disparador++;
contador=_Grados;
}

if ((disparador < 0+dur) && (disparador > 0)){ // Si esta entre los grados 0-10 disparar bobina2
digitalWriteFast(bobina2, HIGH);
}
else
if ((disparador < 10+dur) && (disparador > 10)){ // Si esta entre los grados 10-20 disparar bobina3
digitalWriteFast(bobina3, HIGH);
}

else

if ((disparador < 20+dur) && (disparador > 20)){ // Si esta entre los grados 20-30 disparar bobina1
digitalWriteFast(bobina1, HIGH);
}
else{
digitalWriteFast(bobina1, LOW);
digitalWriteFast(bobina2, LOW);
digitalWriteFast(bobina3, LOW);
}

if (encodertick > 2046){ // Resetea el contador de ticks cada revolucion
encodertick = 0;
contador=0;
disparador=0;
_Grados = 0;

}

}

void doEncoder() {
/* If pinA and pinB are both high or both low, it is spinning

  • forward. If they're different, it's going backward.
  • For more information on speeding up this process, see
  • [Reference/PortManipulation], specifically the PIND register.
    */
    _Grados=encodertick;
    _Grados=map(_Grados, 0, 2047, 0, 359);

if (digitalReadFast(encoder0PinA) == digitalReadFast(encoder0PinB)) {
encodertick++;
} else {
encodertick--;
}

}

Espero que alguien pueda ayudarme. Muchas gracias!