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

Responder esta

Respostas a este tópico

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. 

  • Input capture signal prescaling (from 1 to 256).
  • num_of_pulse: count time between rising/falling edge between 2 *(pulses mentioned), counter uses APB_CLK

Veja 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;

}

Boa noite pessoal.

Este sketch está bem magrinho.

MCPWM8.ino

A serial está em 230400 BPS.

RV

Emagreceu mais ainda.

serial  115200.

MCPWM9.ino

RV

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);
}

Esse é o Sketch que estou usando :

ESP32_MCPWM9a.ino

Parabéns pela conquista! 

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. 

Boa tarde

Gustavo, esta é a versão com controle do Interrupt do CAP0.

MCPWM10.ino

RV

É meio difícil acompanhar o raciocínio de vocês.

Vou acabar sendo aquele cara que pega o código pronto. kkkkkk

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço