Ir ao conteúdo
  • Cadastre-se

Circuito Limitador de RPM (arduino)


Posts recomendados

@aphawk @.if  Fiz um teste, mesmo do esqueminha que postei,usei uma bateria de 9v e uma chavinha pra ligar  e desligar o opto aparentemente deu certo agora é só conectar ao hall ou ao módulo de ignição pra testar, mas estou com uma duvida, deixei dois prints, um quando o opto liga e o outro com tudo desligado,

 

Com ele desligado o osc fica captando 60Hz com certeza deve ser a rede eletrica, mas será que isso vai interferir na medição ou quando conectar ao carro pelo sinal do hall ou do módulo ser bem mais forte o OSC automáticamente desconsidera a freq da rede e mostra apenas a freq do sinal mais forte?

teste1.png

teste2.png

Link para o post
Compartilhar em outros sites
Em 10/04/2021 às 18:32, .if disse:

Testa

@.if Testei... 

 

Deu tudo errado, não consegui medir nada, só mostrava 60Hz no começo, depois ligando o o opto mostrou 100, 180, 200, 80... simplesmente fica variando demais em tudo, então tirei o opto coloquei o potenciometro de 100K tentei ajustar e nada, pulei o opto medi direto no pino do módulo com o potenciometro e deu a mesma coisa variando a frequencia absurdamente, depois desisti do pino do módulo liguei direto na saida do hall do distribuidor e também não deu em nada os valores são todos aleatórios sem sentido, acelerando ou desacelerando o motor dá no mesmo... Enfim o teste foi inconclusivo e em resumo uma perda de tempo e combustível o motor ficou ligado mais de meia hora...

 

será que a frequência do pino do módulo é como o @aphawk disse e não tem como medir com osc? de qualquer forma pensei nisso:

 

Esse OSC de pc é voltado mais para aprendizado mesmo, é muito complicado toda hora que for usar tem que ficar mudando as resistencias pra funcionar, se fizer ********** pode queimar o pc, é bem sensível a interferencias e de vez em quando o programa dá erro também...

 

Não conseguir medir nada no OSC foi um banho de água fria...

 

Uma solução que imaginei é: o sinal do Pino do módulo pode ser um sinal complicado de medir, mas o hall do distribuidor não, ele é apenas um hall que dá um pulso de 8V quando ativado e 0V quando desligado. será que então não vale a pena esquecer o pino do módulo de ignição e tentar medir a freq direto do hall com esse esqueminha aqui usando arduino?

 

 

 

Aparentemente se conseguir medir a Freq do hall acho que tem mais chance de funcionar do que usar o sinal do pino do módulo, o que acham?

WhatsApp Image 2021-04-11 at 18.54.22.jpeg

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Sim, eu acho os sensores Hall muito mais fáceis de trabalhar, pois você deve receber um sinal mais limpo e na teoria bem "quadrado" na saída do opto.

 

E basta medir o intervalo entre os pulsos e vai calcular fácil a frequência. 

 

Paulo

Link para o post
Compartilhar em outros sites

@aphawk  concordo, se eu possuísse um osciloscópio razoável daria pra tentar continuar com a ideia de usar o pino do módulo de ignição, mas como não tenho vamos partir para o Hall, a ideia é descobrir a Freq que ele emite em determinadas rotações do motor usando o contagiros do carro para montar uma tabela mais ou menos assim:

 

RPM        freq Hz

1000          30

2000          60

3000          70

 

depois disso fazer o programa converter essa frequencia em RPM e mostrar no LCD do arduino.

 

Para testar o frequencimetro de arduino fiz esse código em outro arduino para servir de fonte de sinal:

 

Citação

#define saida 2

void setup() {
  // put your setup code here, to run once:
  delay(5000);

}

