Импульсный тахометр

Я попытался создать тахометр для своего мотоцикла, используя Arduino Uno.
Я пытаюсь измерить напряжение катушки зажигания (шагнул вниз, чтобы не разрушить Arduino).

Я пытаюсь определить время между двумя взрывами (одна катушка зажигания высокого напряжения).

Я попытался использовать команду pulseIn следующим образом:

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);
}

Проблема в том, что он не будет отображать стабильные значения. Все сойдет с ума. При разомкнутой цепи он по-прежнему отображает случайные значения.

, 👍1

Обсуждение

Вы уверены, что этот импульс не короче 10 мс?, @Divisadero

я протестировал как pulseIn (pin, НИЗКИЙ УРОВЕНЬ), так и pulseIn (pin, высокий уровень), но ни один из них не сработал. Самое большее, мой велосипед делает 14.000 оборотов в минуту, что означает 14.000 / 60 (233) оборотов в секунду. 233 rps ..... 1000 мс x rps............1 мс х=233/1000. Я предполагаю, что это меньше 10 мс. В этом ли проблема?, @Andrei Grigore

https://www.arduino.cc/en/Reference/pulseIn -менее 10 мс это не будет работать правильно, @Divisadero

но если вы протестировали его с меньшей скоростью, проблема будет где-то в другом месте, @Divisadero

Мне любопытно, как вы можете включить катушку зажигания в свою цепь?, @Divisadero

Я подозреваю, что для этого Arduino уже слишком поздно. Как вы безопасно снижаете напряжение таким образом, чтобы оно не а) не убивало Arduino и б) не убивало вас?, @Majenko

кстати: http://arduinoprosto.ru/q/318/how-precise-is-the-timing-of-pulsein?rq=1, @Divisadero

pulseIn работает для значений менее 10 мс, он возвращает время в "микросекундах". Попробуйте Serial.println(pulseIn(pin,НИЗКИЙ));, @Sniper

Я не пользовался высоковольтной клеммой. Я снял минус с первичного минуса катушки (клемма 12 В) и плюс с аккумулятора, поскольку земля - это та, которая постоянно меняется в катушке зажигания. Я использовал делитель напряжения, чтобы понизить напряжение до приемлемого уровня., @Andrei Grigore


2 ответа


0

Я не могу сказать вам, почему это не работает, но я могу дать вам рабочую альтернативу.

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);
}

Возможно, я что-то забыл, но это должно сработать.

Edit: комментарии могут быть правильными, вы понижаете входное напряжение?

,

2

Никто не упоминал, что при разомкнутом переключателе (или точках) возникает обратная ЭДС от первичной катушки. Это означает, что к вашему делителю напряжения в обратном направлении подается 200-300 В, в то время как вы думаете, что есть только 0-12 В.

,