Help Reading Variable Voltage for Arduino Tachometer

Hello! This is my first project and first post with Arduino, so I'm a bit of a newbie and don't know too much. My project is making my Arduino into a tachometer for my car. Seemed easy at first - grab the tach signal, process it in the Arduino and output it onto an LCD screen. However it's becoming more difficult than I imagined lol.

I'm using an MSD GMR tach pickup, which is an inductive pickup connected to the ignition coil ground wire to detect the pulses for the sparks. It has a positive, negative, and data wire. When connected to the car's 12v battery and hooked up to an analog tach gauge, it works just fine. Measuring that data wire with a multimeter, I found that as the RPM increases, the voltage on that data wire also increases. The voltage sits around 12-13v at idle, so I'm trying to use a voltage divider to bring it down.

I'm using the code on the Read Analog Voltage reference page ( I tested it on a battery by connecting the A0 pin to the positive battery terminal and the Arduino ground to the negative terminal. I get the same value that I get on the multimeter.

However, when I connect the data wire to the A3 pin, I get false readings. I'm not sure what the equivalent would be to connecting the negative terminal of the battery to the Arduino ground - or if that's even necessary - when there's only a data wire.

Any help would be great, thanks!

If found that you are not correct about how your device works: "Tach Signal GMR Pickup; Converts Low-Voltage/High-Current Pulse To A Clean 12-Volt Square Wave; ".

Your multimeter is integrating the 12 volt pulses to appear as a voltage that varies with the actual pulse rate of the signal.

You are correct about needing a voltage divider to bring the 12 volts down to 5 volts. But you need to apply it to a digital pin and likely want to use an interrupt to count either the rising side of the pulse or the descending side of the pulse. Then once each second, turn off the interrupts, move the count to a working integer, zero the pulse count, and then turn the interrupts back on. Use the working count to compute the RPM. The count will be the RPM for 1 second, so multiply by 60 and display the result.

Good luck.