Motorcycle Tachometer Repair

Hi,

While investigating the wiring on my motocycle engined sidecar I seem to have broken the Tachometer. I am looking for some guidance to hopefully get it working again.

The RPM is determined by signal that is produced by a Variable Reluctance sensor, this senses notches on the crankshaft as it rotates. This produces an sine wave signal, the voltage increases when the RPM increases. The signal from this sensor is fed to the ECU, the ECU then sends a 12V square wave signal to the clocks in order to display the RPM on the Tachometer. This square wave signal is no longer being produced.

When this signal was working, I was able to use a voltage divider to bring it down to 5V, and using the analogRead function and the serial plotter, I confirmed that it was a square wave signal (Unfortunately I don't have a scope). I was trying to measure this signal with a the frequency setting on a multimeter and it is now no longer sending out this square wave signal, only a signal of around 1V, I can only imagine I have broken whatever IC is producing this signal in the ECU.

What I am hoping I can do is condition the signal from the crankshaft sensor so that it is readable via the arduino and create a 12V square wave at the correct frequency to drive the gauge.

I have a Honda part number for the sensor: 30300-MEE-D00. I am not able to find a datasheet for this sensor.

I have been looking at a MAX9924 to condition the signal produced by the VR sensor, I am struggling with reading the datasheet as it seems it can only take an input of 5V max. I can not be sure if the sensor produces a voltage of over 5V when it is going at the max RPM of 16,000.

Sorry for all the info, I tried to give as much as possible.

Do you think it is feasible to fix this? Or do I need to buy a new ECU?

Hello David (came across your post on All About Circuits). Can I assume the ECU you refer to is the master controller? Or is the ECU you refer to the MLX10407?

This produces an sine wave signal, the voltage increases when the RPM increases.

You mentioned that you don't have a scope. How do you know this?

and using the analogRead function and the serial plotter, I confirmed that it was a square wave signal

I don't understand how you came to the conclusion that the signal you read from the analog pin was a square wave since the analog read function takes a voltage, not a signal.

Perhaps before embarking on a project to reinvent your 'broken' circuit, it may be wise to ensure the circuit is indeed broken. Below is an excerpt from the MLX10407 data sheet.

Immediately after a reset, the I.C. checks if there is any short-circuit or open circuit on each buffer driver
output (This test is not made for outputs 5,6 7). For this test, each buffer is held in a high impedance state and large internal resistances (100kW) are sequentially connected on each pair of buffers (note : the actuator coil must be connected on each bridge). During the tests the pin ERRB (16) is at logic level 0. Then after the tests have been done ERRB stays at 0 if one (or more) test fails or changes to high impedance state if every thing is OK.

If you have not already read this post, you may find it of some value.

  • Scotty

Hello David (came across your post on All About Circuits). Can I assume the ECU you refer to is the master controller? Or is the ECU you refer to the MLX10407?

The ECU is the master controller, it is the box that controls when the coils spark etc, it has lots of wires going to it and is potted with epoxy. The MLX10407 is a chip I found inside the clocks, which is a separate board from the ECU and is where the tachometer gauge resides.

You mentioned that you don't have a scope. How do you know this?

Indeed, I cannot be sure, but I have read links like the following. GoPpt.com is for sale | HugeDomains. The sensor I have is definitely a 2 wire sensor. When I measured the output of this sensor with a multi-meter I was getting around 250 mV signal.

I don't understand how you came to the conclusion that the signal you read from the analog pin was a square wave since the analog read function takes a voltage, not a signal.

I identified the wire that sends the rpm signal from the ECU to the tachometer. I measured it with a multi-meter, it was showing around 6V. I had read that the tachometer is usually fed by a square wave signal, I thought that the 6V signal could well be a 12V square wave with the multi-meter averaging the voltage of the PWM signal. I didn't want to send this signal directly to my arduino so I sent it via a voltage divider. I then set up a simple sketch that read the voltage and printed the value to the serial console. Looking at this on the serial plotter I saw a square wave signal. I saw similar results using a digital pin, the signal flipped between 0 and 1.

I think the first thing for me to do is to try and move the gauge by producing a 12V square wave signal. I have done some research and come up with the following circuit.

I am going to try this and see if I have any success driving the gauge. Unless anyone can see any issues with my circuit?

Hi Rickerman
Would it be any good applying 12v to the gauge motor but
feed it a 0-5v TTL signal, square wave. Connecting both earths.
You could try simply sending a tone out on an Arduino pin to see what the gauge does.
Many instruments need 12v to drive the motor but are happy to accept a 5v signal.
All the best

Hi,

I did try to feed a 5V square wave to the gauge and it didn’t work.

I used the following sketch to produce the signal

#include <digitalWriteFast.h>

const int outputPin = 12;
const int frequency = 500;

unsigned long microDelay;
unsigned long lastPeak;

bool peakActive = false;    

void setup() {
  pinModeFast(outputPin, OUTPUT);
  Serial.begin(250000);
  Serial.println("Square Wave Producer " + String(frequency) + "Hz");
  Serial.println("Out of pin " + String(outputPin));
  microDelay =  1000000 / (frequency * 2); 
  digitalWriteFast(outputPin, LOW);
}

void loop() {
  produceSquareWave();
}

void produceSquareWave() {
  if (micros() - lastPeak >= microDelay) {
    if (peakActive) {
      digitalWriteFast(outputPin, LOW);
      peakActive = false;
    } else {
      digitalWriteFast(outputPin, HIGH);     
      peakActive = true;
    }
    lastPeak += microDelay;
  }
  return;
}

I think the first thing for me to do is to try and move the gauge by producing a 12V square wave signal.

Directly to the gauge or to the gauge via the MLX10407? - Scotty

scottyjr:
Directly to the gauge or to the gauge via the MLX10407? - Scotty

I am going to connect the square wave signal to the same location that the original square wave signal was connected to. Looking at the picture of the dash circuit board I don't believe it connects directly to the MLX10407.

I don't wish to discourage your troubleshooting efforts but applying the signal as you describe may not definitively determine a failed component.

The MLX10407 data sheet states :

The μP outputs the serial clock SCLK, the chip select CS, the data DIN

.

I think the 'μP' would be your ECU. As I understand it, there is more than just a square wave signal required to drive the gauges. It requires a serial interface.

I found this page that I think describes how your gauge works. In it's description it mentions coils with sine and cosine currents that seem to match to the outputs of a MLX10407.

  • Scotty

Hi Scotty,

Thanks for the reply. I hope it is not a serial communication interface as I will be needing a new ECU if this is the case.

I have tapped into this wire before now, to install an aftermarket gear indicator. It takes an rpm signal from the final drive shaft, and one from the crankshaft. It uses the ration of engine RPM to drive shaft RPM to determine which gear you are in. If this was a serial communication line I would expect the frequency of the pulses to be constant at the baud rate.

Here are the instructions for the Gear indicator. https://www.carpimoto.it/Images/Products/Pdf/GPX_U01_InstallGuide_EN.pdf

I tapped into the wire that goes between ECU and tach, and it was working until the signal broke, it now doesn't work as it is not able to determine the RPM of the crankshaft.

I have tapped into this wire before

I'm not sure which wire you tapped into. The sensor wire or the wiring coming from the ECU and going to the gauges.

The serial communication I was referring to is not the wiring coming from the sensors to the ECU , rather the wiring from the ECU to the gauges.

  • Scotty

scottyjr:
I'm not sure which wire you tapped into. The sensor wire or the wiring coming from the ECU and going to the gauges.

The serial communication I was referring to is not the wiring coming from the sensors to the ECU , rather the wiring from the ECU to the gauges.

  • Scotty

The wire I used for the gear indicator was between ECU and gauges. This is why I think that the frequency increases as rpm does, otherwise the gear indicator would not have worked.

Well, I connected a 12V square wave to the clocks and I was able to move the needle on the gauge by altering the frequency of the square wave. It looks to be about frequency in Hz * 30 = RPM shown on the gauge.

Now I just need to figure out how to read the VR sensor and convert that into an RPM.

quote

'I have broken the tachometer'

How?

A variable reluctance sensor gives a sine-ish signal whose frequency and voltage both depend on the rpm.

Does it still do this? Have you got a scope to check?

The MLX10407 probably also drives the speedo - does this still work?

Allan

allanhurst:
quote

‘I have broken the tachometer’

How?

A variable reluctance sensor gives a sine-ish signal whose frequency and voltage both depend on the rpm.

Does it still do this? Have you got a scope to check?

The MLX10407 probably also drives the speedo - does this still work?

Allan

The VR sensor feeds into the ECU, the ECU then conditions this signal and sends a square wave signal to the dash to display the rpm on the gauge. I believe I have damaged the circuit in the ECM that sends out the square wave signal. I was trying to measure the frequency of this signal with a multi-meter.

I am pretty sure that the VR sensor is still working as the engine is still running, I don’t think it would run if there was a problem with the VR sensor. Unfortunately I don’t have a scope but I am looking into buying a cheapish one.

The speedo does not work, but it never has. It is a racing sidecar with an aftermarket ECU.

I was able to drive the needle with a square wave produced by the tone() function, and amplified to 12v. I just need some idea about conditioning the VR signal, without affecting the signal recieved by the ECU.

Hi…

The MLX10407 is designed to drive sin/cos meter movements - so your tacho gauge is one of these.
It gives variable PWM outputs to each of the 2 coils in the gauge.

You could always use an Arduino mini/nano as I have done.

And note this was designed to use the ripple on an alternator as it’s input : 500Hz was about 2000 rpm.

It works fine as a revcounter on my daughter’s boat engine

You’ll have to adjust constants as appropriate for your application.
To run from your pickup reverse C1.

See enclosed for a saturating preamp and the code - can’t put it in a ‘code’ section as it’s too long

Allan

revpre.pdf (18.7 KB)

revcnt.txt (8.45 KB)

Very interesting circuit Allan, I simulated it on Circuit Simulator Applet and it seems to change an AC wave form into a square wave, exactly what I need.

The crankshaft has 12 edges on it that pass by the sensor, so at idle (around 1,500 rpm) It will be producing a 300 Hz signal. At max rpm (around 16,000) it will be producing a 3.2 kHz signal, and much higher voltages. Hopefully this wont be too much for the arduino to handle.

What is the purpose of the capacitor?

How can I make sure that this add on circuit doesn't affect the signal that is being read by the ECU?

The capacitor is because the original alternator application for which is was designed sat at +12v - and even so you need to isolate the +0.7v bias of the transistor… Note as my previous comment that the capacitor should be reversed ( -ve to the sensor) for your application given that one side of your sensor is grounded.

It works well with an input ac level of < 100mV p-p.

The input resistor could be much higher depending on the output of the sensor. 10k wouldn’t load it much ( they typically have an impedance of a few hundred ohms) .

The high voltage excursions will be clamped by the input resistor, diode and transistor b-e junction - no problems.

3.2 kHz is about 1/ 300uS - the pulseIn() function has a resolution of 1uS or about 0.3% error - good enough?

I bet the meter linearity isn’t much better than 1%

Allan

I’m not sure one side of the VR sensor is grounded. I’ve been looking at the wiring diagram and one wire both wires go to the ECU, one is common with the camshaft sensor.

I have some Schmitt trigger IC’s somewhere, maybe I could make a circuit with them?

1/ You can easily check with a multimeter if one side is earthed - though it doesn't really matter as my circuit is ac coupled. Just pick out the signal line and arrange C1 polarity as appropriate.

2/ A schmidt trigger is fine - but needs a signal of at least 1/3 Vdd ( say 1/3 5v or 1.3v) p-p plus ac coupling and overvoltage protection with biased dc to work..

My circuit is simpler. And much more sensitive. And works.

Allan