Avançar para o conteúdo

Criar tensão analógica com PCF8591

Neste post, vamos criar tensão analógica com PCF8591, um chip da NXP com conversores analógico para digital (ADC) e digital para analógico (DAC) de 8 bits. Estamos usando o ESP32-C6 para esta tarefa, mas você certamente pode usar um Arduino UNO ou similar, sem problemas.

Como dito, estamos focando na parte DAC (digital para analógico), então a parte ADC (analógico para digital) será vista em outro artigo. Nosso chip de interesse, PCF8591 (datasheet aqui) é capaz de ambos. Estou usando um ESP32-C6 porque é o que tenho em mãos, também é montado em um PCB que eu mesmo fiz, veja aqui.

Comprei o PCF8591 do Aliexpress (link aqui) montado em um pequeno PCB, apresentando algumas coisas interessantes. Ele apresenta três componentes analógicos: um LDR, um potenciômetro e um NTC, cada um conectado a uma entrada analógica diferente. Nosso módulo PCF8591 tem quatro entradas analógicas.

PCF8591 conversor digital para analógico
PCF8591 em uma placa de circuito impresso

Há quatro jumpers vermelhos na placa, vamos abrir todos eles. Isso é para desconectar os sensores analógicos da placa. Você pode ver um fio amarelo na imagem acima, que é a saída DAC de interesse para nós. Os fios no topo são i2c e fonte de alimentação.

Hardware e diagrama esquemático

Os materiais necessários para nosso experimento com o DAC PFC8591 são o próprio módulo, um ESP32 ou Arduino, uma breadboard e um multímetro. Estamos usando o multímetro para medir a voltagem gerada pelo PCF8591, então lembre-se de colocá-lo na medição de voltagem DC (até 3,3 V). Esquemas completos e montagem na bancada são vistos abaixo.

Diagrama esquemático do PCF8591 com um ESP32-C6
Diagrama esquemático do PCF8591 com um ESP32-C6
PCF8591 na bancada
PCF8591 na bancada

Só para garantir, observe que estou usando D4 e D5 como SDA e SCL (para i2c); em um Arduino UNO, por exemplo, esses pinos serão A4 e A5, então certifique-se de conhecer sua placa.

O firmware

Depois de montar o circuito na bancada, vamos dar alguma atenção ao lado da programação do experimento. Estamos usando o software Arduino IDE (eu uso a versão 2.x.x) para programar na linguagem Arduino. Sugiro que você certifique-se de que sua placa pode ser programada via Arduino IDE, enviando um exemplo de piscar de LED para ela.

PCF8591 é um dispositivo i2c, então ele precisa de uma biblioteca para responder aos nossos comandos. Acabei escolhendo a Adafuit, que é simples e direta o suficiente. Para instalá-la em seu Arduino IDE, vá em “Sketch > Include library > Manage library” e digite “PCF8591”; instale a que diz “Adafruit” como autor.

Há um exemplo completo do funcionamento da biblioteca, em “File > Examples > Adafruit PCF8591 > PCF8591”. Usei este exemplo para criar o sketch que usaremos na postagem do blog (então não é o exemplo bruto). O que implementei foi ler o monitor serial para valores entre 0,00 e 3,30, valores que você digita no IDE do Arduino.

Esses valores representam uma voltagem que você quer ver na saída analógica. Então, a cada 500 ms (0,5 segundos), eu obtenho esses valores e os mapeio para 0-255, o que representa 8 bits (que é a resolução da saída analógica). Você pode ver o código completo abaixo. Observe que eu não uso nenhum delay(), então o código não é bloqueante, o que significa que você pode colocar qualquer código que quiser em cima do meu que ele vai funcionar.

#include <Adafruit_PCF8591.h>
// Make sure that this is set to the value in volts of VCC
#define ADC_REFERENCE_VOLTAGE 3.3
Adafruit_PCF8591 pcf = Adafruit_PCF8591();

int SerialValue;
long oldtime;
long oldtime2;
int valueToWrite;


void setup() {
  Serial.begin(115200);
  while (!Serial)
    delay(10);

  pcf.begin();
  pcf.enableDAC(true);
  Serial.println("Type a value between 0.00 and 3.30 (a voltage)");
}

uint8_t dac_counter = 0;

void loop() {
  
  
  if (Serial.available() > 0) {
    // read the incoming byte:
    SerialValue = (Serial.readString().toFloat())*100;
    valueToWrite= map(SerialValue, 0, 330, 0, 255);
    
  }
  
  if(millis() - oldtime2 > 500){
    oldtime2= millis();
    pcf.analogWrite(valueToWrite);
  }  
}

Algumas coisas importantes: você precisa definir qual voltagem você está fornecendo ao PCF8591, na linha abaixo:

#define ADC_REFERENCE_VOLTAGE 3.3

Também a linha abaixo é o coração do programa. O comando “Serial.readString()” obtém o valor digitado como string, é convertido para float novamente. Então ele é multiplicado por 100, de modo que por exemplo 3,30 se torna 330 e 1,25 se torna 125, valores utilizáveis ​​para então mapear para 0-255.

SerialValue = (Serial.readString().toFloat())*100;

Teste final

Fiz um vídeo ilustrando como esse experimento funciona. Basicamente, você digita um valor no monitor serial do Arduino IDE e o valor é escrito na saída PCF8591. Isso é então visto com um multímetro para confirmar o que digitamos.

Lembre-se também, se você quiser comprar o PCF8591 deste experimento, acesse meu link de afiliado do Aliexpress.

1 comentário em “Criar tensão analógica com PCF8591”

  1. Pingback: Criar saída analógica com MCP4725 - Fritzenlab eletrônica

Deixe um comentário

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