void loop() {
  // put your main code here, to run repeatedly:
  tone(saida, 25, 5000);
  delay(10000);
  tone(saida, 30, 5000);
  delay(10000);
  tone(saida, 40, 5000);
  delay(10000);
  tone(saida, 60, 5000);
  delay(10000);
  tone(saida, 100, 5000);
  delay(10000);
  tone(saida, 150, 5000);
  delay(10000);
  tone(saida, 300, 5000);
  delay(10000);
  tone(saida, 800, 5000);
  delay(10000);
  tone(saida, 1000, 5000);
  delay(10000);
  tone(saida, 1500, 5000);
  delay(10000);
  tone(saida, 4000, 5000);
  delay(10000);

}

 

 

Deu certo ele mostra a Freq no LCD com variação de até 10hz em determinadas frequencias, mas só funciona a partir de 40Hz a baixo disso não mostra nada, aí não sei se é porque a função tone não consegue gerar frequências mais baixas ou se o arduino não é capaz de ler frequências mais baixas mesmo...

 

vou ligar o hall em série com um resistor de 1k e ligar este resistor ao arduino e vamos ver no que dá...

Link para o post
Compartilhar em outros sites
19 horas atrás, aphawk disse:

Sim, eu acho os sensores Hall muito mais fáceis de trabalhar, pois você deve receber um sinal mais limpo e na teoria bem "quadrado" na saída do opto.

Tem toda razão @aphawk , medindo hoje diretamente no pino hall consegui montar uma tabelinha bem coerente, lógico que não é 100% precisa mas a variação é baixa então creio que podemos continuar com ela:

 

marcha lenta 800 RPM                25-30Hz

1000RPM                                     30-35Hz

2000RPM                                     75-80Hz

3000RPM                                     100-105Hz

 

 

Na página anterior respondendo ao @.if eu chutei que para 1000 RPM seria uma freq de 33Hz e está dentro, então acho que está certo, o dobro seria 66Hz essa deveria ser a freq em 2000RPM e o triplo seria 99Hz aproximadamente, então creio que esteja tudo em ordem, nesse caso o próximo passo é mudar o programa para ao invés de aparecer escrito frequência no LCD aparecer  já em rpm, pela minha lógica é só multiplicar a freq por 30 e mandar aparecer essa informação no display é isso?

 

aí fica RPM em cima freq em baixo

 

aqui em anexo o motor em marcha lenta e no LCD 25Hz

 

WhatsApp Image 2021-04-12 at 17.39.53.jpeg

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Olha... embora você ache pequena, essa variação ainda é muito grande, são mais de 10% de erro... pode ser que o programa não esteja escrito 100% correto e esteja perdendo alguma coisa no meio do caminho.

Eu ví programas que são tecnicamente perfeitos, permitem medir corretamente frequências até 100 Khz usando esses Atmegas, acho que vale a pena você procurar e usar outro programa para fazer um teste.

Acho aceitável uma variação na RPM de 5%, mais que isso com certeza é sinal que ainda tem de acertar alguma coisa no seu experimento.

 

Paulo

 

  • Curtir 1
Link para o post
Compartilhar em outros sites

@aphawk Realmente pesquisando achei este frequencimetro de Arduino, o site informa que mede com precisão até 6.5 MHz O_O

 

 

https://hackaday.io/project/176074-diy-65mhz-arduino-frequency-meter-7segment-displ

 

 

Vou analisar e se der vou trocar o o programa do meu frequencimetro por este outro desse site.

 

Não estou querendo 100% de precisão se o motor variar 100rpm a mais ou a menos ok não tem problema, o duro é variar 300 ou  400 rpm aí fica um negócio muito estranho, uma hora limita o rpm em 4800 depois limita em 5200 tem coisa errada...

Link para o post
Compartilhar em outros sites

 

2 horas atrás, aphawk disse:

baixei aqui e tem vários arquivos estou meio perdido, vou tentar entender aqui qual usar, e também se preciso de outras coisas além do arduino para medir a Frequência, se não precisar vou montar e fazer testes aqui, logo mais postarei os resultados

Link para o post
Compartilhar em outros sites

@aphawk me enrolei aqui, estava instalando as bibliotecas no arduino e olhando como é a programação, estava meio confuso porque tem vários arquivos, mas acabei chegando em um dilema, pelo que eu li o autor do código vende a plaquinha que faz esse código funcionar, olha ela aqui:

 

