velocidade encoder incremental

Eai galera beleza? estou com um problema em eu codigo. O codigo abaixo eu uso para calcular a velocidade de rotação em rpm de um motor qualquer. Utilizando a função flexitimer, consigo calcular certo para 100ms, porém para menos que isso não rola. Não sei qual é o problema, acredito que seja na função do tempo. Estou usando um arduino mEGA

//#include <MsTimer2.h>
#include <FlexiTimer2.h>
float rpm;
unsigned long time;
const float pi = 3.14159265359;
long counter = 0; //This variable will increase or decrease depending on the rotation of encoder
float aux = 0.0062831853, x1 = 0, x2 = 0, ts = 0.1, wc = 10, theta = 0, x1p = 0, x2p = 0;
float a = -tswcwc, b = (1-2tswc), c = tswcwc, aux1 = 0;
void setup() {
Serial.begin (115200);
//Setting up interrupt
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);

//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
//MsTimer2::set(10, flash); // 500ms period
//MsTimer2::start();
FlexiTimer2::set(100, flash);
FlexiTimer2::start();

}
void flash()
{


//svf
theta = counteraux; //converto pulsos em radianos. aux = 2pi/1000
// filtro de variavel de estado
x1 = x1p + ts
x2p;
x2 = ax1p + bx2p + ctheta;
x1p = x1;
x2p = x2;

rpm = x2
30/pi;
Serial.println(rpm);

}
void loop() {
}
//
void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;
}else{
counter–;
}
if(counter> 1000){counter=0; x1p = x1p -2pi; }
if(counter<-1000){counter=0; x1p = x1p +2
pi; }
//Serial.println(counter);
}
void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(2)==LOW) {
counter–;
}else{
counter++;
}
if(counter> 1000){counter=0; x1p = x1p -2pi; }
if(counter<-1000){counter=0; x1p = x1p +2
pi; }
//Serial.println(counter);
}

Se você realmente espera conseguir alguma ajuda, deveria postar em inglês, ou no sub fórum de português.

Uau... alguém está com uma pedra no sapato...

Uma coisa que eu vejo aí que não gosto é o facto de implementares o envio série nas rotinas de cálculo da velocidade.

A velocidade está numa variável global, logo devias fazer o print dentro da função loop() com um laço millis() (vé o blink without delay.

Porque é que as funções para calcularem os pulsos envolvem cálculos com float? A interrupção deve ser o mais rápido possível. Para incrementar a velocidade, seria ideal não usares a função digitalRead(), ler os pinos directamente seria mais rápido.

No entanto, eu não percebi muito bem o problema...