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: 4339

Responder esta

Respostas a este tópico

Rui boa tarde, 

Testando  o Frequencimetro versão 7. A segunda coluna foi a medição com o meu Scope Tektrronix. 

Bits = 5 ou 4 e Duty Cycle = 50%. Escolhi valores aleatórios. 

Pode melhorar. KKK. Mas está muito bom! Parabéns. 

Escala 4 : 100.00 Hz   = 100,001 Hz 

Escala 4 : 550.40 Hz  = 550,02 Hz 

Escala 3 : 1.00 KHz    = 1,0000 KHz 

Escala 3 : 1.25 KHz    = 1,2500 KHz 

Escala 3 : 2.65 KHz   = 2,65000 KHz

Escala 3 : 5.84 KHz   = 5,8400 KHz 

Escala 3 : 10.00 KHz  = 10,0001 KHz

Escala 3 : 15.76 KHz  = 15,7563 KHz

Escala 3 : 27.83 KHz   = 27,8348 KHz 

Escala 3 : 52.75 KHz   = 52,7534 KHz 

Escala 3 : 100.00 KHz  = 100,001 KHz 

Escala 2 : 579.67 KHz  ou Escala 2 : 580.07 KHz   = 579,190 KHz

Escala 2 : 894.94 KHz   = 893,861 KHz 

Escala 1 : 1.01 MHz   = 1,00001 MHz 

Escala 1 : 1.60 MHz   = 1,580026 MHz 

Escala 1 : 2.78 MHz  = 2,75271 MHz 

Escala 1 : 5.05 MHz  = 5,00004 MHz 

Escala 1 : 10.08 MHz ou  Escala 1 : 10.10 MHz = 10,0001 MHz 

Escala 1 : 20.19 MHz ou Escala 1 : 20.21 MHz  = 20,0002 MHz 

Escala 0 : 37.45 MHz ou Escala 0 : 40.34 MHz  = 40,0003 MHz 

Rui, uma pergunta :

Realmente precisa desse fator de conversão para cada escala?

Dessa forma a medição fica meio empírica, não? Talvez seja por isso que está apresentando erro em algumas escalas. 

Pesquisando uma linha do seu programa :

pcnt_config.pulse_gpio_num = PCNT_INPUT_SIG_IO;

Encontrei isso:

https://github.com/pycom/esp-idf-2.0/blob/master/examples/periphera...

Viu isso ? 

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-ref...

Boa tarde 

https://github.com/pycom/esp-idf-2.0/blob/master/examples/periphera...

esta rotina está escrita para IDF-ESP.

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-ref...

e eu usei este link pra entender as APIs do pcnt.

RV

Rui boa noite! 

Acho que descobri um método para medir a frequencia com maior precisão e sem usar o fator de conversão! 

Sabendo-se que o clock do Timer é de 80 MHz (período 12,5 ns). 

Por exemplo, para a medição de frequencia de 123 Hz:


case 4: // Escala 4
    tempo = 80000; // tempo de medida dos pulsos
    prescaler = 1000; // valor do Prescaler
    fator = 1; // Fator de correcao
     indicador = "Hz "; // Indicador de Hz
     break; // Finaliza e retorna

80000 x 12,5 ns = 0,001 seg

Rui boa noite, 

Você me perguntou qual a maior frequencia conseguida com o programa ESP_OscilatorV03.ino,

Eu havia lhe informado que é 40 MHz. 

Me esqueci que com outro programa eu consegui 80 MHz e 64 MHz

I2S0 Clock (master clock) up to 80MHz derived from APLL clock

https://www.esp32.com/viewtopic.php?f=18&t=14185&p=55290&am...

 

Rui bom dia, 

Não entendi ainda como funciona o seu frequencímetro. Para um sinal de 440 Hz, ele faz essas várias leituras até chegar no valor correto. 

Escala 2 : 0 KHz
Escala 3 : 0 KHz
Escala 4 : 0 Hz
Escala 4 : 56 Hz
Escala 4 : 56 Hz
Escala 4 : 56 Hz
Escala 4 : 56 Hz
Escala 4 : 495 Hz
Escala 4 : 495 Hz
Escala 4 : 495 Hz
Escala 4 : 495 Hz
Escala 4 : 440 Hz
Escala 4 : 440 Hz
Escala 4 : 440 Hz

Saberia me explicar? Obrigado. 

Bom dia  José Gustavo Abreu Murta,

isto acontece em frequências baixas por causa do tempo de leitura.

Estou revisando o projeto e refazendo algumas rotinas.

Obrigado pelos feedbacks. Ajudam muito.

RV

Rui boa noite, 

Estava tendo dificuldade em entender algumas partes do seu programa. Refiz alguns comentários. 

Após a contagem de tempo pelo Timer, gera uma interrupção e executa a função cb_timer

void startTimer()                                                // Rotina de inicializacao do timer
{
   timer = timerBegin(0, prescaler, true);            // usa o timer 0 ,  80 Mhz / prescaler, - true = incrementa contador 
   timerAttachInterrupt(timer, &cb_timer, true);   // endereço da função a ser chamada pelo timer / true gera uma interrupção
   timerAlarmWrite(timer, tempo, true);              // Define o tempo de contagem / true para repetir o alarme
   timerAlarmEnable(timer);                               // Habilita timer 0
}

Rui boa noite, 

Estudei o seu programa e entendi como funciona.

Tomei a liberdade em fazer várias alterações. 

Consegui medir frequências com boa precisão de 1 Hz a aproximadamente 900 KHz.

Parei, pois estou cansado. Depois continuo. Anexei o arquivo ESP32_FrequencimetroV09.INO

Para melhorar a escala, dê um reset no ESP32. Depois resolvo isso. 

Abraços. 

// Escala 2 de 327670 Hz a XXXX KHz tempo 10.000 prescaler 80
// Escala 3 de 32767 Hz a 327670 Hz tempo 100.000 prescaler 80
// Escala 4 de 1 Hz a 32767 Hz tempo 1.000.000 prescaler 80

Contador = 1891 Escala 4 : 1891.0 Hz   (Medido = 1891 Hz) 

Contador = 12457 Escala 4 : 12457.0 Hz  (Medido = 12456,3 Hz)

Contador = 5614 Escala 3 : 56140.0 Hz  (Medido = 56140 Hz)

Contador = 5433 Escala 2 : 543.3 KHz   (Medido = 543298 Hz) 

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço