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
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test