Sincronizzazione variabile tra encoder e motore passo-passo

Buongiorno!
Sto cercando di realizzare una sorta di sincronizzazione tra un motore a spazzole ed un motore passo-passo e per il momento funziona solo per multipli tra passi rilevati dall'encoder (40 passi/giro montato sul motore a spazzole... che diventeranno almeno 400) ed i microstep del motore (400/800/1600, ecc).

Il codice del programma l'ho recuperato in internet e ho semplicemente aggiunto in while un ciclo for che per ogni passo rilevato dall'encoder fa fare un certo numero di passi al motore passo-passo. Tutto funziona bene, ma avrei la necessità di non lavorare con gli interi... l'obbiettivo sarebbe quello di far fare, ad esempio, 4 passi al motore passo-passo per ogni 3 passi rilevati dall'encoder (questo rapporto sarà variabile).

Avevo pensato ad un sistema che contasse gli impulsi dell'encoder ed ogni tot mandasse un impulso al motore passo-passo, ma le mie conoscenze non sono così approfondite...

Mi potreste dare uno spunto per capire quale funzione/procedura potrei utilizzare?

Grazie in anticipo!

/*  Digital Pin 2 accepts external interrupts. Pin1 of a rotary encoder
    is attached to DigitalPin2. An interrupt routine will be called
    when pin1 changes state, including noise.
    This will be made more efficient with hardware debouncing.
    */
int pin1 = 2;
int pin2 = 3;
long counter;
boolean goingUp = false;
boolean goingDown = false;

//parte relativa al motore
const int Enable = 6;         // pin enable (blu)
const int Direzione = 7;      // pin direzione (verde)
const int Pulsazione = 8;     // pin pulsazione (grigio)

int sync = 20;

void setup()
{
  counter = 0;
  //Serial prints for debugging and testing
  Serial.begin(9600);

/* Setup encoder pins as inputs */
    pinMode(pin1, INPUT); // Pin 2
    pinMode(pin2, INPUT); // Pin 4 

// encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, decoder, FALLING);

//parte relativa al motore
  pinMode(Enable, OUTPUT);        //pin 6
  pinMode(Direzione, OUTPUT);     //pin 7
  pinMode(Pulsazione, OUTPUT);    //pin 8

  pinMode(Enable, OUTPUT);        //pin 6
  pinMode(Direzione, OUTPUT);     //pin 7
  pinMode(Pulsazione, OUTPUT);    //pin 8


  digitalWrite(Enable, LOW);      //acceso
  
}

void loop()
{
//using while statement to stay in the loop for continuous
//interrupts
while(goingUp==1) // CW motion in the rotary encoder
{
goingUp=0; // Reset the flag
counter ++;

  for(int i=0;i<sync;i++){
  digitalWrite(Direzione, LOW);
  digitalWrite(Pulsazione, HIGH);
  digitalWrite(Pulsazione, LOW);
  delayMicroseconds(350);

  }


Serial.println(counter);


}

while(goingDown==1) // CCW motion in rotary encoder
{
goingDown=0; // clear the flag
counter --;


  for(int i=0;i<sync;i++){
  digitalWrite(Direzione, HIGH);
  digitalWrite(Pulsazione, HIGH);
  digitalWrite(Pulsazione, LOW);
  delayMicroseconds(350);

  }
Serial.println(counter);
}
}

void decoder()
//very short interrupt routine 
//Remember that the routine is only called when pin1
//changes state, so it's the value of pin2 that we're
//interrested in here
{
if (digitalRead(pin1) == digitalRead(pin2))
{
goingUp = 1; //if encoder channels are the same, direction is CW
}
else
{
goingDown = 1; //if they are not the same, direction is CCW
}
}