RuiViana

Texto_frequencimetro

Jul 15th, 2020
1,357
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Atual ESP32_FreqMeter_0.33.0.ino    Antigo NovoTeste08.ino  
  2.  
  3. // V01 Teste com pcnt
  4. // V02 teste com timer
  5. // V03 Teste de interrupt
  6. // V04 Definicao com escala baseada no prescaler
  7. // V05 Calculos com interrupt
  8. // V06 Versão inicial do frequeciimetro com ESP32 nao esta preciso , Seleciona a escala.
  9. // V07 Modificacoes no loop pra melhorar a escala  funcionou bem
  10. // V07_A Fixando o valor de prescaler em 80   Criada 5a escala
  11. // V07_B teste de erro na rotina pcnt
  12. // V08 Sem escala, fixando o prescaler e o timer e contando os overflows
  13. // V09 Limpando a V08
  14. // V10 Testes com rotina de contagem de overflow
  15. // V11 Teste de overflow de pcnt e timer  funciona  teste com frequenci DE 10 khZ  Copia do frequencimetro 2 modificado
  16. // V12 Resumir e limpar V11  enroscou a partir de 300 KHz
  17. // V13 Consegui bom resultado deste aqui até 20MHz Usando RMT com referencia de tempo
  18. // V14 Interrupt de pcnt e contar tempo de RMT
  19. // V15 Novo teste com RMT
  20. // V16 Qtde de pulsos entre ocorrencias de interrupt
  21. // V17 Outro teste de ocorrencias de interrupt
  22. // V18 Teste com rotina de interrupt com poucas funcoes
  23. // V19 Teste com esp-timer  e interrupt no fim do pulso do esp-timer
  24. // V20 Teste = V19
  25. // V20a Preparada para IDF
  26. // V20aGustavo Sem interrupt de esp-timer
  27. // V21 Inclusao de LCD com diretivas de compilacao
  28. // 0.0.21 = V21
  29. // 0.0.22  Pontuação do numero
  30. // V23 Teste com 2 rotinas de pontuacao
  31. // V24 Parametros de ledc calculados   Diretivas de compilacao para ARDUINO e IDF
  32. // V25 Nova rotina de pontuação
  33. // V26 Usando printf na rotina de pontuacao
  34. // V27 Teste com IDF  Compilou com a IDF do CEI
  35. // V28 Teste com nova rotina de pontuacao e printf
  36. // V30 Rotina de teste depois de erro no IDF e limpeza de variaveis desnecessarias e organização
  37. // V31 Nova Diretiva de compilação  ARDUINO   Inclusão de LCD  ok
  38. // V32 Novamente com rotinas de LCD Mudanca do formato dos port GPIO
  39.  
  40. // V33 Calculo de Resolucao com base na frequencia e duty de 50%, inclusao de LCD I2C com diretiva e teste gpio matrix incluido
  41.  
  42.  
  43. /*
  44.  
  45.   Desenvolvedores: Rui Viana e Gustavo Murta   08/jul/2020
  46.  
  47.   Para desenvolver este projeto, foram aproveitadas partes de códigos dos desenvolvedores
  48.   abaixo referenciados.
  49.  
  50.   O Projeto:
  51.   Um frequencímetro usando ESP32, sem necessidade de escalas e mostrando até 8 dígitos,
  52.   medindo com precisão até 20MHz ou mais.
  53.   Este projeto pode ser compilado com a IDE do arduino ou com o IDF
  54.  
  55.   Definições:
  56.  
  57.   #define PCNT_INPUT_SIG_IO     GPIO_NUM_34                                 // Freq Meter Input GPIO 34
  58.   #define LEDC_HS_CH0_GPIO      GPIO_NUM_25
  59.  
  60.   #define PCNT_INPUT_CTRL_IO    GPIO_NUM_35                                 // Count Control GPIO HIGH=count up, LOW=count down GPIO 25
  61.   #define OUTPUT_CONTROL_GPIO   GPIO_NUM_32                                 // Saida do timer GPIO 2
  62.  
  63.   PORT de entrada do frequencímetro PCNT_INPUT_SIG_IO (GPIO 34)
  64.   PORT de entrada de controle PCNT_INPUT_CTRL_IO      (GPIO 35)
  65.   PORT de saída do timer OUTPUT_CONTROL_GPIO          (GPIO 32)
  66.   O PORT de entrada de controle (GPIO 35) deve ser ligado ao PORT de saída do timer (GPIO 32).
  67.   Estes são os ports usados no projeto, mas podem ser modificados para sua melhor conveniência.
  68.  
  69.   O frequencímetro é dividido em 5 partes:
  70.     1. Contador de pulsos;
  71.     2. Controle de tempo de contagem;
  72.     3. Impressão do resultado;
  73.     4. Espaço para outras funções.
  74.     5. Gerador de sinais programado para 50.000  Hz
  75.  
  76.   1. O contador de pulso usa o pcnt do ESP32.
  77.      O pcnt tem os seguintes parâmetros:
  78.       a. port de entrada;
  79.       b. canal de entrada;
  80.       c. port de controle;
  81.       d. contagem na subida do pulso;
  82.       e. contagem na descida do pulso;
  83.       f. contagem só com o controle em nível elevado;
  84.       g. limite máximo de contagem.
  85.  
  86.   2. O Controle de tempo de contagem usa o esp-timer.
  87.      O esp-timer tem o seguinte parâmetro:
  88.       a. controle do tempo;
  89.  
  90.   5. Gerador de frequncias para testes usa o ledc
  91.      O ledc tem o seguinte parâmetro:
  92.       a. port de saida;
  93.       b. canal de lcd;
  94.       c. frequencia;
  95.       d. resolucao do ledc;
  96.       e. duty cycle em 50%;
  97.  
  98.  
  99.   Funcionamento:
  100.     O port de controle de contagem em nível alto, libera o contador para contar os pulsos que chegam no port de entrada de pulsos.
  101.   Os pulsos são contado tanto na subida quanto na descida do pulso, para melhorar a media de contagem.
  102.   O tempo de contagem é definido pelo esp-timer, e esta' definido em 1 segundo, na variável janela.
  103.   Se a contagem for maior que 20000 pulsos durante o tempo de contagem, ocorre overflow e a cada overflow que ocorre
  104.   e' contabilizado na variável multPulses, e o contador de pulso retorna a zero continuando a contar.
  105.     Quando o tempo de leitura termina, uma rotina é chamada e o valor do no contador de pulsos e' lido e salvo,
  106.     um flag e' ligado indicando que terminou a leitura dos pulsos
  107.  
  108.     No loop, ao verificar que o flag indica que terminou a leitura dos pulsos, o valor é calculado multiplicando
  109.   o numero de overflow por 20000 e somando ao numero de pulsos restantes e dividindo por 2, pois contou 2 vezes.
  110.   Como o pulsos são contados na subida e na descida, a contagem e´ o dobro da frequência.
  111.     Na frequência é insserido pontos e impressa no serial monitor.
  112.   Os registradores são resetados e o port de controle de entrada é novamente elevado para nível alto e a contagem de
  113.   pulsos se inicia.
  114.  
  115.   Tem também um gerador de sinais que gera 50.000 Hz, e pode ser usado para testes.
  116.   Este gerador pode ser alterado para gerar frequencias até 40 MHz.
  117.   Usamos o recurso ledc do ESP32 para gerar frequencia que pode ser usada como teste.
  118.     O valor da frequencia base é 50.000 Hz, mas pode ser digitavo outo valor no serial monitor
  119.     O duty foi fixado como 50%
  120.     A resulução é calculada.
  121.   O Port de saida deste gerador é definido na linha #define LEDC_GPIO.
  122.   Atualmente está definido como GPIO 25.
  123.  
  124.   O compilador usa as diretivas de compilacaoo para selecionar:
  125.    Compilador Arduino ou IDF    automatico
  126.    Uso de LCD                   LCD_ON ou LCD_OFF
  127.    Uso de LCD I2C               LCD_I2C_ON ou LCD_I2C_OFF
  128.  
  129.   Referências:
  130.   author=krzychb https://github.com/espressif/esp-idf/tree/master/examples/peripherals/pcnt
  131.   resposta by Deouss » Thu May 17, 2018 3:07 pm no tópico https://esp32.com/viewtopic.php?t=5734
  132.   Gerador de sinais Gustavo https://github.com/Gustavomurta/ESP32_frequenceMeter/blob/master/ESP32OscilatorV03.ino
  133.   Formatação de numero https://arduino.stackexchange.com/questions/28603/the-most-effective-way-to-format-numbers-on-arduino
  134.   https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/esp_timer.html
  135.   https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/pcnt.html
  136. */
RAW Paste Data