I tried to create a tachometer for my motorcycle using an Arduino Uno.
I am trying to measure the voltage of the ignition coil (stepped down to not destroy the Arduino).
I am trying to determine the time between two explosions (one ignition coil high voltage).
I tried to use the pulseIn
command in the following way:
unsigned pin=8;
float t;
unsigned long rpm;
void setup() {
Serial.begin(9600);
pinMode(pin,INPUT);
}
void loop() {
rpm=pulseIn(pin,LOW);
Serial.println(rpm/60);
}
The problem with it is that it won't display stable values. It will go all crazy. With an open circuit it still displays random values.
-
Are you sure that pulse is not shorter than 10ms?Divisadero– Divisadero2017年03月08日 15:14:12 +00:00Commented Mar 8, 2017 at 15:14
-
i tested both pulseIn(pin,LOW) and pulseIn(pin,high) and neither worked. At most, my bike does 14.000 rpm, meaning 14.000/60 (233) rps. 233 rps ..... 1000 ms x rps............1 ms x=233/1000. I guess it is less than 10 ms. Is that the problem?Andrei Grigore– Andrei Grigore2017年03月08日 15:19:43 +00:00Commented Mar 8, 2017 at 15:19
-
arduino.cc/en/Reference/pulseIn - under 10ms it wont work rightDivisadero– Divisadero2017年03月08日 15:29:18 +00:00Commented Mar 8, 2017 at 15:29
-
but if you have tested it with smaller speed, the problem will be somewhere elseDivisadero– Divisadero2017年03月08日 15:29:46 +00:00Commented Mar 8, 2017 at 15:29
-
3I suspect that it is already too late for that Arduino. How are you safely stepping the voltage down in such a way that it doesn't a) kill the Arduino, and b) kill you?Majenko– Majenko2017年03月08日 15:40:23 +00:00Commented Mar 8, 2017 at 15:40
2 Answers 2
No one mentioned that there is back EMF from primary coil when switch (or points) becomes open. This means that there is 200-300V applied backwards to your voltage divider while you think there is only 0-12V.
I can't tell you why that isn't working, but I can give you a working alternative.
unsigned int pin=8;
void setup() {
Serial.begin(9600);
pinMode(pin,INPUT);
}
void loop() {
unsigned float rpm = 0;
while (digitalRead(pin) == FALSE) {
rpm++;
delayMicroseconds(1);
}
Serial.println(rpm/60);
}
I might've forgotten something, but that should work.
Edit: the comments may be right, are you stepping down your input voltage?