Como usar os DACs do ESP32

Como usar os DACs do ESP32? 4

Os makers, hobistas, engenheiros e desenvolvedores com certeza já devem ter ao menos ouvido falar do ESP32. Este SoC, com ótimo custo/benefício, tem se tornado a opção número 1 para protótipos e produtos que envolvem sistemas embarcados e Internet das Coisas. Dentre os recursos disponibilizados pelo ESP32, está o DAC (Digital-to-Analog Converter), recurso que faz justamente o inverso do ADC, ou seja, transforma um dado digital em um sinal / tensão analógica. Este post vai te explicar o que é um DAC e ensinar como fazer seu uso no ESP32.

Material necessário

Para acompanhar este post, você precisará do seguinte material:

DAC: o que é e para que serve?

DAC significa Digital-to-Analog Converter. Em resumo, ele faz o inverso do ADC, ou seja, é capaz de converter um valor digital em uma tensão analógica (de 0 até a tensão de alimentação).

Dessa forma, trata-se de um valioso recurso para sistemas embarcados, permitindo-os criar tensões e sinais analógicos diversos, como sinais de áudio, por exemplo. Para exemplificar seu uso, vamos tomar como exemplo um dos instrumentos musicais eletrônicos mais populares: o teclado. Ao pressionar uma tecla neste instrumento musical, o microcontrolador do teclado produz na saída de áudio um sinal de áudio na exata nota (frequência) e timbre correspondentes para aquela tecla, usando para isso um DAC para produzir este sinal analógico de áudio.

O mesmo princípio pode ser aplicado para tocar áudios de músicas, alertas sonoros diversos, fazer controle de iluminação (intensidade) e mais uma infinidade de coisas nas quais sistemas embarcados e projetos em Internet das Coisas comumente têm de lidar.

Como controlar um DAC?

Um DAC, conforme dito, transforma um valor digital em um valor de tensão analógica. Mas como fazer isso?

Um DAC recebe como entrada um valor digital, entre 0 até um determinado valor máximo, onde:

  • O valor digital 0 produz na saída do DAC uma tensão de 0V;
  • O valor digital máximo produz na saída do DAC uma tensão no valor da tensão de alimentação.

Este valor máximo digital depende de uma característica do DAC: sua resolução (ou seja, quantos bits são dispostos para controlar / determinar a tensão de saída). A resolução informa, de forma direta, qual é este valor máximo, segundo a fórmula abaixo:

Valor máximo = 2^(bits de resolução) – 1

Vamos supor que a resolução do DAC em questão é de 8 bits. Isso significa dizer que o valor digital máximo aceito pelo DAC é de 2^8 – 1 = 255 (ou, em hexadecimal, 0xFF). Ainda, isso também significa que haverá 255 níveis entre o 0V e a tensão de alimentação na saída do DAC.

Com isso, podemos concluir que, quanto maior a resolução, mais tensões de saída do DAC podem ser produzidas entre 0V e a tensão de alimentação. É como se houvesse uma “escada” entre o 0V e a tensão de alimentação, e, quanto maior a resolução, mais degraus há nesta escada. É possível subir de forma mais gradual (de pouco em pouco) conforme há mais degraus (mais bits de resolução). Observe na imagem 1 a forma de onda de saída de um DAC de 3 bits (em vermelho) x DAC de 16 bits (em azul).

