- DAC MCP4921 (convertitore da digitale ad analogico)
- Componenti richiesti
- Schematico
- Spiegazione del codice
- Testare la conversione da digitale ad analogico usando PIC
Il digitale e l'analogico sono parte integrante dell'elettronica. La maggior parte dei dispositivi ha sia ADC che DAC e vengono utilizzati quando è necessario convertire i segnali da analogico a digitale o da digitale ad analogico. Anche i segnali del mondo reale come il suono e la luce sono di natura analogica, quindi ogni volta che questi segnali del mondo reale devono essere utilizzati, i segnali digitali devono essere convertiti in analogici, ad esempio per produrre suono utilizzando altoparlanti o per controllare una fonte di luce.
Un altro tipo di DAC è un Pulse Width Modulator (PWM). Un PWM prende una parola digitale e genera un impulso digitale con larghezza di impulso variabile. Quando questo segnale viene fatto passare attraverso un filtro, il risultato sarà puramente analogico. Un segnale analogico può contenere più tipi di dati in un segnale.
In questo tutorial, interfacciamo il DAC MCP4921 con Microchip PIC16F877A per la conversione da digitale ad analogico.
In questo tutorial convertiremo il segnale digitale in un segnale analogico e visualizzeremo il valore digitale in ingresso e il valore analogico in uscita su LCD 16x2. Fornirà 1 V, 2 V, 3 V, 4 V e 5 V come uscita analogica finale, come mostrato nel video fornito alla fine. Puoi approfondire la conoscenza del DAC nel nostro prezioso tutorial sull'interfacciamento del DAC con le schede Raspberry Pi, Arduino e STM32.
Il DAC può essere utilizzato in molte applicazioni come controllo del motore, controllo della luminosità delle luci a LED, amplificatore audio, codificatori video, sistemi di acquisizione dati ecc. Prima di passare direttamente alla parte di interfaccia, è importante avere una panoramica su MCP4921.
DAC MCP4921 (convertitore da digitale ad analogico)
MCP4921 è un DAC a 12 bit, quindi MCP4921 fornirà 12 bit di risoluzione di uscita. La risoluzione DAC indica il numero di bit digitali che possono essere convertiti in segnale analogico. Quanti valori possiamo ottenere da questo si basa sulla formula. Per 12 bit, è = 4096. Ciò significa che il DAC con risoluzione a 12 bit potrebbe produrre 4096 uscite diverse.
Utilizzando questo valore, è possibile calcolare facilmente la tensione del singolo gradino analogico. Per il calcolo dei gradini è necessaria la tensione di riferimento. Poiché la tensione logica per il dispositivo è 5 V, la tensione del gradino è 5/4095 (4096-1 perché il punto di partenza per il digitale non è 1, è 0), che è 0,00122100122 millivolt. Quindi, una modifica di 1 bit cambierà l'uscita analogica con 0.00122100122.
Quindi, quella era la parte della conversione. L' MCP4921 è un IC a 8 pin. Di seguito è possibile trovare il diagramma dei pin e la descrizione.
L' IC MCP4921 comunica con il microcontrollore tramite il protocollo SPI. Per la comunicazione SPI, un dispositivo deve essere master, che invia dati o comandi al dispositivo esterno collegato come slave. Nel sistema di comunicazione SPI, più dispositivi slave possono essere collegati al singolo dispositivo master.
Per inviare i dati e il comando, è importante comprendere il registro dei comandi.
Nell'immagine sottostante, viene mostrato il registro dei comandi,
Il registro dei comandi è un registro a 16 bit. Il bit-15 al bit-12 viene utilizzato per il comando di configurazione. L'inserimento dei dati e la configurazione sono chiaramente mostrati nell'immagine sopra. In questo progetto, l'MCP4921 verrà utilizzato come la seguente configurazione:
Numero bit |
Configurazione |
Valore di configurazione |
Bit 15 |
DAC A |
0 |
Bit 14 |
Unbuffered |
0 |
Bit 13 |
1x (USCITA V * D / 4096) |
1 |
Bit 12 |
Bit di controllo dello spegnimento in uscita |
1 |
Quindi il binario è 0011 insieme ai dati determinati dai bit da D11 a D0 del registro. I dati a 16 bit 0011 xxxx xxxx xxxx devono essere inviati dove i primi 4 bit di MSB sono la configurazione e il resto è l'LSB. Sarà più chiaro vedendo il diagramma temporale del comando di scrittura.
Secondo il diagramma di temporizzazione e la scheda tecnica, il pin CS è basso per l'intero periodo di scrittura del comando sull'MCP4921.
Ora è il momento di interfacciare il dispositivo con l'hardware e scrivere i codici.
Componenti richiesti
Per questo progetto, sono necessari i seguenti componenti:
- MCP4921
- PIC16F877A
- Cristallo da 20 MHz
- A Display 16x2 caratteri LCD.
- Resistenza 2k -1 pz
- Condensatori 33pF - 2 pz
- Resistenza 4.7k - 1 pz
- Un multimetro per misurare la tensione di uscita
- Una breadboard
- Alimentazione 5V, un caricatore del telefono può funzionare.
- Molti cavi di collegamento o cavi berg.
- Ambiente di programmazione Microchip con kit programmatore e IDE con compilatore
Schematico
Di seguito è riportato lo schema del circuito per l' interfacciamento del DAC4921 con il microcontrollore PIC:
Il circuito è costruito in Breadboard-
Spiegazione del codice
Il codice completo per convertire i segnali digitali in analogici con PIC16F877A è fornito alla fine dell'articolo. Come sempre, dobbiamo prima impostare i bit di configurazione nel microcontrollore PIC.
// PIC16F877A Impostazioni dei bit di configurazione // Istruzioni di configurazione della riga sorgente 'C' // CONFIG #pragma config FOSC = HS // Bit di selezione dell'oscillatore (oscillatore HS) #pragma config WDTE = OFF // Bit di abilitazione timer watchdog (WDT disabilitato) # pragma config PWRTE = OFF // Bit di abilitazione timer di accensione (PWRT disabilitato) #pragma config BOREN = ON // Bit di abilitazione ripristino brown-out (BOR abilitato) #pragma config LVP = OFF // Bassa tensione (alimentazione singola) Bit di abilitazione della programmazione seriale in-circuit (il pin RB3 / PGM ha la funzione PGM; programmazione a bassa tensione abilitata) #pragma config CPD = OFF // Bit di protezione del codice della memoria EEPROM dei dati (protezione del codice EEPROM dei dati disattivata) #pragma config WRT = OFF // Bit di abilitazione scrittura memoria programma flash (protezione da scrittura disattivata; tutta la memoria del programma può essere scritta dal controllo EECON) #pragma config CP = OFF // Bit di protezione codice memoria flash programma (protezione codice disattivata)
Le seguenti righe di codice vengono utilizzate per integrare i file di intestazione LCD e SPI, inoltre vengono dichiarate la frequenza XTAL e la connessione pin CS del DAC.
Il tutorial e la libreria PIC SPI possono essere trovati al collegamento indicato.
#includere
La funzione SPI_Initialize_Master () è leggermente modificata per una diversa configurazione richiesta per questo progetto. In questo caso, il registro SSPSTAT è configurato in modo tale che i dati di ingresso campionati alla fine del tempo di uscita dei dati e anche il clock SPI configurato come Transmit si verifichino al passaggio dalla modalità di stato orologio attivo a quella inattiva. Altro è lo stesso.
void SPI_Initialize_Master () { TRISC5 = 0; // Imposta come output SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Imposta come output per la modalità slave }
Inoltre, per la funzione seguente, SPI_Write () viene leggermente modificato. La trasmissione dei dati avverrà dopo che il buffer è stato cancellato per garantire una perfetta trasmissione dei dati su SPI.
void SPI_Write (char in arrivo) { SSPBUF = in arrivo; // Scrive i dati forniti dall'utente nel buffer while (! SSPSTATbits.BF); }
La parte importante del programma è il driver MCP4921. È una parte leggermente complicata poiché il comando e i dati digitali vengono stampati insieme per fornire dati completi a 16 bit tramite SPI. Tuttavia, tale logica è chiaramente mostrata nei commenti del codice.
/ * Questa funzione serve per convertire il valore digitale in analogico. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, quindi 12bit 2 ^ 12 = 4096 Per il riferimento a 5V, il passo sarà 5/4095 = 0.0012210012210012V o 1mV (circa) * / unsigned int container; unsigned int MSB; LSB int senza segno; / * Passaggio: 1, memorizza i dati a 12 bit nel contenitore Supponiamo che i dati siano 4095, in binario 1111 1111 1111 * / contenitore = valore; / * Passaggio: 2 Creazione fittizia a 8 bit. Quindi, dividendo 256, i 4 bit superiori vengono catturati in LSB LSB = 0000 1111 * / LSB = container / 256; / * Passaggio: 3 Invio della configurazione con punzonatura dei dati a 4 bit. LSB = 0011 0000 O 0000 1111. Il risultato è 0011 1111 * / LSB = (0x30) - LSB; / * Passaggio: 4 Il contenitore ha ancora il valore a 21 bit. Estrazione degli 8 bit inferiori. 1111 1111 AND 1111 1111 1111. Il risultato è 1111 1111 che è MSB * / MSB = 0xFF & container; / * Passaggio: 4 Invio dei dati a 16 bit dividendoli in due byte. * / DAC_CS = 0; // CS è basso durante la trasmissione dei dati. Come da scheda tecnica è richiesto SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Nella funzione principale, viene utilizzato un "ciclo for" in cui vengono creati i dati digitali per la creazione dell'uscita di 1 V, 2 V, 3 V, 4 V e 5 V. Il valore digitale viene calcolato rispetto alla tensione di uscita / 0,0012210012210012 millivolt.
void main () { system_init (); introduzione_schermo (); numero int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0.0012210012210012; schermo pulito(); lcd_com (FIRST_LINE); lcd_puts ("DATI inviati: -"); lcd_print_number (numero); lcd_com (SECOND_LINE); lcd_puts ("Uscita: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (numero); __delay_ms (300); } } }
Testare la conversione da digitale ad analogico usando PIC
Il circuito costruito viene testato utilizzando Multi-meter. Nelle immagini seguenti, la tensione di uscita e i dati digitali sono mostrati sul display LCD. Il multimetro mostra una lettura ravvicinata.
Il codice completo con un video funzionante è allegato di seguito.