ESP32-S2 – Interrupção automática no ADC via DMA (Threshold)

Diversos projetos e produtos fazem o monitoramento constante da tensão em pinos analógicos (via ADC), desde monitorar tensões de algum dispositivo externo ou até mesmo de uma bateria interna para alimentação do sistema. Muitos desses, efetuam o monitoramento a fim de saber se a tensão atual está acima ou abaixo do limite estipulado, inclusive medições de zero-cross.


Nesse artigo, aprendemos a monitorar a tensão nos pinos do ESP32-S2 de forma autônoma para geração de interrupções caso os limites sejam ultrapassados, tudo isso com velocidades extremas e sem interferir no uso da CPU! Você será capaz de monitorar até rápidas oscilações de tensão na ordem de microssegundos ou nanosegundos!

Metodologia convencional (polling)

O jeito mais fácil e simples para monitorar a tensão de um pino analógico é literalmente ficar efetuando várias leituras e verificando se ultrapassaram os limites estipulados, porém, isso é pouco efetivo e consome processamento desnecessário da CPU, já que estará todo tempo executando essas instruções. Costuma ser utilizado para baixas frequências de leitura, mas se torna um problema quando as frequências de leitura são mais altas, já que irá consumir boa parte do tempo de CPU e ainda estará limitado a frequências relativamente baixas.

Exemplo de código com polling em 10Hz:

Como podemos observar, a leitura é efetuada a cada 100ms (10Hz) e então verificamos se ocorreu a passagem do limite estipulado. Se a tensão variar durante os 100ms que o código fica em delay, jamais saberemos e perderemos essa informação. Para contornar isso, precisamos fazer leituras cada vez mais rápidas até atender a demanda do projeto, mas isso pode ser inviável ou atrapalhar o resto do código, forçando desnecessariamente a CPU.

Metodologia dedicada (DMA)

Já nos casos em que é necessário altas frequências de leitura ou até mesmo liberar o uso da CPU para outras tarefas, é utilizado DMA (Direct Memory Access), onde o próprio periférico se encarregará da leitura e processamento, liberando a CPU de quase todo o processamento antes necessário.

O ESP32-S2 conta com uma nova característica no ADC, que nos permite gerar interrupções baseado em limites estipulados (Thresholds), além de contar com toda velocidade do controlador digital via DMA. Apesar dos modelos antigos ao S2 contarem com o controlador digital + DMA, eles não geravam interrupções via Threshold, nos forçando a utilizar a CPU para verificação dos valores.

O DMA ainda permite configurações interessantes como fazer leituras de pinos individualmente, simultaneamente ou até alternando entre canais.

Configurando o DMA no ESP32


Para demonstrar o conceito de DMA gerando interrupção por nível de tensão, faremos um simples código para monitorar um pino analógico em velocidade de 4 MHz, que irá gerar interrupções quando o nível de tensão ficar acima de 1.65V no pino (valor 2048 do ADC de 12 bit). O código é relativamente complexo, pois conta com muitas configurações diferentes, você terá de ler a explicação de cada parâmetro diretamente na documentação de ADC da Espressif.

O código acima configura todos os itens necessários para nossa leitura e analisando o serial monitor, podemos ver claramente que quando a leitura do ADC ultrapassa o valor de 2048 (1.65V), é gerado a interrupção. Basta alterar a frequência de clock que você poderá ir de alguns KHz até dezenas de MHz, gerando mais confiança em obter sinais rápidos.

Figura 1 – ADC threshold.

Utilizar o ADC para gerar interrupções quando ocorrer a passagem de limites automaticamente e de forma super veloz, sem interferir na carga do RTOS é de extrema importância e utilidade em diversos projetos. Sem essa característica, pollings com altas frequências podem matar o resto do seu projeto, já que a CPU estará constantemente em uso. Este artigo não focou na explicação detalhada em cada um dos parâmetros de configurações por haver muitos, mas a documentação citada nas referências explica em detalhes.

Referência

https://docs.espressif.com/projects/esp-idf/en/release-v4.3/esp32s2/api-reference/peripherals/adc.html

Saiba mais

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Home » Hardware » ESP32-S2 – Interrupção automática no ADC via DMA (Threshold)
Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:
Menu