Acondicionador de Señal de RPM

Hola a todos, voy a intentar desarrollar un tacómetro para un motor 22R de un vehículo de 1988 mediante un distribuidor con platino y un motor G16 de un vehículo de 1998, la información será visualizada mediante el puerto serie y posterior se implementara una LCD o displays.
El código por ahora es el de Nick Gammon Another frequency counter para medir la frecuencia y luego aplico la formula rpm = (frec*60)/2.

#include <Arduino.h>

// Frequency timer
// Author: Nick Gammon
// Date: 10th February 2012

// Input: Pin D2

volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
unsigned int val_RPM;

// here on rising edge
void isr () 
{
  unsigned int counter = TCNT1;  // quickly save it
  
  // wait until we noticed last one
  if (triggered)
    return;

  if (first)
    {
    startTime = (overflowCount << 16) + counter;
    first = false;
    return;  
    }
    
  finishTime = (overflowCount << 16) + counter;
  triggered = true;
  detachInterrupt(0);   
}  // end of isr

// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect) 
{
  overflowCount++;
}  // end of TIMER1_OVF_vect


void prepareForInterrupts ()
  {
  // get ready for next time
  EIFR = bit (INTF0);  // clear flag for interrupt 0
  first = true;
  triggered = false;  // re-arm for next time
  attachInterrupt(0, isr, RISING);     
  }  // end of prepareForInterrupts
  

void setup () 
  {
  Serial.begin(115200);       
  Serial.println("Frequency Counter");
  
  // reset Timer 1
  TCCR1A = 0;
  TCCR1B = 0;
  // Timer 1 - interrupt on overflow
  TIMSK1 = bit (TOIE1);   // enable Timer1 Interrupt
  // zero it
  TCNT1 = 0;  
  overflowCount = 0;  
  // start Timer 1
  TCCR1B =  bit (CS10);  //  no prescaling

  // set up for interrupts
  prepareForInterrupts ();   
  
  } // end of setup

void loop () 
  {

  if (!triggered)
    return;
 
  unsigned long elapsedTime = finishTime - startTime;
  float freq = F_CPU / float (elapsedTime);  // each tick is 62.5 ns at 16 MHz
  val_RPM = (freq*60)/2;
  
  Serial.print ("F: ");
  Serial.print (freq);
  Serial.print (" Hz. ");

  Serial.print ("RPM: ");
  Serial.println (val_RPM);
  // so we can read it  
  delay (500);

  prepareForInterrupts ();   
}   // end of loop

Hasta ahora creo que es lo mas fácil, ahora viene la parte mas trabajosa para mi, el hardware. Bien ahora e buscado proyectos relacionado a esto y tenemos diferentes formas de leer las revoluciones las revoluciones

  • Mediante el cable de bujía

  • Mediante la conexión en el primario de la bobina

lector_rpm_automovil 2.jpg

Bien ahora yo voy a utilizar la 2 debido a que ya tengo conexiones de fabrica dentro del vehículo. Entonces voy a utilizar el circuito que menciona @PeterKantTropus y @tauro0221 en el siguiente post problema con medición RPM. optoacoplador y nick gammon


Como inicio del desarrollo del tacómetro revisamos las conexiones o diagrama de la conexión y seria lo siguiente:
Diagrama_Conexion_Distribuidor.jpg
La resistencia sirve para evitar que se dañe el ruptor que se encuentra dentro del distribuidor.
Ahora con un osciloscopio capture las señales tanto en el + como el - de la bobina y estos son los resultados


Actualizare este hilo conforme vaya realizando avances.

Diagrama_Conexion_Distribuidor.jpg

Hola Swift.

Perdona mi ignorancia, pero siempre que veo en el foro de medir las RPM de un coche siempre se tiran por el método de la bobina.

No soy mecánico, y me niego a aprender mecánica (otro oficio más, que pereza), pero por tus post se que a ti si te gusta y es tu "rollo".

Y la pregunta es, ¿no disponen algunos alternadores de un terminal W donde se obtiene la señal sinouidal del alternador, que es proporcional en frecuencia a las rpm del motor? ¿No tendrá ese motor un alternador con esa señal? ¿No será esa señal de tensión menos peligrosa que la de la bobina?.

Hola victorjam.

¿no disponen algunos alternadores de un terminal W donde se obtiene la señal sinouidal del alternador, que es proporcional en frecuencia a las rpm del motor?

Si algunos alternadores tiene un terminal W especialmente estos los podemos encontrar mas en los vehículos con motores Diésel, hay que tomar en cuenta que la frecuencia que tenemos seria el doble o dependería de la relación que existe en entre la polea del cigüeñal con la del alternador pero si estas en lo correcto.

¿No tendrá ese motor un alternador con esa señal?

Lamentablemente no tiene este terminal, revise en 3 motores diferentes y en ninguno tiene esta terminal, uno directamente tiene un sensor en el cigüeñal y el otro toma la señal para el tacómetro de la bobina el cual tiene un sensor inductivo en el distribuidor.

