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
Tags:
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
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)
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por