hola jdrm,
te dejo un tacometro que hice para mi coche que esta comprobado y funciona muy bien.Tambien te digo que lo hice para un diesel pero cambiando unas variables funcionara perfectanmente.
/frecuencia del cristal=16mhz
T=1/f = 62.5ns
overflow=62.5x2^16-1=65535prescaler64=0,26214seg=262ms
cada pulso seria 62,5*64=4us
tiene que estar entre 5ms y 130ms para no haber desbordamiento.
activo timer1;
*/
unsigned long Rpm;
unsigned long Ticks;
unsigned long Overflow;
int dis1; // display 1
int dis2; // display 2
int dis3; // display 3
int dis4; // display 4
int display1[10]={63,6,91,79,102,109,125,7,127,111}; //array con los 10 numeros en base 10 ya calculados
int display2[10]={191,134,219,207,230,237,253,135,255,239}; //array con los 10 numeros en base 10 ya calculados
int display3[10]={63,6,91,79,102,109,125,7,127,111}; //array con los 10 numeros en base 10 ya calculados
int display4[10]={63,6,91,79,102,109,125,7,127,111}; //array con los 10 numeros en base 10 ya calculados
const int latchPin=4;
const int dataPin=7;
const int clockPin=8;
void setup() {
cli(); // se desactivan las interrupciones
Serial.begin(9600);
EIMSK=1<<INT0; // elijo la interrupcion 0 externa es el pin2
EICRA=1<<ISC01 |1<<ISC00; // elijo en rising ( en flanco de subida)
TCNT1=0; //contador a cero del timer1
//registros del Timer1
TCCR1A=0;
TCCR1B=0;
TIMSK1=(1<<TOIE1); // se activa los registros por overflow
TCCR1B |= (1<<CS10); // sin prescaler
TIFR1=(0<<TOV1); //el flag a 0
Overflow=1; //contador de flag a 1
sei(); // se activan las interrupciones
}
void loop() {
//1 vuelta la conviertes en rpm
Rpm=(0.16/((2Overflow)+Ticks)(1+65535))*60; //teoricamente da 64000, es por el oscilador
dis1 = (Rpm%10); // unidades
dis2 = (Rpm%100)/10; // decenas
dis3 = (Rpm/100); // centenas
dis4 = (Rpm/1000); //millares
digitalWrite(latchPin,LOW);
shiftOut(dataPin, clockPin, MSBFIRST, display4[ dis4]);
shiftOut(dataPin, clockPin, MSBFIRST, display3[ dis3]);
shiftOut(dataPin, clockPin, MSBFIRST, display2[ dis2]);
shiftOut(dataPin, clockPin, MSBFIRST, display1[ dis1]);
digitalWrite(latchPin,HIGH);
Serial.println(Rpm);
//Serial.print("O: ");
//Serial.println((Overflow*65535)+Ticks);
}
ISR(INT0_vect)
{
Ticks=TCNT1; //vuelca el valor de contador en una variable
TCNT1=0; //pon el contADOR A CERO
//empieza a contar el contador timer 1 desde 0
Overflow=1;
}
ISR (TIMER1_OVF_vect)
{
Overflow++;
}
Surbyte , la leche, eres un maquina , lo encuentras todo, que alegria ,ajajja