¿No será esa señal de tensión menos peligrosa que la de la bobina?.

Claro pero seria una buena opción, se podría desarmar y soldar un cable.

Hola a todos, realice la prueba del siguiente circuito:


Ahora tenemos el siguiente resultado:

La señal de color azul azul es la entrada al circuito la señal desde el negativo de la bobina, y la señal amarilla es la salida hacia el microcontrolador.
Ahora al momento de realizar las lecturas en el Arduino obtengo los siguientes resultados:

F: 145.22 Hz. RPM: 4356.000
F: 27.72 Hz. RPM: 831.000
F: 148.20 Hz. RPM: 4446.000
F: 27.16 Hz. RPM: 814.000
F: 153.14 Hz. RPM: 4594.000
F: 26.81 Hz. RPM: 804.000
F: 145.56 Hz. RPM: 4366.000
F: 27.03 Hz. RPM: 810.000
F: 146.61 Hz. RPM: 4398.000
F: 148.07 Hz. RPM: 4442.000
F: 149.52 Hz. RPM: 4485.000
F: 146.56 Hz. RPM: 4396.000
F: 148.10 Hz. RPM: 4442.000
F: 148.76 Hz. RPM: 4462.000
F: 27.17 Hz. RPM: 815.000
F: 154.69 Hz. RPM: 4640.000
F: 26.71 Hz. RPM: 801.000
F: 147.35 Hz. RPM: 4420.000
F: 149.46 Hz. RPM: 4483.000
F: 27.13 Hz. RPM: 813.000
F: 146.35 Hz. RPM: 4390.000
F: 27.17 Hz. RPM: 815.000
F: 149.05 Hz. RPM: 4471.000
F: 26.76 Hz. RPM: 802.000
F: 147.67 Hz. RPM: 4430.000
F: 27.09 Hz. RPM: 812.000
F: 147.68 Hz. RPM: 4430.000
F: 152.22 Hz. RPM: 4566.000
F: 27.18 Hz. RPM: 815.000
F: 154.46 Hz. RPM: 4633.000
F: 27.13 Hz. RPM: 813.000
F: 149.32 Hz. RPM: 4479.000
F: 26.62 Hz. RPM: 798.000

en donde el valor correcto seria 27.72Hz. RPM: 831, en donde lo que se me esta pasando por la mente para que cause estos resultados es que al circuito lo tengo armado en una protoboard. O ustedes tiene alguna otra idea para que este causando estas lecturas.

¿En la salida del osciloscopio ves cosas raras en la salida de Arduino?, observa varios pulsos de las RPM si no salen varios pulsos por uno de cada bobina, tiene pinta de que el cable de la salida del opto al pin d2 del arduino está haciendo cosas raras.

Para mejorar la señal de salida del opto pondria un 74hc14.

¿vitara_4.png? Es un viti? Creia que el 22r era de los totoyas.

Te falta un diodo en antiparalelo entre bornes del led del optoacoplador.
Algo que bloquearía ese sobrepico que se ve cuando se va a casi 30V.
Creo que ese sobrepico es el que te esta generando la lectura de 4430Hz.

De todos modos hacia el micro aparenta salir limpio lo que me llama la atención.
No entiendo porque lees cosas raras pero viendo la señal del Osciloscopio la explicación que encuentro es la que te doy.

Coloca las puntas del osciloscopio entre bornes del led del OPTO que es lo que en definitiva te importa.
Y también lo que se ve del otro lado o sea lo que sale a la interrupción del microcontrolador.

¿vitara_4.png? Es un viti? Creia que el 22r era de los totoyas.

Si es un Viti, no pude realizar las pruebas en el otro ya que lo estaban ocupando.
Bueno puse el diodo en antiparalelo entre bornes del led del optoacoplador y la punta del osciloscopio y tengo la siguiente señal la cual es en color azul y en color amarillo la señal la salida que va al microcontrolador.

Los lecturas obtenidas son las siguientes:

Freq:  20.0 RPM:   598
Freq: 137.2 RPM:  4116
Freq:  20.9 RPM:   626
Freq:  20.9 RPM:   627
Freq:  20.6 RPM:   617
Freq:  20.9 RPM:   627
Freq:  20.8 RPM:   623
Freq:  21.0 RPM:   631
Freq:  21.1 RPM:   632
Freq:  20.6 RPM:   616
Freq:  20.8 RPM:   625
Freq:  20.3 RPM:   609
Freq:  21.0 RPM:   631
Freq:  21.1 RPM:   632
Freq:  20.6 RPM:   616
Freq: 137.5 RPM:  4123
Freq:  20.8 RPM:   625
Freq:  20.3 RPM:   609
Freq:  21.0 RPM:   631
Freq:  21.1 RPM:   632
Freq:  20.6 RPM:   616
Freq:  20.8 RPM:   625
Freq:  20.3 RPM:   609
Freq:  20.8 RPM:   623
Freq:  20.5 RPM:   614
Freq:  20.4 RPM:   611
Freq:  20.6 RPM:   619
Freq:  20.7 RPM:   620

