Esperimenti con logiche programmabili
Tutorial Arduino

Usare la porta DAC del PCF8591P

Come generare una tensione analogica da un dato digitale

Nel precedente articolo abbiamo imparato a gestire i quattro ingressi analogici del dispositivo PCF8591P. In questo tutorial impareremo a utilizzare la porta DAC (Digital to Analog Converter) per creare una tensione continua partendo da un dato digitale.

Lo schema elettrico rimane pressoché invariato. L’unica modifica riguarda l’eliminazione dei collegamenti sui pin analogici AIN ed il collegamento al pin AOUT di un diodo led rosso da 3mm e di una resistenza (R) da 100Ohm:

L’indirizzo del PCF8591P sul bus I2C non viene modificato, rispetto all’articolo precedente, dato che i pin A0, A1 e A2 sono collegati a massa.
Possiamo sempre gestire l’acquisizione dai pin ADC (AIN0, AIN1, AIN2, AIN3), una funzione non esclude l’altra.

La risoluzione del convertitore digitale analogico è di 8bit quindi i valori possibili possono essere espressi con 256 valori digitali (da 0 a 255). Il valore di tensione associato per ogni valore digitali dipende dalla tensione presente sul pinVref e sul pin AGnd secondo questo grafico:

Nel circuito precedente il pin14 VRef è collegato alla 5Vdc mentre il pin13 Agnd è collegato a massa. Quindi per conoscere il valore di tensione associato alla variazione di un singolo bit possiamo eseguire questo calcolo:

tensione_rif/bit_totali = (Vref-Agnd) / 256 => (5-0)/256 => 19,5 mVdc per variazione d bit

ad esempio se caricassi sul DAC data register il valore decimale 127 otterrei in uscita dal pin15 del PCF8591 la tensione di:

Vout = ValDAC * ValStep => 127 * 19.5mVdc => 2.47Vdc

Cambiando il valore di Vref, ad esempio portandolo a 3.3Vdc otteniamo delle variazioni di tensione per bit più piccole. Questa scelta dipende dal tipo di progetto che vogliamo realizzare.

Per attivare la porta DAC del PCF8591P dobbiamo settare al livello alto il bit7 (Analog Output Enable Flag) del registro Control Byte.

La sequenza di byte da inviare al PCF8591P segue lo schema rappresentato nella figura seguente:

ovvero, dopo aver ‘selezionato’ sul bus I2C il dispositivo tramite il suo indirizzo, inviamo il byte di configurazione e successivamente il byte contenente il valore digitale che verrà poi convertito in segnale analogico.

Passando al codice di esempio ho realizzato uno sketch che ha il compito di  far variare la tensione sul pin15 da 5Vdc sino a scendere gradualmente a 0Vdc per poi ritornare, sempre gradualmente, a 5Vdc, ottenendo un effetto fade sul diodo led collegato come da schema:

#include <Wire.h>
byte ciclo=0;

void setup()
{
 //inizializzo la libreria Wire come Master
 Wire.begin();
}

void loop()
{
 for(ciclo = 255; ciclo > 0; ciclo--)
 {
  Wire.beginTransmission(0x48);
  //invio un byte
  Wire.write(byte(0x40));
  Wire.write(byte(ciclo));
  //fine trasmissione
  Wire.endTransmission();
  delay(10);
 }
 
 for(ciclo = 0; ciclo < 255; ciclo++)
 {
  Wire.beginTransmission(0x48);
  //invio un byte
  Wire.write(byte(0x40));
  Wire.write(byte(ciclo));
  //fine trasmissione
  Wire.endTransmission();
  delay(10);
 }
}

 

Related posts

Pilotare diversi dispositivi con il movimento della testa

Marco Lai
12 anni ago

Webduino Based Authentication. Accedere ad una pagina privata

Marco Lai
11 anni ago

Come aggiornare l’ host no-ip tramite Arduino ethernet

Marco Lai
13 anni ago
Exit mobile version