Avançar para o conteúdo

Criar saída analógica com MCP4725

Vamos estudar uma maneira de criar saída analógica com MCP4725 e o ESP32-C3, usando código Arduino e o software Arduino IDE. O MCP4725 é um chip DAC (conversor digital para analógico) de 12 bits em uma configuração SOT23-6 (6 pinos). Feito pela Microchip e com o datasheet disponível aqui, esse pequeno chip funciona de 2,7 a 5,5 V e se comunica via i2c.

Estamos fornecendo 3,3 V porque estamos usando um ESP32-C3 mini como controlador. Como dito, a comunicação entre o MCP4725 e o ESP32-C3 é via i2c, usando apenas dois fios (SDA e SCL).

Hardware

Decidi escrever este artigo usando um ESP32-C3, mas nada impede que você use qualquer placa que tiver em mãos. Afinal, isso é apenas i2c, algo que qualquer Arduino pode fazer; O código deste artigo será compilado perfeitamente para você. Você pode ver o diagrama esquemático abaixo, multímetro incluído (para medir a voltagem).

MCP4725 na protoboard com o ESP32-C3
MCP4725 com o ESP32-C3
MCP4725 com ESP32-C3 na protoboard

Circuito bem simples, o GPIO 8 do ESP32-C3 é SDA e o GPIO 9 é SCL. Forneça 3,3V e GND e conecte um multímetro (em modo voltagem) em OUT e GND, além de um potenciômetro de 10k Ohm para referência de tensão. O potenciômetro é usado para gerar uma referência de tensão, para que nossa saída analógica o siga.

Código e testes

Estamos usando o Arduino IDE e o código Arduino para este exemplo. Para dispositivos como o MCP4725, que funciona via i2c, é interessante ter uma biblioteca cuidando das coisas para nós. Eu instalei uma biblioteca chamada “MCP4725” de Rob Tillaart, indo em “Sketch > Include library > Manage librarys” e digite “MCP4725”. Instale a do Rob Tillaart.

Eu então escrevi o código eu mesmo, com base em um exemplo disponível no IDE. Vá em “File > Examples > MCP4725 > MCP4725_test”. Minha versão modificada do código é vista abaixo.

//   Created by Clovis Fritzen, FritzenLab.net 
// Based on work from: 
//    FILE: mcp4725_minimal.ino
//  AUTHOR: Rob Tillaart
// PURPOSE: Minimal sketch MCP4725 (#29)
//     URL: https://github.com/RobTillaart/MCP4725


#include "Wire.h"
#include "MCP4725.h"

MCP4725 MCP(0x60);

long oldtime;
int rawAnalog;
int i= 0;

void setup()
{
  Serial.begin(115200);
 
  Wire.begin();
  MCP.begin();

  //analogReadResolution(12);
}
void loop()
{
  if(millis() - oldtime > 100){
    oldtime= millis();
    rawAnalog= analogRead(A0);
    MCP.setValue(rawAnalog);

    i++;
    if(i == 10){
      Serial.println(rawAnalog);
      i=0;
    }
  }
}

Tudo acontece a cada 100 ms (milissegundos), o resto do tempo o microcontrolador está livre para fazer o que você pedir. Não há delay(), então não há código de bloqueio. Eu basicamente leio a entrada analógica A0 (potenciômetro) e armazeno em “rawAnalog”, então faço “MCP.setValue(rawAnalog) para escrever o valor no MCP4725.

Como isso é feito a cada 100 ms, parece quase contínuo ao olho humano (especialmente no multímetro). Eu também imprimo o valor “rawAnalog” no monitor serial a cada 1000 ms (10x 100 ms).

Pra finalizar

Fiz um vídeo para ficar mais claro como o sistema funciona, aproveite. Também antes de ir, quer me ver testando outro DAC? Clique aqui. Também se você quiser comprar o MCP4725 use meu link de afiliado.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *