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.

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.


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.






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