Todavía tengo una que otra lectura 137.5 Hz aproximadamente pero en comparación a las que daba en principio es algo que esta funcionando para leer las RPM en el G16.

Ahora para el 22R por el platino obtengo las siguientes lecturas en color azul las que esta conectada en la entrada del optoacoplador, y en las de color amarillo las que están en la salida del optoacoplador en esta si esta claro porque esta dando esas las lecturas:

Las lecturas obtenidas son las siguientes:

Freq: 646.1 RPM: 19382
Freq:  44.4 RPM:  1332
Freq: 128000.0 RPM: -26624
Freq: 807.1 RPM: 24213
Freq:  51.2 RPM:  1534
Freq:  47.5 RPM:  1425
Freq:  45.7 RPM:  1371
Freq: 967.2 RPM: 29017
Freq:  41.0 RPM:  1229
Freq:  43.2 RPM:  1297
Freq: 129032.3 RPM:  4343
Freq: 660.8 RPM: 19823
Freq:  44.1 RPM:  1324
Freq: 129032.3 RPM:  4343
Freq: 819.5 RPM: 24583
Freq: 919.8 RPM: 27594
Freq:  47.3 RPM:  1419
Freq:  45.9 RPM:  1378
Freq:  44.1 RPM:  1322
Freq:  44.8 RPM:  1343
Freq:  49.1 RPM:  1473
Freq:  46.4 RPM:  1392
Freq: 1099.3 RPM: -32558
Freq: 955.1 RPM: 28651
Freq: 830.5 RPM: 24914
Freq:  45.7 RPM:  1370
Freq: 639.3 RPM: 19178

Hi,
La senal que va al opto tiene unos picos al final. Si estas usando interrupt esto te puede causar disparos falsos. Trata de filtralos usando un condensador como de 0.1uf entre los pines 3 y 4 del opto. Dependiendo lo puedes aumentar o disminuir.

Ahora está más que claro, hay un pequeño ruido en la señal.

Esta es mi propuesta de modificación:

acondicionador.png

Primero probar poniendo el condensador C2 como bien ha dicho #Tauro, y con varios valores diferentes: 1nf, 10nf etc.

Segundo colocaría un 74HC14 que es un inversor trigger schmitt, dado que los optos se van a comportar de manera "lineal" la señal de salida no va a ser una onda cuadrada pura.

La resistencia R3, pull-up del optoacoplador la aumentaría de tamaño a unos 10K al menos. Eso depende de la corriente que vaya a circular por el opto.

Jugaria un poco con los valores de R1 y C1, aumentado el valor de la resistencia hasta 1k y el valor del condesador a 10nF.

No sé si el diodo D3 sería viable y si tendría efecto alguno para evitar picos cuando la bobina se desenergiza.

Obviamente todas las pruebas con el osciloscopio a mano.

acondicionador.png

Pregunto: no hemos debatido este tema antes y llegado a la conclusión que es mucho mejor un acople inductivo/capacitivo al cable de alta tensión?

Dudo que pueda usarse como tacometro, la señal esta muy filtrada. hay que recordar que el motor esta a unos 800 RPM, cuando el motor este a 5000 o mas, se tendrá un continuo. Hay que trabajar para que el optoaclopador sature solo en la zona de caída exponencial.

Es mas, te recomendaría revisar la luz de platinos y el resorte, mas de la mitad del ciclo esta abierto, probablemente tiene una luz de platino excesiva . El ultimo pico, es probable que se deba al cierre del platino.

surbyte:
Pregunto: no hemos debatido este tema antes y llegado a la conclusión que es mucho mejor un acople inductivo/capacitivo al cable de alta tensión?

Si es mucho mejor, pero lo deje como segunda opción debido a que ya hay una instalación original en el ramal original del vehículo, por eso es la segunda opción.

PeterKantTropus:
Es mas, te recomendaría revisar la luz de platinos y el resorte, mas de la mitad del ciclo esta abierto, probablemente tiene una luz de platino excesiva . El ultimo pico, es probable que se deba al cierre del platino.

Si el problema es que la leva que acciona al platino esta desgastada, el platino es nuevo, ya los años le esta pasando factura jajajaj. No seguí realizando pruebas debido a que cambie el distribuidor de platinos a uno con sensor inductivo nuevo con un modulo de encendido chevrolet dejo imagen por si alguien le intereza.

Ahora con osciloscopio obtengo estos resultados.

Hi,
De donde esta senal las estas conectanto. Viene de la unida de control electronica.

La señal que esta en el post anterior esta conectado en el terminal negativo de la bobina, pero estaba pensando en sacar la señal directamente del sensor mas o menos esta seria la señal