Annoted%20presentation.jpg

 

quer dizer que para funcionar eu teria que comprar ela? Estou em duvida agora, mas vou pesquisar outros códigos de frequêncimetros para arduino também por via das duvidas...

 

Fuçando um pouco apenas para teste alterei o código que usei no começo para motrar RPM em cima da fre no LCD, mesmo sendo um código impreciso é só para treinar mesmo, a ideia é multiplicar a freq por 30 para estimar a RPM atual, mas não sei porque ele não está mostrando o numero,  está mostrando apenas  RPM escrito... o código é esse aqui:

 

Citação

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h> //inclui biblioteca lcd
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);

// --- Mapeamento de Hardware ---
#define inFreq   2  //entrada para medir a frequência no pino digital 2


// --- Variáveis Globais ---
long freq, RPM, counter;
int pulseCount;
boolean pulse;


// --- Configurações Iniciais ---
void setup() 
{
  
  pinMode(inFreq,INPUT);    //Configura como entrada
  
  
  lcd.init();
  lcd.setCursor(2,0);      //Posiciona cursor na coluna 3, linha 1
  
  pulse = 0x01;             //Seta variável de controle
  
} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreq))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%200 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freq = pulseCount*5;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,1);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freq);      //Imprime valor atual da frequência
    lcd.print("Hz");      //Imprime "Hz"
    RPM = freq*30;
    lcd.setCursor(5,0);
    lcd.print("RPM");
    
    
    pulseCount = 0x00;     //Reinicia contador
  }
  
  
} //end loop
 

o que está errado para ele não mostrar a RPM no display?

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Não consigo te ajudar no código, eu não entendo nada de C...

O cara vende essa plaquinha mas você não precisa de nada além do Arduino Uno e um display para funcionar, usando as saídas de seus opto acopladores.

 

Vou colocar alguns exemplos mais simples para te facilitar.

 

Paulo

Link para o post
Compartilhar em outros sites
11 horas atrás, aphawk disse:

Não consigo te ajudar no código, eu não entendo nada de C...

eu entendo bem pouco também, quem eu sei que entende é o @.if e o @Thiago Miotto porque eles me ajudaram no tópico anterior, quem sabe eles podem me ajudar nessa parte outra vez, estou alterando o código várias vezes e nada do RPM aparecer no LCD, só aparece escrito RPM mas o numero mesmo não...

 

O código até agora é esse:

 

Citação

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h> //inclui biblioteca lcd
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);

// --- Mapeamento de Hardware ---
#define inFreq   2  //entrada para medir a frequência no pino digital 2


// --- Variáveis Globais ---
long freq, counter;
int pulseCount, RPM;
boolean pulse;


// --- Configurações Iniciais ---
void setup() 
{
  
  pinMode(inFreq,INPUT);    //Configura como entrada
  
  
  lcd.init();
  lcd.setCursor(2,0);      //Posiciona cursor na coluna 3, linha 1
  
  pulse = 0x01;             //Seta variável de controle
  
} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreq))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%200 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freq = pulseCount*5;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,1);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freq);      //Imprime valor atual da frequência
    lcd.print("Hz");      //Imprime "Hz"
    RPM = pulseCount*30;
    lcd.setCursor(5,0);
    lcd.print("RPM");
    
    
    pulseCount = 0x00;     //Reinicia contador
  }
  
  
} //end loop

 

@aphawk vou continuar pesquisando outros códigos mais simples e precisos para medir a freq do hall, este que estou agora parece que vai funcionar, só que a variação dele é de mais ou menos 5Hz e convertendo em RPM isso dá mais ou menos 150 RPM para mais ou para menos...

Link para o post
Compartilhar em outros sites

Compilo o código?
A biblioteca i2c não é nativa do arduino, você baixou ela do mesmo lugar que pegou o código?