Como usar os DACs do ESP32
Figura 1 – exemplo de onde de um DACs de resolução 3 bits, em azul, e 16 bits, em vermelho (fonte: https://hackprojectsindia.blogspot.com/2017/10/dacdigital-to-analog-conversion-using_58.html)

 

O valor analógico em função do valor digital é dado pela seguinte fórmula:

Valor analógico = Tensão de alimentação * Valor digital / (2^bits – 1)

Para calcular o valor mínimo de tensão “entre um degrau e outro” (indo do valor digital 0 para o valor digital 1, por exemplo), utiliza-se a fórmula abaixo:

Valor analógico mínimo = Tensão de alimentação * (1-0)/(2^bits – 1)

Valor analógico mínimo = Tensão de alimentação * 1/(2^bits – 1)

Para o mesmo DAC do exemplo anterior (8 bits de resolução) e supondo uma tensão de alimentação de 3,3V, temos:

Valor analógico mínimo = 3,3 / (2^8 – 1) = 0,0129V

Isso significa dizer que, ao irmos do valor digital 0 de entrada do DAC para o valor digital 1, estamos subindo a tensão de saída do DAC de 0V para 0,0129V. Se você precisasse, por exemplo, ter 1,29V na saída do DAC, o valor digital usado seria igual a 100.

Há algum DAC integrado no ESP32? Se sim, como utilizá-lo?

Sim, e há mais de um! O ESP32 possui, de forma nativa, 2 DACs, DAC0 e DAC1, com tensões de saída localizadas respectivamente nos GPIO 25 e GPIO 26. Ambos os DACs possuem 8 bits de resolução, ou seja, aceitam como entrada valores digitais de 0 até 255. Dessa forma, você pode gerar até dois sinais (ou tensões) analógicas independentes de forma simultânea.

Do ponto de vista de software, o DAC é suportado de forma nativa pelas bibliotecas do próprio ESP32. Isso significa que você não precisa instalar nenhuma biblioteca adicional para usar o DAC do ESP32. Para usar o DAC, deve ser usada a função dacWrite, conforme abaixo:

dacWrite(Canal_DAC, Valor digital);

Onde:

  • Canal_DAC: pode ser 25 (para usar o GPIO 25, tensão de saída do DAC0) ou 26 (para usar o GPIO 26, tensão de saída do DAC1);
  • Valor digital: valores de 0 até 255, sendo que 0 produz 0V na saída do DAC e 255 produz 3.3V na saída do DAC.

Circuito esquemático

Para exemplificar o uso de DAC no ESP32, vamos fazer uso do circuito esquemático mostrado na figura 2.

Como usar os DACs do ESP32
Figura 2 – circuito esquemático

Exemplo prático: controle da luminosidade de dois LEDs de forma independente

Fazendo uso do circuito esquemático da figura 2, faremos o seguinte exemplo prático: controlar, de forma independente, a luminosidade de dois LEDs, de forma que o LED ligado ao DAC0 começa totalmente desligado e tem sua luminosidade gradualmente aumentada, enquanto o LED ligado ao DAC1 começa no brilho máximo e tem sua luminosidade gradualmente diminuída. O código-fonte deste exemplo encontra-se abaixo:

/* Definição do canal DAC0 (GPIO 25) */
#define CANAL_DAC0 25  

/* Definição do canal DAC1 (GPIO 26) */
#define CANAL_DAC1 26  

int i;

void setup() 
{
  
}

void loop() 
{ 
    for(i=0; i<=255; i++)
    {
        dacWrite(CANAL_DAC0, i);  
        dacWrite(CANAL_DAC1, 255-i);
        delay(100);  
    }
}

Quando rodar este exemplo, coloque a ponta GND do multímetro no GND do ESP32 e a outra ponta no GPIO 25 ou GPIO 26 e acompanhe a tensão variando aos poucos para cima (DAC0) ou para baixo (DAC1).

Conclusão

Neste post, você aprendeu o que é o DAC e como utilizar os DACs oferecidos no ESP32.

Dessa forma, você agora é capaz de gerar tensões ou sinais analógicos, o que lhe permitirá fazer muito mais projetos e aplicações com o ESP32.

Gostou deste post sobre como usar DACs do ESP32? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

4 Comentários

  1. Bom dia, Pedro!
    Em “Se você precisasse, por exemplo, ter 1,29V na saída do DAC, o valor digital usado seria igual a 10.” não seria “igual a 100”? Outra dúvida, sabe me dizer quantos bits significativos tem o DAC do ESP32?

    Grato!
    Victor Bértoli

    1. Olá Victor.

      Isso mesmo, seria 100. Outra forma de calcular seria uma regra de três, na qual 3,3 = 255 e 1,29 = X. Isolando o X tem-se o valor aproximado de 100.

      Quanto a sua pergunta sobre o bit significativo. O bit signifcativo seria a maior posição de um número binário, que no caso do ESP32 seria 8.

      Att.
      Vitor Mattos.
      Suporte Técnico MakerHero.

  2. Boa tarde Pedro , com isto então eu posso criar um variador de resistencia por exemplo , ou seja um potenciomentro digital dentro do proprio esp , ou estou enganado?

    1. Olá Paulo,

      Não exatamente um variador de resistência, mas o efeito é similar a variar o potenciômetro com ele montado como divisor de tensão.

      Então é possível sim ter o mesmo comportamento de um potenciômetro conectado assim, mas controlado internamente pelo ESP.

      Abraços!
      Vinícius – Equipe MakerHero