Hola, esta es la señal que me dá el oscilospio en el pin de rpm de la ecu de mi coche, cuando suben las rpm aumenta la frecuencia, quería saber si conocéis alguna manera de leer las rpm desde este cable con arduino, no quiero que hagáis el trabajo por mi solo que me orientéis un poco, ya modifique muchos sketch de interrupciones pero no consigo nada que las marque como es debido, muchas gracias.
Un saludo.
Puedes utilizar el código que proporciona Nick Gammon para medir la frecuencia y transformas esta frecuencia a RPM, el voltaje que te esta marcando apenas es de 1.35v puede que no sea suficiente como para detectar un 1 lógico pero mejor espera a que alguien mas te responda, no estoy muy seguro de esto.
// Frequency timer using input capture unit
// Author: Nick Gammon
// Date: 31 August 2013
// Input: Pin D8
volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect)
{
overflowCount++;
} // end of TIMER1_OVF_vect
ISR (TIMER1_CAPT_vect)
{
// grab counter value before it changes any more
unsigned int timer1CounterValue;
timer1CounterValue = ICR1; // see datasheet, page 117 (accessing 16-bit registers)
unsigned long overflowCopy = overflowCount;
// if just missed an overflow
if ((TIFR1 & bit (TOV1)) && timer1CounterValue < 0x7FFF)
overflowCopy++;
// wait until we noticed last one
if (triggered)
return;
if (first)
{
startTime = (overflowCopy << 16) + timer1CounterValue;
first = false;
return;
}
finishTime = (overflowCopy << 16) + timer1CounterValue;
triggered = true;
TIMSK1 = 0; // no more interrupts for now
} // end of TIMER1_CAPT_vect
void prepareForInterrupts ()
{
noInterrupts (); // protected code
first = true;
triggered = false; // re-arm for next time
// reset Timer 1
TCCR1A = 0;
TCCR1B = 0;
TIFR1 = bit (ICF1) | bit (TOV1); // clear flags so we don't get a bogus interrupt
TCNT1 = 0; // Counter to zero
overflowCount = 0; // Therefore no overflows yet
// Timer 1 - counts clock pulses
TIMSK1 = bit (TOIE1) | bit (ICIE1); // interrupt on Timer 1 overflow and input capture
// start Timer 1, no prescaler
TCCR1B = bit (CS10) | bit (ICES1); // plus Input Capture Edge Select (rising on D8)
interrupts ();
} // end of prepareForInterrupts
void setup ()
{
Serial.begin(115200);
Serial.println("Frequency Counter");
// set up for interrupts
prepareForInterrupts ();
} // end of setup
void loop ()
{
// wait till we have a reading
if (!triggered)
return;
// period is elapsed time
unsigned long elapsedTime = finishTime - startTime;
// frequency is inverse of period, adjusted for clock period
float freq = F_CPU / float (elapsedTime); // each tick is 62.5 ns at 16 MHz
Serial.print ("Took: ");
Serial.print (elapsedTime);
Serial.print (" counts. ");
Serial.print ("Frequency: ");
Serial.print (freq);
Serial.println (" Hz. ");
// so we can read it
delay (500);
prepareForInterrupts ();
} // end of loop
No alcanza esa tensión, la va a tener que amplificar.
Según la hoja de datos el voltaje para nivel alto tiene que ser superior a 0.6 * Vcc, o sea, para 5V de alimentación el pulso debería ser de al menos 0.6*5= 3V
Saludos
Hay varias formas de hacerlo (no aisladas y aisladas) pero hay que pensar en aquella que no altere la ECU por sobre todas las cosas.
No aisladas:
-
Una forma simple sería con un AO (amplificador Operacional) que tenga un umbral en digamos 1V y cuando algo supere dicho valor cambia de estado, con lo que va a reproducir fielmente lo que tengas como señal de la ECU.
Un LM339 es un ejemplo pero hay que calcular la red de resistores sea como inversor o no inversor. -
Un transistor también sería buena elección sin ofrecer aislación, pero es para considerar por su simpleza.
Aisladas:
Con un optoacoplador que solo tome 1mA por ejemplo podrías tener un sistema aislado de la ECU que proporcione pulsos limpios. Hay algunas modelos de optos que lo harían sin problemas.
Muchas gracias a todos, creo que el osciloscopio no marca bien el voltaje ya que si conecto el voltimetro marca 4.99v, voy a probar con ese codigo a ver si funciona
Bueno antes que nada daros las gracias a todos el código de Nick Gammon funciona perfectamente, marca la frecuencia exactamente como el osciloscopio, mira que no probé códigos de leer rpm y todos me fallaban muchísimo..., No voy a pasar las frecuecia a rpm ya que lo que quiero es hacer un tipo de launch control, voy a mirar la frecuencia a x rpm y si la frecuencia es más alta de x que corte el encendido y si es más baja que lo vuelva activar, para hacer el corte de encendido estoy usando un par de relés, uno corta la alimentación de la bobina de dos cilindros y la otra de los otros dos, los reles funcionan perfectamente, pero quería saber si hay algun dispositivo o relés de estado sólido para mayor duración y poder activarlos más rápido, voy a mirar si puedo modificar el código para que en vez de leer la frecuencia cada medio segundo lo puedo hacer en menos tiempo para hacer los cortes de encendido mas seguidos y a ver si al meter los códigos de activacion del relé no me cargo el perfecto funcionamiento de código original.
Buenas David, me interesa tu proyecto. Podrias decirme como obtuviste ese pin en la ecu? Muchas gracias.