Boa noite pessoal.

Hoje precisei de um frequencímetro, e como não tinha um, resolvi desenvolver um

projeto de um.

Depois de apanhar um pouco cheguei a um modelo que me atende.

Mas não sei se ele tem boa precisão.

Tentei comparar os valores com o osciloscópico, mas o meu não ajuda muito.

Então resolvi disponibilizar o sketch aqui, e se alguém que tenha um frequencímetro tiver a 

paciência de montar este aqui e comparar com o seu eu agradeceria.

De qualquer forma fica aqui um projeto de um frequencímetro para Arduíno (UNO/MEGA/Mini).

Pretendo modifica-lo para funcionar no ESP8266 e no ESP32.

RV

Frequencimetro8.ino

Exibições: 876

Responder esta

Respostas a este tópico

KKKK, nós estamos queimando todos os neurônios!

Mas o frequencímetro esta ficando Show! Aguarde

O mais preciso que eu já vi!

Tiago, estou do mesmo jeito aqui ! Mais vale a pena. RV e GM estão se aprofundando mesmo.

Excelente Gustavo, tô acompanhando.

Bom dia pessoal,

esta versão apresentou muito bons resultados.

Fiz algumas modificações no sketch e comentei as principais linhas dele.

Ela permite que pelo monitor serial vc varie o prescaler para a leitura das frequências

e com isto possamos testar as frequências e ver qual melhor prescaler para cada caso.

O prescaler máximo é de 255.

Qto maior a frequência usa-se o prescaler maior para melhor resultado.

1HZ  prescaler = 0

40MHz prescaler = 255.

Deve-se usar um resitor de 1K no port de entrada do CAP,  

Mas o limite do ESP32 para leituras de frequências é de 40 MHz, a não ser que se use divisor externo.

O menor tempo de leitura na entrada dos GPIOS é de 12,5 nseg. (80/2 MHz)

Lembrando que o PIC16F628A, na entrada do port RA4  RA4/T0CKI/CMP2 , é de 10 ns, 

podendo portanto, receber pulsos de até  50 MHz (100/2  MHz)

MCPWM11.ino    versão corrigida pequeno erro.

RV

Boa noite Rui, 

Testei o seu programa MCPWM11.ino  

Esta ficando muito bom!

Só uma curiosidade,Na minha versão eu havia calculado a frequencia dessa forma :

frequencia = (psclr * 1000000) / (current_cap_value * 0.00625);

(dessa forma, eu faço menos cálculos) 

160 MHz = 1.000.000 / 0,00625 

Através de várias medições eu havia concluído que o Contador realmente perde alguns pulsos durante o processo de manuseio da interrupção, conforme esperado. 

Calculei uma relação de erro e mudei o valor acima para 0.00624995. Como não gosto desse tipo de "correção", não avancei nos testes. 

Acho que o próximo passo, é botar uma inteligência no programa, para ele mesmo escolher o valor do prescaler, dependendo do valor da frequência. 

Ainda estou com dúvidas sobre  o uso do prescaler. Farei uma planilha para tirar minhas dúvidas. 

Abraços! 

Simplificando ainda mais:

frequencia = (psclr * 160000000) / current_cap_value;

Os valores da fequencia ficaram bem precisos! Medi com o scope. 

Mas tem que escolher o valor correto do prescaler...

Obs = valores divisores ou multiplos de 16 para o prescaler oferecem valores mais precisos de frequências. 

Corrigindo :

frequencia = (psclr * 1600000) / (float) current_cap_value * 100;

A multiplicação do prescaler estava estourando a variável. 

Caraca! 

Os valores de prescaler de 16 para baixas frequencias e o valor de 160 para altas frequências dão excelentes resultados! 

frequencia = (psclr * 1600000) / (float) current_cap_value * 100;

Bom dia Gustavo,

neste algorítimo  " frequencia = (psclr * 1600000) / (float) current_cap_value * 100;" ,

se psclr for 0 (zero) a divisão vai dar erro.

E zero é o valor de maior contagem do clock,

A  divisão, preferencialmente, deve estar entre parêntesis:

 " frequencia = ((psclr * 1600000) / (float) current_cap_value) * 100;" ,

Para evitar operações com o valor zero é que usei a variável mtpl.

RV

Opa Rui, bom dia, 

Na fórmula que eu usei o multiplicador por 100 fica no divisor. 

frequencia = (psclr * 1600000) / (float) current_cap_value * 100;

ou 

frequencia = (psclr * 1600000) / ((float) current_cap_value * 100);

Gustavo,

se prscr for 0, então  0 * 1600000  = 0.  e então,

frequencia = 0 / ((float) current_cap_value * 100);

RV

Isso eu sei... 

No primeiro ano do segundo grau, em Matemática  eu tirei 95 pontos no total de 100! KKK

Depois que eu tinha tomado pau em matemática no ano anterior.

Eu ficava conversando demais nas aulas...

Foi a minha revanche.

Essa fórmula que citou vai dar um outro resultado (diferente da minha formula). 

frequencia = ((psclr * 1600000) / (float) current_cap_value) * 100;

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2020   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço