Boa noite pessoal.

Estou utilizando um programa de tacômetro, fiz algumas metodificações conforme minhas necessidades, porém o valor do RPM bastante, no caso do teste estava trabalhando com 30 RPM e no serial Monitor  variava entre 24 e 36 RPM, para leitura dos pulsos estou utilizando um sensor indutivo NPN, leitura feita no pino 2, alguém já teve um problema semelhante para o assunto RPM.

Após obter o RPM, utilizei um cálculo para obter KM/H, calculando RPM * perímetro da roda para saber o deslocamento por minuto, logo após dividi por 60 para ter este deslocamento em segundos e por fim * 3.6, porém o resultado não ocorreu de forma correta, alguma dica do que estou fazendo de errado agradeço.

Segue em anexo código utilizado.

valeu.

Exibições: 104

Anexos

Responder esta

Respostas a este tópico

Imagino que pretende medir a velocidade de uma bicicleta ou algo similar. 

Analisando o seu Sketch:

Você esta medindo o valor do RPM a cada segundo.

Não sei se isso é a causa do seu problema, mas essas são as minhas sugestões :

Para desabilitar todas as interrupções use
noInterrupts();

Para reabilitar as interrupões use
interrupts();

https://www.arduino.cc/en/Reference/Interrupts


Que encoder maluco é esse ??

unsigned int pulsos_por_volta = 17;
rpm = (60 * 1000000 / pulsos_por_volta ) / (micros() - timeold) * pulsos;

Boa noite.
Grato pela ajuda.
Estou usando este sistema para uma roda de plantadeira (plantio de milho e soja).
O encoder na verdade é apenas uma roda dentada, uma engrenagem de 17 dentes.
Fiz as alterações, que o Sr. Eduardo comentou, o resultado foi satisfatório por um pequeno tempo, logo após ele começa a variar bastante.
Se eu compilar o programa novamente ele faz o mesmo procedimento, começa bem e logo varia bastante.

Já pensei em fazer um laço para pegar 10 valores ou mais e fazer a média, seria um teste para ver se melhora o resultado.

Quanto as interrupções não cheguei a modificar, tenho uma dúvida ao desabilitar a interrupção para o cálculo, este pequeno tempo de interrupção não poderia afetar os próximos cálculos?
E no caso do contador eu tenho ele no escopo. Será que este contador esta sendo interrompido para cálculo juntamente com as equações?

Obrigado pela atenção.

Boa noite , seu programa deve estar com problema mesmo. 

Eu ainda não descobri onde. 

Faca um teste com esse programa e nos informe os resultados:

http://playground.arduino.cc/Main/ReadingRPM

Boa noite.
Feedback do trabalho, programa rodou beleza, depois de fazer todos os testes retirei o sensor indutivo da fonte de alimentação e coloquei diretamente no arduíno, a principio testei ontem e hoje e esta rodando beleza.

Porém surgiu outra dúvida, vou utilizar este RPM recebido e enviar para um motor de passo utilizando a placa easy driver, também vou utilizar a biblioteca AccelStepper

Ao utilizar os comandos :

motor.setSpeed(velocidade_motor);
motor.runSpeed();

Dentro do loop, pode gerar algum problema devido as interrupções?

Se puderes ajudar co alguma dica de como proceder com interrupções e a biblioteca AccelStepper, fico grato.

valeu.

A mistura de tipos numa conta "confunde" o compilador.

Recomendo escolher um tipo de dados, por ex float e usar só ele na equação.

As constantes vc calcula primeiro, entrega na conta já calculado. Se são constantes não precisa recalcular todo tempo.

Crie uma copia dos dados não float, ex:

Crie uma global constante:

float constante,dt,rpm;

na inicialização:

constante=(60 * 1000000 / pulsos_por_volta);

no corpo:

dt=(float) (micros() - timeold);

rpm=pulsos*constante/dt;

Mesmo pq o unsigned int é um numero que vai de 0 a 65535, não suporta o 60*1000000 

Enfim, resumindo: Para essas contas é preciso usar float, mas nunca use float em uma interrupção. Pulsos deve continuar int.

Eduardo , então pulsos tem que ser :

volatile int pulsos;

https://www.arduino.cc/en/Reference/AttachInterrupt

Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as volatile

http://playground.arduino.cc/Main/ReadingRPM.

Parabens pelas explicações meus amigos Zé Gustavo e Marcondes,  não tenho o que acrescentar, alem de lhes dar parabens.

Boa noite
Obrigado pela ajuda.

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço