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:
Boa tarde Rui,
O registrador do prescaler tem 8 bits, mas varia de 1 a 256 somente. Não pode usar Zero, pois 2^0 = 1.
Como é um divisor de frequencia, não faz sentido dividir por 1.
num_of_pulse
: count time between rising/falling edge between 2 *(pulses mentioned), counter uses APB_CLKVeja na versão 4.2 do Technical Reference a descrição dos bits desse registrador, para o Capture 0.
pag 477
https://www.espressif.com/sites/default/files/documentation/esp32_t...
Gustavo,
no exemplo usa-se o valor 0.
RV
prescale Prescal value, 0 to disable.
2^0 = 1
Valor /1 = Valor
Rui, acho que esse prescaler com 32 bits foi um erro de definição de variável.
Não vejo problema algum, desde que respeite a variação de 1 a 256 somente.
Aqui estão os códigos fontes - a origem das definições das variáveis :
(The hal is not public api, don't use in application code.)
https://github.com/espressif/esp-idf/blob/master/components/soc/inc...
https://github.com/espressif/esp-idf/blob/master/components/soc/src...
* Set the prescale of the input signal to capture.
*
* @param mcpwm Address of the MCPWM peripheral registers.
* @param cap_sig The prescaled signal to capture, 0-2.
* @param prescale Prescal value, 0 to disable.
*/
static inline void mcpwm_ll_capture_set_prescale(mcpwm_dev_t *mcpwm, int cap_sig, uint32_t prescale)
{
mcpwm->cap_cfg_ch[cap_sig].prescale = prescale;
}
Rui, Mudei isso no seu programa. Acho que melhorou.
//Serial.println(evt.capture_signal - previous_cap_value);
void loop()
{
Serial.println(current_cap_value);
}
Bom dia Rui,
O frequencímetro esta funcionando!!
Com duas casas decimais! CARACA!!!
void loop()
{
float frequencia = 100000000000 / (current_cap_value * 6.25); // Periodo de 160 MHz = 6.25 ns
Serial.print(frequencia); Serial.println(" Hz");
delay (200);
}
Rui boa tarde,
Descobri que a entrada do frequencimentro é muito sensível!
O meu frequencimetro estava funcionando perfeitamente.
Tirei as pontas de provas do scope, bagunçou tudo!
Deve ser um problema de impedância. Estou pesquisando.
Inseri um resistor de 1 K ohms entre o pino de entrada GPIO23 e o terra. Melhorou bastante!
Veja que a configuração de pulldown estava desativada.
É meio difícil acompanhar o raciocínio de vocês.
Vou acabar sendo aquele cara que pega o código pronto. kkkkkk
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por