Talvez tb o endereço do i2c do código que você copiou não é o mesmo da placa que você tem
Pega a biblioteca e o comando do mesmo site.
O código está otimizado, mas não sei se quando você colocar mais coisas não vai perder pulsos

A placa mostrada aí, é o que se chama de Arduino Stand Alone (uma pcb montada fazendo o circuito de arduino, mas já com as saídas que você usará)
 

Link para o post
Compartilhar em outros sites
39 minutos atrás, Thiago Miotto disse:

Compilo o código?

sim

 

39 minutos atrás, Thiago Miotto disse:

A biblioteca i2c não é nativa do arduino, você baixou ela do mesmo lugar que pegou o código?

baixei de outro lugar mas estava funcionando bem, agora que é para mostrar a RPM em cima e frequencia em baixo que estava dando este problema, mas fiz uma "gambiarra" aqui e aparentemente deu certo, alterei o código para receber o sinal no pino 3 também, então ficou assim pino 2 recebe o sinal e é multiplicado por 5  para mostrar a frequência e o pino 3 recebe o sinal e é multiplicado por 30 para mostrar RPM só que está bem impreciso o RPM... o código agora é este:

 

Citação

/*
   Curso de Arduino e AVR WR Kits Channel
   
   Aula 53 - Frequencímetro com Arduino e LCD
   
    
   Autor: Eng. Wagner Rambo  Data: Fevereiro de 2016
   
   www.wrkits.com.br | facebook.com/wrkits | youtube.com/user/canalwrkits
   
*/

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h> //inclui biblioteca lcd
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);

// --- Mapeamento de Hardware ---
#define inFreq   2  //entrada para medir a frequência no pino digital 2
#define inFreqrp 3

// --- Variáveis Globais ---
long freq, freqrp, counter, rpm;
int pulseCount;
boolean pulse;


// --- Configurações Iniciais ---
void setup() 
{
  
  pinMode(inFreq,INPUT);  
  pinMode(inFreqrp,INPUT); //Configura como entrada
  
  
  lcd.init();
  lcd.setCursor(2,0);      //Posiciona cursor na coluna 3, linha 1
  
  pulse = 0x01;             //Seta variável de controle
  
} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreq))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%200 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freq = pulseCount*5;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,1);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freq);      //Imprime valor atual da frequência
    lcd.print("Hz");      //Imprime "Hz"
  
    
    pulseCount = 0x00;     //Reinicia contador
  }

  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreqrp))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%200 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freqrp = pulseCount*150;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,0);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freqrp);      //Imprime valor atual da frequência
    lcd.print("rpm");      //Imprime "Hz"
  
    
    pulseCount = 0x00;     //Reinicia contador
  }
  
  
} //end loop

 

 

Eu tinha imaginado isso a um tempo atrás @Thiago Miotto quanto mais coisas estão programadas no arduino maior a possibilidade de erro ou de imprecisão certo? Como não planejo ter o LCD no carro porque já tem conta giros no painel estou pensando em trabalhar apenas com a frequência, por exemplo 99Hz é igual a 3000 RPM então não preciso converter a freq em RPM basta apenas programar para quando atingir uma determinada frequência limitar a rotação do motor, isso vai diminuir o código e pode melhorar a precisão, certo?

Link para o post
Compartilhar em outros sites

 

2 minutos atrás, ComandateGustavo disse:

Eu tinha imaginado isso a um tempo atrás @Thiago Miotto quanto mais coisas estão programadas no arduino maior a possibilidade de erro ou de imprecisão certo? Como não planejo ter o LCD no carro porque já tem conta giros no painel estou pensando em trabalhar apenas com a frequência, por exemplo 99Hz é igual a 3000 RPM então não preciso converter a freq em RPM basta apenas programar para quando atingir uma determinada frequência limitar a rotação do motor, isso vai diminuir o código e pode melhorar a precisão, certo?

Eu já penso o seguinte, como você está começando, é melhor visualizar a informação, as vezes temos certeza que o código está correto, mas as vezes um errinho de sintaxe f... tudo, ou até uma distração trocando um menor que (<) por um maior que (>).

