Gerar Senóide Usando Arduino-IDE

Este projeto está relacionado com Gerar Senóide.

Versão usando Arduino-IDE…

Arqutetura usada:

A versão Arduino fica conceitualmente mais simples (em comparação com a versão usando ESP-IDF), porque o Arduino-ESP32 já fornece os blocos: setup()/loop() e abstrai boa parte da inicialização.

A lógica do programa vai ser algo como: gerar senoide de 440 Hz, amostrada à 10 kHz, usando DAC no GPIO25, botão no GPIO4 para ligar/desligar e usar um pino de GPIO de DEBUG para observar a duração do processamento no osciloscópio.

Código Arduino-IDE

Segue cópia de: ~/Documents/Arduino/Senoide2/Senoide2.ino:

Se tudo correu certo, a placa deve gerar as seguintes mensagens no terminal serial (depois que o código foi baixado e o botão de “EN” (ou “Reset”) foi pressionado:

Note que o botão “Boot” presente na placa do ESP32 perminte alternar entre gerar e não gerar a senóide e que o “status” da placa é mostrado cada vez que o botão pressionado. E note ainda que a cada 1 segundo, aproximadamente, é mostrado o número de vezes que a ISR foi executada. Isto permite avaliar (sem necessidade de um osciloscópio) se a rotina de ISR está sendo executada sem problemas.

 

A diferença mais interessante em relação a versão ESP-IDF

Na versão ESP-IDF, foi criada explicitamente uma tarefa FreeRTOS:

e essa tarefa executava:

Na versão Arduino, isso vira simplesmente:

Ou seja, loop() seria equivalente a uma tarefa de nível superior que fica fazendo esse trabalho. O GPTimer continua funcionando independentemente e interrompe o processador a cada 100 µs.

Medição do Duty-cyle

Queremos ter uma idéia real do tempo de processamento gasto com a rotina ISR que calcula/gera os pontos da senóide.

A parte:

no início da ISR/callback e:

no final produz exatamente um sinal no pino de DEBUG similar à:

Portanto, no osciloscópio você poderá medir diretamente o tempo de execução da callback e seu duty-cycle.

Uma observação importante: para essa primeira versão Arduino foi mantida sinf() e o DAC dentro da callback propositalmente. Assim, a comparação entre a versão ESP-IDF e a versão Arduino fica interessante: você estará usando essencialmente o mesmo mecanismo de GPTimer e o mesmo algoritmo, mas com as APIs de alto nível do Arduino (digitalWrite(), digitalRead(), dacWrite(), delay()).

Sugestão: podemos fazer uma segunda versão Arduino mais "crua", usando acesso direto aos registradores/GPIO e compará-la no osciloscópio. Isso permitiria mostrar uma coisa interessante: quanto do tempo medido é realmente sinf() e quanto é overhead das funções Arduino.

 

<< Voltar para tópico de origem: Gerar Senóide | Ver Versão usado ESP-IDF Puro.


Fernando Passold, em 14/09/2026.