lettura velocità motore encoder

Salve ragazzi,
sto pilotando un motore dc attraverso un ponte ad H e relativo PWM (a 4096 step con TLC5940).
Il motore è dotato di encoder con canale Z, per cui so ogni volta che l’albero compie un giro.

Ciò che voglio fare è fare accelerare il motore da 0 a 4096 e leggere contemporaneamente la velocità raggiunta.

L’ho realizzato nel seguente modo:

void setup()
{
  pinMode(sali, OUTPUT)
  pinMode(sigPin, INPUT);
  Serial.begin(9600);
  Tlc.init();
}


void loop()
{
  for (int i=0; i<4095; i++)
  {
   // analogWrite(sali, i);
   Tlc.set(channel, i);
   Tlc.update();
 
   c = 0;
     t = micros(); // read time at start of sampling
     for(s=0; s<100000; s++)
     { //take a number of samples
  	state = digitalRead(sigPin); //read state
  	if (state != oldstate)
        { //if state changes:
  	   c++; //increment counter
  	   oldstate = state; //and reset current state
  	}
    }
     t = micros() - t; //read time at end of sampling
     c = c/2; // need to divide by 2 because counter incremented on each change - two changes per cycle  
     f = 100000.00*c/t; //calculate frequency
     rpm=f*60;
     omega=(2*pi*f);
     Serial.print("frequenza:");
     Serial.println(f);
     Serial.print("RPM:");  
     Serial.println(rpm );
     Serial.print("Omega:");  
     Serial.println(omega );
 }  
  delay(1000);
}

Con il secondo ciclo for (s) mi campiono le variazioni sul ch z dell’encoder.
Questo ciclo però ha effetti importanti sulla variazione della velocità del motore. Visto appunto l’elevato numero di campioni che
acquisisco si pass da 0 a 4096 in un tempo molto molto lento (minuti), io vorrei invece avere una rampa molto più veloce.

Esiste un modo efficace per monitorare il chz senza influenzare il tempo di variazione del pwm?

Grazie anticipatamente per l’aiuto e spero di essere stato chiaro.

Forse dovrei utilizzare una funzione esterna, o l'effetto sarebbe lo stesso? Spero in un vostro suggerimento.

punto primo non usare digitalRead che è lenta, usa le macro apposta (sbi e cli, cerca sul forum) il PWM NON viene influenzato da quello che fai nel loop, perchè usa gli interrupt, ma non so se la classe "Tlc" li usa. dovresti postare almeno un link alla libreria.

poi non so bene cosa vuoi fare, se per ogni Tlc.set(channel, i); vuoi 100000 acquisizioni non si scappa. ma se invece le 100000 acquisizioni le puoi fare indipendentemente, allora non fare il while ma usa direttamente il loop, o ancora meglio un interrupt, così sei sicurno di non farti scappare nessun cambio di stato (e non ti serve nemmeno la digitalRead() ).

ma poi non è più conveniente a questo punto leggere il numero di cambi di stato in un secondo (o anche meno, per esempio 100millisecondi) e poi moltiplicare per ottenere gli RPM? questo è il sistema usato normalmente

edit: attento! se usi un interrupt per leggere i segnali, e l'interrupt del PWM, potrebbe essere che l'interrupt di lettura abbia una priorità superiore a quello del PWM. quindi una funzione troppo lenta della lettura può influenzare il PWM. ma dato che la funzione di lettura è solo una istruzione di incremento, non dovresti mai avere questo problema.