- MCP4921 DAC (convertor digital-analog)
- Componente necesare
- Schematic
- Explicarea codului
- Testarea conversiei de la digital la analog folosind PIC
Digitalul și analogul fac parte integrantă din electronică. Majoritatea dispozitivelor au atât ADC, cât și DAC și sunt utilizate atunci când este nevoie de conversia semnalelor, fie de la analog la digital, fie de la digital la analog. De asemenea, semnalele din lumea reală, cum ar fi sunetul și lumina, sunt analogice în natură, deci ori de câte ori aceste semnale din lumea reală trebuie utilizate, semnalele digitale trebuie convertite în analog, de exemplu pentru a produce sunet folosind difuzoare sau pentru a controla o sursă de lumină.
Un alt tip de DAC este un modulator de lățime a impulsurilor (PWM). Un PWM ia un cuvânt digital și generează un impuls digital cu lățime variabilă a impulsului. Când acest semnal este trecut printr-un filtru, rezultatul va fi pur analogic. Un semnal analogic poate avea mai multe tipuri de date într-un semnal.
În acest tutorial, vom interfața DAC MCP4921 cu Microchip PIC16F877A pentru conversie digitală în analogică.
Aici, în acest tutorial, vom converti semnalul digital într-un semnal analog și vom afișa valoarea digitală de intrare și valoarea analogică de ieșire pe 16x2 LCD. Acesta va furniza 1V, 2V, 3V, 4V și 5V ca ieșire analogică finală, care este demonstrată în videoclipul prezentat la final. Puteți afla mai multe despre DAC în prețiosul nostru tutorial de interfață DAC cu plăcile Raspberry Pi, Arduino și STM32.
DAC poate fi utilizat în multe aplicații, cum ar fi controlul motorului, controlul luminozității luminilor LED, amplificator audio, codificatoare video, sisteme de achiziție de date etc. Înainte de a trece direct la partea de interfață, este important să aveți o imagine de ansamblu despre MCP4921.
MCP4921 DAC (convertor digital-analog)
MCP4921 este un DAC de 12 biți, deci MCP4921 va oferi 12 biți de rezoluție de ieșire. Rezoluția DAC înseamnă numărul de biți digitali care pot fi convertiți în semnal analogic. Câte valori putem obține din aceasta se bazează pe formulă. Pentru 12 biți, este = 4096. Aceasta înseamnă că rezoluția de 12 biți DAC ar putea produce 4096 de ieșiri diferite.
Folosind această valoare, se poate calcula cu ușurință tensiunea de pas analogică. Pentru calcularea etapelor, este necesară tensiunea de referință. Deoarece tensiunea logică a dispozitivului este de 5V, tensiunea de pas este de 5/4095 (4096-1 deoarece punctul de pornire pentru digital nu este 1, este 0), care este 0,00122100122 milivolți. Deci, o schimbare de 1 bit va schimba ieșirea analogică cu 0,00122100122.
Deci, aceasta a fost partea de conversie. MCP4921 este un 8 pini IC. Diagrama pinilor și descrierea pot fi găsite mai jos.
MCP4921 IC comunică cu microcontroler prin protocolul SPI. Pentru comunicarea SPI, un dispozitiv trebuie să fie master, care trimite date sau comenzi către dispozitivul extern conectat ca sclav. În sistemul de comunicații SPI, mai multe dispozitive slave pot fi conectate cu un singur dispozitiv principal.
Pentru a trimite datele și comanda, este important să înțelegeți registrul comenzilor.
În imaginea de mai jos, este afișat registrul de comandă,
Registrul de comandă este un registru pe 16 biți. Bit-15 la bit-12 este utilizat pentru comanda de configurare. Introducerea datelor și configurația sunt clar afișate în imaginea de mai sus. În acest proiect, MCP4921 va fi folosit ca următoarea configurație-
Număr de biți |
Configurare |
Valoare de configurare |
Bit 15 |
DAC A |
0 |
Bit 14 |
Fără tampon |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Bit de control al puterii de ieșire |
1 |
Deci, binarul este 0011 împreună cu datele care sunt determinate de biții D11 până la D0 ai registrului. Datele pe 16 biți 0011 xxxx xxxx xxxx trebuie trimise acolo unde primul 4 biți de MSB este configurația, iar restul este LSB. Va fi mai clar văzând diagrama de sincronizare a comenzii de scriere.
Conform schemei de sincronizare și a fișei tehnice, pinul CS este scăzut pentru întreaga perioadă de scriere a comenzilor pe MCP4921.
Acum este momentul să interfațați dispozitivul cu hardware-ul și să scrieți codurile.
Componente necesare
Pentru acest proiect sunt necesare următoarele componente-
- MCP4921
- PIC16F877A
- Cristal de 20 MHz
- Un ecran LCD de 16x2 caractere.
- Rezistor 2k -1 buc
- Condensatori de 33pF - 2 buc
- Rezistor 4.7k - 1 buc
- Un multimetru pentru măsurarea tensiunii de ieșire
- O placă de măsurare
- Sursa de alimentare de 5V, un încărcător de telefon poate funcționa.
- O mulțime de fire de conectare sau fire Berg.
- Mediu de programare microcip cu kit Programator și IDE cu compilator
Schematic
Diagrama circuitului pentru interfața DAC4921 cu microcontrolerul PIC este prezentată mai jos:
Circuitul este construit în Breadboard-
Explicarea codului
Codul complet pentru conversia semnalelor digitale în analog cu PIC16F877A este dat la sfârșitul articolului. Ca întotdeauna, trebuie mai întâi să setăm biții de configurare în microcontrolerul PIC.
// PIC16F877A Setări de biți de configurare // Instrucțiuni de configurare a liniei sursă „C” // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscilator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) # pragma config PWRTE = OFF // Bit de activare Timer de pornire (PWRT dezactivat) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR activat) #pragma config LVP = OFF // Low-Voltage (Single-Supply)) Bit de activare a programării seriale în circuit (pinul RB3 / PGM are funcția PGM; programare de joasă tensiune activată) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Protecție la scriere dezactivată; toată memoria programului poate fi scrisă de către controlul EECON) #pragma config CP = OFF // Program de memorie Flash bit Protecție cod (Protecție cod dezactivată)
Liniile de cod de mai jos sunt utilizate pentru integrarea fișierelor antet LCD și SPI, de asemenea, este declarată frecvența XTAL și conexiunea pin DAC CS.
Tutorialul și biblioteca PIC SPI pot fi găsite la linkul dat.
#include
Funciton SPI_Initialize_Master () este ușor modificat pentru o configurație diferită necesară pentru acest proiect. În acest caz, registrul SSPSTAT este configurat în așa fel încât datele de intrare eșantionate la sfârșitul timpului de ieșire a datelor și, de asemenea, ceasul SPI configurat ca Transmitere are loc la trecerea de la modul de stare activ la modul de ceas inactiv. Altele sunt la fel.
void SPI_Initialize_Master () { TRISC5 = 0; // Setați ca ieșire SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Setați ca ieșire pentru modul sclav }
De asemenea, pentru funcția de mai jos, SPI_Write () este modificat ușor. Transmiterea datelor va avea loc după ce bufferul este golit pentru a asigura transmiterea perfectă a datelor prin SPI.
void SPI_Write (char incoming) { SSPBUF = incoming; // Scrieți datele date de utilizator în buffer while (! SSPSTATbits.BF); }
Partea importantă a programului este driverul MCP4921. Este o parte ușor dificilă, deoarece comanda și datele digitale sunt combinate pentru a furniza date complete pe 16 biți prin SPI. Cu toate acestea, această logică este clar arătată în comentariile de cod.
/ * Această funcție este pentru conversia valorii digitale în analog. * / void convert_DAC (valoare int nesemnată) { / * Dimensiune pas = 2 ^ n, Prin urmare 12 biți 2 ^ 12 = 4096 Pentru referință 5V, pasul va fi 5/4095 = 0,0012210012210012V sau 1mV (aproximativ) * / container nesemnat; nesemnat int MSB; nesemnat int LSB; / * Pasul: 1, a stocat datele de 12 biți în container Să presupunem că datele sunt 4095, în binar 1111 1111 1111 * / container = valoare; / * Pasul: 2 Crearea Dummy 8 biți. Deci, împărțind 256, cei 4 biți superiori sunt capturați în LSB LSB = 0000 1111 * / LSB = container / 256; / * Pasul: 3 Trimiterea configurației cu perforarea datelor de 4 biți. LSB = 0011 0000 SAU 0000 1111. Rezultatul este 0011 1111 * / LSB = (0x30) - LSB; / * Pasul: 4 Containerul are în continuare valoarea de 21 biți. Extragerea celor 8 biți inferiori. 1111 1111 ȘI 1111 1111 1111. Rezultatul este 1111 1111 care este MSB * / MSB = 0xFF & container; / * Pasul: 4 Trimiterea datelor de 16 biți împărțind în doi octeți. * / DAC_CS = 0; // CS este scăzut în timpul transmiterii datelor. Conform fișei tehnice, este necesar SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
În funcția principală, este utilizată o „buclă for” în care sunt create datele digitale pentru crearea ieșirii de 1V, 2V, 3V, 4V și 5V. Valoarea digitală este calculată în funcție de tensiunea de ieșire / 0,0012210012210012 milivolți.
void main () { system_init (); introduction_screen (); numărul int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DATA Trimise: -"); lcd_print_number (număr); lcd_com (SECOND_LINE); lcd_puts ("Ieșire: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (număr); __delay_ms (300); } } }
Testarea conversiei de la digital la analog folosind PIC
Circuitul construit este testat folosind Multi-meter. În imaginile de mai jos, tensiunea de ieșire și datele digitale sunt afișate pe ecranul LCD. Multimetrul arată o lectură atentă.
Codul complet cu un videoclip funcțional este atașat mai jos.