Olá pessoal.

Existe um tutorial aqui no LdG, aberto pelo Gustavo, que ensina a usar um Arduino como um analisador lógico

http://labdegaragem.com/profiles/blogs/tutorial-analisador-l-gico-c...

O tutorial é muito bem feito, como aliás é tudo que o Gustavo publica aqui.

Daí outro dia eu tive um ideia meio maluca.

Usar o ESP32 como um analisador lógico baseando neste tutorial.

Mas aí veio outra ideia mais maluca.

Ler diretamente os ports do ESP32  na velocidade do clock dele (320 Mhz).

Dei uma estudada como funcionam os port do ESP32 e verifiquei que usando uma instrução do pacote ESP-IDF, mesmo rodando na IDE do Arduíno eu conseguiria ler os ports todos ao mesmo tempo.

Em principio funciona assim:     

    Crio uma matriz de "n" elementos;     

    faço um loop de "n"  vezes;     

       leio os ports do ESP32 e guardo o valor nesta matriz;     

       a instrução REG_READ(GPIO_IN_REG);  lê os 32 bits dos ports do ESP e      

       o valor é salvo na matriz endereçada pelo Índice do loop;     

   ao terminar o loop;     

      faço.outro loop de "n"  vezes;     

      e imprimo os bits de cada valor guardado na matriz.

Futuramente o valor ao invés de imprimir o valor ele será plotado em uma tela gráfica.

A velocidade de leitora deveria ser muito grande.

Para testarmos, o Gustavo usou um recurso que ele descobriu fazer parte do pacote do ESP32.

Voce define um valor de PWM  e define qual port será a saída.

E ao carregar o código o PWM roda na velocidade que você definir, e roda sem ocupar o processador.

No teste eu " jumpiei" o port 18 (saída PWM) com o port 4 (entrada).

Em principio deveria funcionar e a leitura deveria ser perto de 40 mHz.

Mas (que coisa, sempre tem um mas).

Mas ao testarmos (eu e o Gustavo), verificamos que não é bem assim.

Ficamos perguntando o porque.

Bom, acho que consegui entende.

Na minha teoria favorita (todo mundo tem uma teoria favorita),

funciona assim:

Uma instrução de maquina  (ou talvez mais de uma) le os posts             

160MHz/1 =  160 MHz;

Algumas instruções guardam o valor na matriz (chuto 4)       

4 + 1 = 5    160MHz/5 =  32 MHz;

Algumas instruções para "for" (chuto 20)             

5 + 20 = 25  160MHz/16 = 6,4 MHz.
e se tiver mais algumas, o valor de leitura será menor ainda.

Pensamos em usar DMA, pois assim os dados vão direto para a memoria sem latência

de processador, mas ainda está em estudos.

Agradecemos palpites.

Anexo segue o sketch que usamos para os testes iniciais.

RV  e Gustavo

ESP32_TwoCore6.ino

Exibições: 2179

Responder esta

Respostas a este tópico

Bom dia Rui, 

Obrigado pelo elogio. 

Corrigindo a frequência máxima do ESP32 é 240 MHz. 

"Ler diretamente os ports do ESP32  na velocidade do clock dele (320 Mhz)."

Nos testes que eu fiz consegui uma frequencia máxima de amostragem de 10 MHz com a frequência do clock do ESP32 com 160 Mhz. 

Testes usando somente um Core com CPU frequency = 160 Mhz
Sample rate = 10 Mhz (cada amostra de 100 ns).
Ficou muito estável!
Frequencia máxima medida = 5 Mhz

Meus testes - ONE Core
CPU 240 MHz - sample rate 13,33 Ms/s - freq máxima capturada = 6,66 MHz
CPU 160 MHz - sample rate 10 Ms/s - freq máxima capturada = 5 MHz
CPU 80 MHz - sample rate 6,024 Ms/s - freq máxima capturada = 3 MHz

Teoria sobre frequencia de amostragem =================================

A frequencia de amostragem tem que ser no mínimo o dobro da frequencia a ser medida. 

What the Nyquist Criterion Means to Your Sampled Data System Design
https://www.analog.com/media/en/training-seminars/tutorials/MT-002.pdf

https://www.analogictips.com/adcs-sufficient-sampling-nyquists-rate/
If a signal has frequency rate of fM, then the sampling rate needs to be at least fs such that:

a fM < (fs /2) or fM < 0.5 x fs)

A term that is commonly used is the “Nyquist frequency.” The Nyquist frequency is (fs /2), or one-half of the sampling rate

================================================================

Console IDE Arduino 

01:23:54.886 -> IO MUX GPIO_4 REG = 2A00
01:23:54.886 -> IO MUX GPIO_5 REG = 2A00
01:23:54.886 -> Frequencia = 1250000
01:23:54.886 -> GPIO_4 ooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo1111oooo11
01:23:54.886 -> GPIO_5 1111111oooooooo11111111oooooooo11111111oooooooo11111111oooooooo11111111oooooooo11111111oooooo

Anexos

Como alterar a frequencia do Clock do ESP32 usando o Arduino IDE.

Veja que o meu módulo é o ESP32 DEV KIT - 38 pinos 

https://blog.eletrogate.com/conhecendo-o-esp32-introducao-1/

Altere a frequência através do Gerenciador de placas e mude o tipo de placa!

Começo dos estudos sobre o uso do DMA (direct memory access) no ESP32 :

ESP32 Technical Reference Manual

https://www.espressif.com/sites/default/files/documentation/esp32_t...

6. Controlador DMA

6.1 Visão geral

