Bom vamos lá. primeiro agradecer a atenção de vocês, a principio não queria entrar a fundo nessa parte mais "técnica" do assunto, pois são diversas coisas que podem dar mais dores de cabeça, então como já tenho a base disso tudo em mãos só queria resolver a forma como o RPM é "contado".
Bom primeiramente o carro é de 86 e o sistema utilizado é o sistema indutivo (uma bobina dentro do distribuidor que a cada "passada" envia um sinal para a ignição eletronica, que por sua vez dispara um pulso negativo para o pino (-) da bobina efetuando o disparo da faisca, o pino (+) fica direto no 12v pos-chave.
Logo teremos no pino (-) um pulso 1 e 0. para evitar problemas fiz um filtro de entrada de tensão para o arduino e um regulador de tensão. estou usando um apto-acoplador para filtrar e separa os pulsos vindo da bobina para a porta D2 interrupt do arduino. até ai tudo certo.
Respondendo a pergunta de outro amigo: Sim a forma numero 1 é muito boa, se for falar em praticidade, e confiança ela é sem duvidas pramin a melhor forma de se contar o rpm, porem ai entra um simples fato de que preciso saber a cada pulso o valor de RPM exato, pois o arduino ira executar uma função (calculos) a cada pulso, i se eu esperar a quantidade de pulsos durante 1 segundo eu vou ter muita variação de RPM pois um caro leva milesimos de segundos para alterar o RPM.
Um exemplo muito basico de uma função que tenho aqui é a seguinte:
- Código: Selecionar todos
if (rpm > corte) // os valores estao setados em variaveis.
{
digitalWrite(bobina, LOW);
}
if (rpm < corte) // os valores estao setados em variaveis.
{
digitalWrite(bobina, HIGH);
}
Oque temos acima é uma função chamada de CORTE de IGNIÇÃO, isso evita que o motor do carro passa de determinado RPM logicamente esta na forma bruta, pois existe uma variavel de INTERVALO entre HIGH e LOW seria algo do tipo:
- Código: Selecionar todos
if (rpm > corte) // os valores estao setados em variaveis.
{
digitalWrite(bobina, LOW);
}
if (rpm < (corte - intervalo)) // os valores estao setados em variaveis.
{
digitalWrite(bobina, HIGH);
}
Isso evita do corte ficar muito rápido, logicamente pode ser programado a gosto, e também temos uma outra função chamada de inércia, onde quanto + rpm for setado no valor corte menor será o valor de corte

(enrolei tudo kk) exemplo:
----
ex1:
CORTE = 1000
INERCIA= 0
carro corta em 1000 RPM.
----
ex2:
CORTE= 8000
INERCIA=1000
carro corta em 7000, após o primeiro corte se ajusta inércia automático até INERCIA=0 ai segura o motor em 8000 cortando( HIGH, LOW)
----
Entre outras coisas a mais que precisa ter para ser perfeito e eficaz. porem vou explicar oque ocorre.
Digamos que estou usando um codigo que leva 1segundo para ler o RPM. logo tenho algo + - assim no meu monitor serial:
RPM:1000
RPM:1200
RPM:850
..
.
ai eu programo meu carro para corta em 5000, ai tenho isso em monitor serial:
RPM: 1000
RPM: 1350
RPM: 1590
RPM: 2400
RPM: 3900
RPM: 4800 (ultima leitura foi em 4800, logo após 1 seg vou ter muuuito mais que 5000 observe...)
RPM: 5700 bobina = low (arduino percebeu que passou de 5000 e desligou a bobina imprimiu no monitor tbm)
RPM: 5100
RPM: 4300 bobina = high (arduino tornou a ligar a bobina pois rpm esta a baixo de 5000)
Bom agora seguinte alem disso tenho outro problema!!! Que és zerar o rpm entre uma contagem e a outra. ai digamos que o arduino perceba que:
RPM: 5700 bobina = low (arduino percebeu que passou de 5000 e desligou a bobina imprimiu no monitor tbm)logo apos esta leitura o valor de rpm se torna ZERO até se passar 1 segundo. logo se RPM for menor que CORTE a bobina vai pra HIGH tornando a acelerar o carro. veja:
- Código: Selecionar todos
if (rpm > corte)
{
digitalWrite(bobina, LOW);
}
if (rpm < corte) // RPM menor que CORTE bobina = high.
{
digitalWrite(bobina, HIGH);
}
neste ponto entre uma contagem e a outra oque acontece é que RPM fica zerado, ai pode estar 10.000 de RPM o código atualizar o valor RPM, vai mandar deligar a bobina e após isso o RPM vai pra zero tornando a ligar a mesma.
Digitando agora aqui acabei de ter uma ideia, posso fazer o seguinte não zerar o contador mais manter o valor RPM em uma variável e só atualizar quando o contador fizer uma nova leitura.
Logicamente posso diminuir esse tempo de 1 segundo para 250milis e multiplicar o resultado por 4. vai ficar + rápido a atualização.
Mais então pessoal ficou meio gigante aqui rsrs mais espero que tenha explicado oque se passa no meu projeto. a prévia do fim será a cada pulso de entrada (interrupção) o arduino vai ler massa de ar, sonda, tps, map, maf, vai comparar com o mapa de injeção e vai fazer a pulsarem dos bicos. isso mais alem kkk agora o problema é o rpm mesmo rsrsr