Creio que esteja sobrando pinos. Usa o display lcd c/ os 7 pinos tradicionais

Link para o post
Compartilhar em outros sites
8 minutos atrás, Thiago Miotto disse:

Creio que esteja sobrando pinos. Usa o display lcd c/ os 7 pinos tradicionais

está sobrando sim vou usar só mais dois pinos para o projeto na verdade...

 

9 minutos atrás, Thiago Miotto disse:

Eu já penso o seguinte, como você está começando, é melhor visualizar a informação, as vezes temos certeza que o código está correto, mas as vezes um errinho de sintaxe f... tudo, ou até uma distração trocando um menor que (<) por um maior que (>).

na verdade esse código funcionou depois de dar vários erros, as vezes faltava ponto e virgula, na outra era parenteses e como dava erro algumas vezes aparecia também o problema na telinha do programa do arduino, em alguns casos tinha que perguntar pro tio google, mas é uma boa ideia, vou continuar com este programa e usar o LCD, depois de programar tudo e ter certeza que funciona bem aí vou comprar um arduino Nano deixar só a parte do programa em si sem o LCD pra ficar mais compacto e preciso, e este arduino UNO com LCD vou usar para outros projetos (tem bastante coisa que quero fazer usando arduino)

Link para o post
Compartilhar em outros sites
  • Membro VIP

De minha parte não domino as funções mastigadas do arduíno e cia portanto não analisei o fonte e nem vi comentário seu sobre se entendeu o simples funcionamento de um frequencímetro que disse lá atrás

Em 05/04/2021 às 20:21, .if disse:

A teoria (que acho que já mencionei) é simples: um contador e um timer: de tempos em tempos (timer) pega o valor do contador, armazena numa variável e zera o contador

 

Depois (e se) entender, podes criar seu próprio medidor de freq com boa precisão e bem minimalista. Pra isso, como sempre, vai ter que entender e dominar o mínimo do hw em questão do mc.

Timer%20-%20Common.JPG

https://sites.google.com/site/qeewiki/books/avr-guide/common-timer-theory

 

 

  • Obrigado 1
Link para o post
Compartilhar em outros sites
  • Membro VIP

Puts... acabo de tentar ajudar um outro garoto aqui...

... e no link que postei pra ele tem um medidor de freq minimalista (que pode ser ainda mais minimizado mas não vem ao caso)

Img_PIC16F688_Lab7_CounterOP.jpg

http://embedded-lab.com/blog/lab-7-timers-and-counters-part-1/

 

Apesar de ser pra pic mas a ideia é a mesmíssima inclusive a interface lhe pode ser norteadora

Circuit_PIC16F688COunterIP.jpg ainda que eu prefira o opto

  • Curtir 1
Link para o post
Compartilhar em outros sites
11 horas atrás, ComandateGustavo disse:

Eu tinha imaginado isso a um tempo atrás @Thiago Miotto quanto mais coisas estão programadas no arduino maior a possibilidade de erro ou de imprecisão certo? 

 

Não é verdade....

 

O que complica em qualquer programa é o desconhecimento de como funciona junto tudo o que existe dentro de um microcontrolador, no caso os Timers e as interrupções.

 

Essa enorme facilidade de se usar bibliotecas prontas facilita muito o uso do Arduino, mas muitas vezes o programador tenta fazer coisas no programa sem saber que a biblioteca pode ter acionado Timers e interrupções que estão acontecendo em tempo reaL, modificando os tempos em que as medidas são feitas, e assim causando erros nas contas.

 

Quanto maior o desconhecimento sobre isso, maiores as interferências nos programas e piores os resultados.

 

Como disse minha velha companheira de Fórum @.if, basta saber usar os Timers do Arduino, um como base de tempo, e outro como Counter de pulsos externos que chegam do seu optoacoplador.

 

Para essas frequências baixas como as que você está usando, é bem simples, o Counter faz a contagem dos pulsos totalmente por hardware, e não interfere em nada no seu programa.