O acesso direto à memória (DMA) é usado para transferência de dados em alta velocidade entre periféricos e memória, bem como de memória para memória. Os dados podem ser movidos rapidamente com o DMA sem nenhuma intervenção da CPU, permitindo, assim,uso mais eficiente dos núcleos ao processar dados.

No ESP32, 13 periféricos são capazes de usar DMA para transferência de dados, a saber, UART0, UART1, UART2, SPI1, SPI2, SPI3, I2S0, I2S1, escravo SDIO, host SD / MMC, EMAC, BT e Wi-Fi.

6.2 Recursos

Os controladores DMA no recurso ESP32:
• arquitetura de barramento AHB
• Suporte para transferências de dados full-duplex e half-duplex
• Comprimento de transferência de dados programável em bytes
• Suporte para transferência burst de 4 batidas
• Espaço de endereço DMA de 328 KB
• Todos os módulos de comunicação de alta velocidade alimentados por DMA

(Google tradutor) 

Instalando ESP-IDF:

Eu tinha feito um tutorial para usar ESP-IDF em 2018. Mas já esta desatualizado. 

https://jgamblog.wordpress.com/2018/02/09/conhecendo-o-esp32-usando...

Seguindo as instruções do fabricante do ESP32 - ESPRESSIF:

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

https://docs.espressif.com/projects/esp-idf/en/latest/get-started/i...

Baixe o programa de instalação:

https://dl.espressif.com/dl/esp-idf-tools-setup-2.2.exe

Setting up Development Environment

Feito! Agora você pode compilar projetos ESP-IDF.
Vá para o diretório do projeto e execute:

idf.py build

Meu diretório no Windows 10 :

C:\Users\jgust\.espressif

Na janela de prompt de comando do Windows 10:

C:\Users\jgust\.espressif>idf.py --version


Note: You are using Python 3.8.1. Python 3 support is new, please report any problems you encounter. Search for 'Setting the Python Interpreter' in the ESP-IDF docs if you want to use Python 2.7.

Usando a  ESP-IDF:

Minha área de trabalho  com a ESP-IDF :

C:\Users\jgust\Desktop\esp-idf

O Instalador de ferramentas do ESP-IDF para Windows cria um atalho "Prompt de comando do ESP-IDF" no menu Iniciar. Este atalho abre o prompt de comando e configura todas as variáveis ​​de ambiente necessárias. Você pode abrir esse atalho e prosseguir para a próxima etapa.

Como alternativa, se você quiser usar o ESP-IDF em uma janela existente do Prompt de Comando, poderá executar:

%userprofile%\esp\esp-idf\export.bat 

ou com o Windows PowerShell

.$HOME/esp/esp-idf/export.ps1

Para Windows:

(corrigindo - meu diretório é o citado abaixo) 

cd  C:\Users\jgust\Desktop\esp-idf-2

execute esse comando:
C:\Users\jgust\Desktop\esp-idf-2>xcopy /e /i %IDF_PATH%\examples\get-started\hello_world hello_world

C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\CMakeLists.txt
C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\Makefile
C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\README.md
C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\main\CMakeLists.txt
C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\main\component.mk
C:\Users\jgust\Desktop\esp-idf-2\examples\get-started\hello_world\main\hello_world_main.c

6 arquivo(s) copiado(s)

Há uma variedade de exemplos de projetos no diretório de exemplos no ESP-IDF. Você pode copiar qualquer projeto da mesma maneira apresentada acima e executá-lo.

Também é possível criar exemplos no local, sem copiá-los primeiro.

Importante

O sistema de construção do ESP-IDF não suporta espaços nos caminhos do ESP-IDF ou dos projetos.

Usando ESP32-IDF (Windows 10):

https://docs.espressif.com/projects/esp-idf/en/latest/get-started/#...

(traduza para o português usando o tradutor do navegador Chrome)

No diretório onde está o programa a ser compilado e executado. Execute os comandos abaixo.

exemplo:

C:\Users\jgust\Desktop\esp-idf-2\hello_world>

1) Para compilar o programa (pode demorar alguns minutos): 

idf.py build
Se não houver erros, a compilação será concluída gerando o arquivo .bin binário do firmware.

2) Para gravar o firmware (seu programa compilado) na memoria Flash do ESP32 :

idf.py -p PORT [-b BAUD] flash

exemplo :

idf.py -p COM5 -b 460800 flash

3) Para conectar o ESP32 em uma porta serial : (pode usar outros programas de terminal):

idf.py -p PORT monitor
exemplo :
idf.py -p COM5 monitor

Continuando na pesquisa:

Uso do DMA:

Referencias:

1.        https://www.espressif.com/sites/default/files/documentation/esp32_t...
pag 306

2.

      https://docs.espressif.com/projects/esp-idf/en/latest/api-reference...
           Tópico I2S configuration


3.   https://espressif-rtd-test-bed.readthedocs-hosted.com/en/latest/api...
       Tópico

         I2S
             Overview

4.   kolban-ESP32_Set2018.pdf       pag. 287

5.    esp32_technical_reference_manual_en.pdf    PAG. 115

sketch teste de DMA com instruções da lib da IDF, em anexo.

Ainda não sei se funfa. kkkk

ESP32_TwoCore8_DMA.ino

RV

O sketch ESP32_TwoCore8_DMA.ino servirá  para o projeto, pois a entrada por um port somente,

e é serial.

Agora estou tentando usar este sketch que lê 8 bits em paralelo.

Exemplo extraído do pacote do ESP32 para arduino.

C:\Users\myUser\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2\tools\sdk\include\esp32-camera

camera.h    dentro tem um exemplo de uso.

ESP32_TwoCore12_DMA.ino

Este compilou corretamente, mas se funfa é outra questão. kkkkk

RV

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço