Onda Quadrada à 10 KHz no ESP32

Objetivos

  1. Programar uma task síncrona usando FreeRTOS para ESP32 (ambiente IDE Eclipse), para gerar uma onda quadrada na frequência de 10 KHz simplesmente alternando o nível lógico de um pino da GPIO. Esta task deve usar o timer de alta-resolução das placas ESP32.
  2. Implementar outra task que roda a cada 100 ms mostrando o nível lógico da onda. A rotina ainda deve ler o botão built-in da placa ESP para permitir pausar o sinal (nível lógico vai à zero) ou executar novamente a onda, cada vez que é pressionado.

Solução possível:

Para implementar uma task síncrona usando FreeRTOS para gerar uma onda quadrada na frequência de 10 KHz e outra task que roda a cada 100 ms mostrando o nível lógico da onda, vamos usar a IDE Eclipse e programar para a placa ESP32. Além disso, vamos usar o botão built-in para pausar e retomar o sinal.

Nota: é fácil gerar uma onda quadrada, simplesmente alternando o nível lógico de certo pino. Neste caso, supondo duty-cycle de 50%, metade do período de tempo estaremos em nível lógico alto ou biaox, o que significa que para gerar a onda quadrada com 10 KHz, metade do período corresponde à: segundos 0,1 mili-segundos 100 s. Metade deste valor corresponde à 50 micro-secundos, ou seja, devemos alternar o sinal na frequência de 20 KHz. Então necessitamos programar a task síncrona para ser interrompida na frequência de 20 KHz. Lembrar que o clock comum de uma placa ESP32 é de 80 MHz ou s s; se for considerado que o ESP32 consegue executar uma insfrução à cada ciclo de máquin ou 4 pulsos de clock, resulta no período de tempo de: 50 ns (ou frequência de 20 MHz).

Passo 1: Configurar o ambiente de desenvolvimento

Certifique-se de ter a ESP-IDF (Espressif IoT Development Framework) instalada e configurada com Eclipse IDE. Este guia assume que você já tem o ambiente configurado.

Passo 2: Código para gerar a onda quadrada e monitorar o botão

A seguir segue código completo para IDE Eclipse ou Terminal de comandos:

Explicação do Código

  1. Configuração do GPIO:

    • GPIO_OUTPUT_IO é configurado como saída para gerar a onda quadrada.
    • GPIO_INPUT_IO é configurado como entrada para o botão built-in com uma interrupção configurada na borda de descida.
  2. Task button_task:

    • Trata a interrupção do botão e alterna o estado da flag is_running.
  3. Task square_wave_task:

    • Configura o timer de alta-resolução para gerar a onda quadrada com a frequência desejada.
    • Alterna o nível lógico do pino de saída em cada interrupção do timer.
  4. Task monitor_task:

    • Monitora e imprime o nível lógico da onda quadrada a cada 100 ms.

Notas Adicionais

Considerações Finais

Compile e carregue este código na sua ESP32 usando a IDE Eclipse configurada para ESP-IDF. A task button_task controlará o estado do sinal e a task monitor_task exibirá o nível lógico da onda.


Modificação para ativar o builtin led para indicar se onda quadrada está sendo gerada ou não:

Para modificar a task button_task para ativar o LED built-in da placa ESP32 quando a onda quadrada estiver sendo gerada, podemos fazer o seguinte:

  1. Identificar o pino do LED built-in. Na maioria das placas ESP32, o LED built-in está no pino GPIO 2.
  2. Modificar a task button_task para alternar o estado do LED conforme o estado da flag is_running.

A seguir segue código para Eclipse (ou terminal de comandos):

Explicação das Modificações

  1. Definição do LED Built-in:

    • #define GPIO_BUILTIN_LED 2: Adicionada definição do pino do LED built-in.
  2. Configuração do LED Built-in:

    • Adicionada a configuração do pino GPIO_BUILTIN_LED como saída no app_main.
  3. Modificação na button_task:

    • Adicionada linha gpio_set_level(GPIO_BUILTIN_LED, is_running) para definir o estado do LED built-in conforme o estado de is_running.

Agora, quando a onda quadrada estiver sendo gerada (is_running for verdadeiro), o LED built-in estará aceso. Quando a geração da onda estiver pausada (is_running for falso), o LED built-in estará apagado.

Código anterior levemente alterado para interface IDE do Arduino:

Claro! A seguir, vou adaptar o código anterior para ser usado na interface IDE do Arduino com a placa ESP32. O código irá gerar uma onda quadrada com frequência de 10 kHz, monitorar o botão built-in para pausar ou retomar a geração da onda e ativar o LED built-in quando a onda estiver sendo gerada.

Código para IDE Arduino

Explicação do Código

  1. Configuração dos Pinos GPIO:

    • GPIO_OUTPUT_IO é configurado como saída para gerar a onda quadrada.
    • GPIO_INPUT_IO é configurado como entrada para o botão built-in com pull-up interno.
    • LED_BUILTIN (pino 2) é configurado como saída para indicar o estado da geração da onda.
  2. Interrupção do Botão:

    • A ISR button_isr alterna a flag is_running, define o sinal para baixo (LOW) e ajusta o estado do LED built-in.
  3. Interrupção do Timer:

    • A ISR onTimer alterna o nível lógico do pino de saída a cada interrupção do timer se is_running estiver verdadeiro.
  4. Setup:

    • Configura os pinos, a interrupção do botão e o timer.
    • Inicializa o monitor serial para enviar o nível lógico atual da onda.
  5. Loop Principal:

    • Monitora o estado do sinal a cada 100 ms e envia o nível lógico atual para o monitor serial.

Notas Adicionais

Essa adaptação deve funcionar de maneira semelhante ao código original, agora dentro da interface do Arduino, tornando o desenvolvimento e a depuração mais acessíveis para quem está acostumado com esse ambiente.

Atenção: Falta testar estas rotinas. Parece que usam versões atrasadas das API's da Espressif.


🌊 Fernando Passold 📬 ,