A base de tempo, normalmente o Timer1, gera a interrupção de tantos em tantos milisegundos ( voce escolhe ) para que você leia a contagem do Counter e zere o seu conteúdo, e saindo dessa interrupção o seu programa simplesmente tem de fazer a conta, tantos pulsos em tantos milisegundos, e pronto chegou no valor da frequência.

 

Repare que esta simples solução envolve o uso de dois Timers, e duas interrupções ...

 

Paulo

 

 

Link para o post
Compartilhar em outros sites
1 hora atrás, aphawk disse:

Essa enorme facilidade de se usar bibliotecas prontas facilita muito o uso do Arduino, mas muitas vezes o programador tenta fazer coisas no programa sem saber que a biblioteca pode ter acionado Timers e interrupções que estão acontecendo em tempo reaL, modificando os tempos em que as medidas são feitas, e assim causando erros nas contas.

 

Quanto maior o desconhecimento sobre isso, maiores as interferências nos programas e piores os resultados.

Ahn agora entendi, basicamente a biblioteca são arquivos prontos para facilitar a programação, mas se a pessoa nao conhecer bem a biblioteca que está usando ela pode usar uma biblioteca que além da função desejada executa em segundo plano algumas outras funções que podem não ser uteis para aquilo que a pessoa está programando, essas funções podem atrapalhar na execução do código que a pessoa criou, e isso pode dar erro nas contas certo? @aphawk

 

3 horas atrás, .if disse:

um medidor de freq minimalista

 

5 horas atrás, .if disse:

A teoria (que acho que já mencionei) é simples: um contador e um timer: de tempos em tempos (timer) pega o valor do contador, armazena numa variável e zera o contador

@.if acabei não comentando na outra mensagem, mas veja se está correto o raciocínio, existe o contador de pulsos e o temporizador, no caso do meu código é 200 milisec então o contador verifica quantos pulsos ocorreram dentro de 200 milisec, após isso ele zera novamente o contador para recomessar a contagem, e paralelamente a isso existe outra parte do código que vai multiplicar por 5 o numero de pulsos contados para aparecer no LCD qual a frequência por segundo, e pelo que li quanto mais minimalista, mais "puro" o frequêncímetro for, melhor vai ser a precisão, certo?

Link para o post
Compartilhar em outros sites
  • Membro VIP
55 minutos atrás, ComandateGustavo disse:

quanto mais minimalista

Quanto menos conta fizer.. sim. Como você não agüenta esperar 1 segundo, ao multiplicar a contagem de 0.2S por 5 perde a precisão.

 

Ao usar uma interrupt fica mais inteligente, usa pouco recurso, o dado sai automático e alguns etc. Algo como

unsigned int freq;

void interrupt_do_TIMER0_1_segundo() //reduza o intervalo pra freq maiores
{
freq=TIMER1; //16 bits. Entrada num pino do mc
TIMER1=0;
}

void setup_do_hw()
{
//...
}

void main(void)
{
setup_do_hw();
//...
for(;;) printf_no_display_ou_similar(freq);
}

Não sei se é possível deixar mais minimalista que isso

 

No seu caso deveria esperar o impraticável 1 minuto. Se precisão for precisa meeeêsmo, uma alternativa muito lôca (e complexa que não detalho) é medir o período sabendo-se a fórmula P=1/f aí sim compensa fazer o mc quebrar a cabeça e fazer continhas até mesmo com fracionários ... apesar de ele odiá-los

 

  • Curtir 1
Link para o post
Compartilhar em outros sites
23 minutos atrás, .if disse:

Como você não agüenta esperar 1 segundo, ao multiplicar a contagem de 0.2S por 5 perde a precisão.

aguento esperar sim rsrs dessa eu não sabia, então só tirar essa multiplicação por 5 e deixar o time de 1000milisec já aumenta a precisão? 1 sec a mais ou a menos não vai atrapalhar, bem interessante vou alterar o código pra esperar 1sec e já mostrar a freq no display pra ver como fica.

 

26 minutos atrás, .if disse:

