Boost Low Voltage Signal

Hello everyone, doing my first major Arduino project and I ran into a problem I need some help with.

I'm trying to read the tachometer signal in my car. I found a thread here with someone who was doing the same thing so I followed the same steps.

Here is the thread:
http://forum.arduino.cc/index.php?topic=123400.0

Here is a picture of the signal he got coming from the tach wire:

Here is the circuit that was devised to boost the signal and read it:

I replicated everything, but my Arduino couldn't read the pulses. I thought maybe my signal was too low, so I used my DMM to read the Vrms of my tach signal and it hovers around 0.14V. This looks like the problem to me, since his voltages were much higher.

I already have the circuit pictured above, so can anyone help me figure out what to add/alter to boost the signal? I was thinking maybe feed the signal to an Op-Amp and connect Vout to my existing circuit? Anyways, thanks in advance for helping!

Side note: Arduino is powered via a 9v supply, which I think may matter.

Note that the Vrms is low because the duty cycle is low. The actual pulse value is Vrms/duty cycle, so low voltage is probably not your problem.

What are the high and low voltages? Rember you can't feed the chip -ve voltages.

Mark

I've been trying to track down a o-scope all day, but no luck.

I did find a fancier DMM though which is supposed to be able to find peak values of waves. I'm going to try and take some readings again later today. Is there anything I should be looking for specifically?

I can also give these values if they'll help: RPM, Duty Cycle, Pulse Length, Pulses per Revolution

Note: I meant to post this in the General Electronics forum, not sure how it got in Project Guidance... Sorry mods, please move if it needs to be.

I'm trying to read the tachometer signal in my car. I found a thread here with someone who was doing the same thing so I followed the same steps.

Do you have the same car?

Here is a picture of the signal he got coming from the tach wire:

He's got channel 1 set to 2V and channel 2 set to 500mV. I assume that's a 2V signal on channel 1.

When dealing with unknown signals, it's a good idea to add a pair of [u]protection diodes[/u] and a resistor to the Arduino input.

A [u]comparator[/u] is one way to turn a "random level" signal into a nice 5V pulse. If you replace the voltage-divider resistors with a pot you can make a variable comparator.

But, it's probably best to use an analog input. That way, you can set the high/low thresholds in software (essentially make a software comparator).

In fact, it might be a good idea to connect an analog input and just "take some readings". You should be able to get a good idea of the high & low readings/voltages. (And, I suggest using the protection diodes in case you have a 12V pulse.)

I did find a fancier DMM though which is supposed to be able to find peak values of waves. I'm going to try and take some readings again later today. Is there anything I should be looking for specifically?

The peak may not help either... If you look at the oscilloscope image, you'll see voltage spikes on the rising & falling edges that are much higher than the "high" pulse voltage.

DVDdoug:
But, it’s probably best to use an analog input. That way, you can set the high/low thresholds in software (essentially make a software comparator).

In fact, it might be a good idea to connect an analog input and just “take some readings”. You should be able to get a good idea of the high & low readings/voltages. (And, I suggest using the protection diodes in case you have a 12V pulse.)

I really like this idea. I’ll connect to an analog pin and try to establish a good “peak” value. Once I do, this is the code I was thinking of using:

int getRPM() {
    rawVolts = analogRead(tachPin) * (0.00488);
    pulseLength = millis();
    
    while (rawVolts < PEAK)
    {
      rawVolts = analogRead(tachPin) * (0.00488);
      pulseLength = millis();
    }
    while (rawVolts >= PEAK)
    {
      rawVolts = analogRead(tachPin) * (0.00488);
    }
    
    pulseLength =  millis() - pulseLength; // Milliseconds per pulse
    pulseLength = (pulseLength * 100) / DUTY;  // Convert from DUTY to 100%
    unsigned long pulseRate = MILLISECONDS_PER_MINUTE / pulseLength; // Pulses per minute
    return pulseRate / PULSES_PER_REVOLUTION;
}

Am I on the right track? (I got those last 4 lines from somewhere else in these forums)