Ao usar uma interrupt fica mais inteligente, usa pouco recurso, o dado sai automático

achei que usando interrupt algumas coisas ficariam desabilitadas, pelo jeito me enganei.

 

31 minutos atrás, .if disse:

Não sei se é possível deixar mais minimalista que isso

vou tentar também fazer usando como base seu código e ver como fica, parece bem mais promissor, e vou prosseguir depois como planejado, usar LCD para conferir e ver se funciona certinho sem erros, se estiver tudo ok aí vou colocar em um arduino Nano para ficar compacto sem display para funcionar bem.

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Na verdade podem acontecer o inverso também : seu programa pode usar alguns recursos que interferem no funcionamento da biblioteca !

 

A maneira mais segura de se fazer um programa é usar as interrupts para coisas que tem de ser decididas ou feitas de maneira muito rápida, e é usar flags para que o programa principal faça "consultas" para as Interrupts , por exemplo no caso do Timer que será usado como Counter :

Aproveitando o seu exemplo de se fazer contagens dos pulsos por apenas 0,2 segundos, dentro da interrupção eu sinalizaria ao programa principal que já se passou o período da contagem e que o resultado dessa contagem está pronto para ser usado, e o programa principal vai ler essa variável e é usar nas suas contas, ao mesmo tempo que zera o Flag; assim, após fazer as contas e mostrar no display, o programa principal.fica novamente esperando que a contagem de 0,2 segundos seja feita, quando o Flag será novamente acionado, e o programa principal pode ler a contagem e prosseguir.

 

Outro exemplo seria uma função de delay; se ela usa o Timer0 como uma base de tempo para obter tempos precisos, se a sua biblioteca desabilita as interrupções para garantir que nada seja alterado enquanto ela faz alguma conta, os seus delay sofreria alteraçoes; imagine se você usa um desses delays no valor de 0,2 segundos como a sua base de tempo de contagem dos pulsos, o seu resultado pode variar bastante devido ao tempo que o Timer0 fique sem conseguir gerar uma interrupção...

 

Sempre falamos que o ideal é primeiro conhecer todo o hardware interno de um microcontrolador, ver como os diversos módulos funcionam, ver as Interrupts que cada módulo tem, e algo muito importante é saber quando deixar uma interrupção acontecer DENTRO de outra interrupção, e como prever stacks de memória para que isso aconteça de maneira segura.

Isso é um recurso muito poderoso e contribui bastante para se ter a precisao necessária em um projeto.

 

Esse conhecimento só se obtém com bastante prática e uma boa dose de estudo de datasheets...

 

Paulo

  • Curtir 1
Link para o post
Compartilhar em outros sites

@ComandateGustavo 

Atmega tem precisão sim! Eu construí muitos cdis programaveis com atmega, pic, Motorola hc e outros.

 

O rpm varia MUITO abaixo de 3000rpm, é praticamente IMPOSSÍVEL você travar um motor em 1000 ou 2000 rpm. Solução? Vai ter que trabalhar fazendo media!

 

Outra coisa.... Arduino não serve para o produto final, apenas para ideias, você vai ter que implementar alguns filtros.

 

O circuito que fiz pra você vai te ajudar muito, é uma interface para hall ou relutor (sensor de bobina que gera AC)

 

O diodo na base do transistor bc337 deverá ser 1n4148 ou outro bem rápido.

 

O filtro RC chamado de pre ênfase vai filtrar ruídos que aparecem abaixo da tensão, ruídos que podem vir da vela de ignição etc..

 

Com esse filtro ligado, você cria uma interrupção para o microcontrolador PARAR TUDO O QUE ESTA FAZENDO e contabilizar o pulso.

 

Se você não usar interrupção e o micro estiver fazendo outra coisa ele não vai contar o pulso, aí atrapalha demais.

 

Após implantar interrupção, trabalhe com uma função para fazer uma media dos pulsos

 

Screenshot_20210416-092021.thumb.png.c204eb59f5ea77a057bdd142598f13ac.png

  • Curtir 1
Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!