- MCP4921 DAC (convertidor digital a analògic)
- Components necessaris
- Esquema
- Explicació del codi
- Prova de la conversió digital a analògica mitjançant PIC
El digital i l'analògic són una part integral de l'electrònica. La majoria dels dispositius tenen tant ADC com DAC i s’utilitzen quan es necessita convertir senyals d’analògic a digital o digital a analògic. També els senyals del món real com el so i la llum tenen una naturalesa analògica, de manera que sempre que s’han d’utilitzar aquests senyals del món real, els senyals digitals s’han de convertir a analògics, per exemple per produir so mitjançant altaveus o per controlar una font de llum.
Un altre tipus de DAC és un modulador d’amplada de pols (PWM). Un PWM pren una paraula digital i genera un impuls digital amb amplada de pols variable. Quan aquest senyal es fa passar per un filtre, el resultat serà purament analògic. Un senyal analògic pot tenir diversos tipus de dades en un senyal.
En aquest tutorial, farem una interfície de DAC MCP4921 amb Microchip PIC16F877A per a la conversió digital a analògica.
Aquí, en aquest tutorial, convertirem el senyal digital en un senyal analògic i mostrarem el valor digital d’entrada i el valor analògic de sortida en un LCD 16x2. Proporcionarà 1V, 2V, 3V, 4V i 5V com a sortida analògica final que es demostra al vídeo donat al final. Podeu obtenir més informació sobre DAC al nostre preciós tutorial sobre la interfície DAC amb les plaques Raspberry Pi, Arduino i STM32.
El DAC es pot utilitzar en moltes aplicacions com ara Control del motor, Control de la brillantor de les llums LED, Amplificador d'àudio, Codificadors de vídeo, Sistemes d'adquisició de dades, etc. Abans de saltar directament a la part d'interfície, és important tenir una visió general sobre MCP4921.
MCP4921 DAC (convertidor digital a analògic)
MCP4921 és un DAC de 12 bits, de manera que MCP4921 proporcionarà 12 bits de resolució de sortida. La resolució DAC significa el nombre de bits digitals que es poden convertir en senyal analògic. Quants valors podem obtenir d’això es basa en la fórmula. Per a 12 bits, és = 4096. Això significa que la resolució de 12 bits de DAC podria produir 4096 sortides diferents.
En utilitzar aquest valor, es pot calcular fàcilment la tensió de pas analògic individual. Per calcular els passos, es requereix la tensió de referència. Com que la tensió lògica del dispositiu és de 5 V, la tensió de pas és de 5/4095 (4096-1 perquè el punt inicial del digital no és 1, és 0), que és 0,00122100122 milivolts. Per tant, un canvi d’1 bit canviarà la sortida analògica amb 0,00122100122.
Per tant, aquesta era la part de conversió. El MCP4921 és un CI de 8 pins. El diagrama de pins i la descripció es poden trobar a continuació.


L' IC MCP4921 es comunica amb el microcontrolador mitjançant el protocol SPI. Per a la comunicació SPI, un dispositiu ha de ser mestre, que envia dades o ordres al dispositiu extern connectat com a esclau. Al sistema de comunicació SPI, es poden connectar diversos dispositius esclaus amb el dispositiu principal únic.
Per enviar les dades i l'ordre, és important entendre el registre d'ordres.
A la imatge següent, es mostra el registre d’ordres,

El registre d’ordres és un registre de 16 bits. El bit-15 a bit-12 s’utilitza per a l’ordre de configuració. L'entrada de dades i la configuració es mostren clarament a la imatge anterior. En aquest projecte, l'MCP4921 s'utilitzarà com a configuració següent:
|
Número de bits |
Configuració |
Valor de configuració |
|
Bit 15 |
DAC A |
0 |
|
Bit 14 |
Sense amortiment |
0 |
|
Bit 13 |
1x (V OUT * D / 4096) |
1 |
|
Bit 12 |
Bit de control d’apagada de sortida |
1 |
Per tant, el binari és 0011 juntament amb les dades que determinen els bits D11 a D0 del registre. Cal enviar les dades de 16 bits 0011 xxxx xxxx xxxx on el primer 4 bits de MSB és la configuració i la resta és el LSB. Serà més clar veient el diagrama de temps d'ordres d'escriptura.

Segons el diagrama de temps i el full de dades, el pin CS és baix durant tot el període d'escriptura d'ordres a l'MCP4921.
Ara és el moment de connectar el dispositiu amb el maquinari i escriure els codis.
Components necessaris
Per a aquest projecte, es requereixen els components següents:
- MCP4921
- PIC16F877A
- Cristall de 20 MHz
- Una pantalla LCD de 16x2 caràcters.
- 2k resistència -1 pc
- Condensadors de 33pF: 2 unitats
- Resistència de 4,7 k - 1 unitat
- Un multímetre per mesurar la tensió de sortida
- Una pissarra
- Alimentació de 5V, pot funcionar un carregador de telèfon.
- Molts cables de connexió o cables de Berg.
- Entorn de programació de microxips amb kit de programador i IDE amb compilador
Esquema
A continuació es mostra el diagrama de circuits per a la interfície de DAC4921 amb el microcontrolador PIC:

El circuit està construït en Breadboard-

Explicació del codi
Al final de l'article es dóna un codi complet per convertir els senyals digitals en analògics amb PIC16F877A. Com sempre, primer hem d’establir els bits de configuració al microcontrolador PIC.
// bit de configuració Configuració PIC16F877A // declaracions de configuració de línia font 'C' // CONFIG #pragma config bits d'Fosc = SA // Selecció oscil·lador (SA oscil·lador) #pragma config WDTE = OFF // temporitzador de vigilància Activa bit (WDT desactivat) # pragma config PWRTE = OFF // Bit d’activació del temporitzador d’encesa (PWRT desactivat) #pragma config BOREN = ON // Brownable out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low Voltage (Single-Supply)) Bit d’activació de la programació en sèrie en circuit (el pin RB3 / PGM té una funció PGM; la programació de baixa tensió està activada) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Memòria del programa Flash Permet escriure bits (Protecció contra escriptura desactivada; tota la memòria del programa pot ser escrita pel control EECON) #pragma config CP = OFF // Bit de protecció del codi de memòria del programa Flash (protecció del codi desactivada)
Les línies de codi següents s’utilitzen per integrar fitxers de capçalera LCD i SPI, també es declara la freqüència XTAL i la connexió de pin CS del DAC.
El tutorial i la biblioteca PIC SPI es poden trobar a l'enllaç indicat.
#incloure
Funciton SPI_Initialize_Master () es modifica lleugerament per a una configuració diferent necessària per a aquest projecte. En aquest cas, el registre SSPSTAT es configura de manera que les dades d'entrada mostrejades al final del temps de sortida de dades i el rellotge SPI configurat com a transmissió es produeixin en la transició del mode d'estat de rellotge actiu al ralentí. Un altre és el mateix.
void SPI_Initialize_Master () { TRISC5 = 0; // Estableix com a sortida SSPSTAT = 0b11000000; // pàg 74/234 SSPCON = 0b00100000; // pàg 75/234 TRISC3 = 0; // Estableix com a sortida per al mode esclau }
A més, per a la funció següent, SPI_Write () es modifica lleugerament. La transmissió de dades es produirà després d’esborrar la memòria intermèdia per garantir una transmissió de dades perfecta mitjançant SPI.
void SPI_Write (char entrant) { SSPBUF = entrant; // Escriviu les dades donades per l'usuari al buffer mentre (! SSPSTATbits.BF); }
La part important del programa és el controlador MCP4921. És una part lleugerament complicada, ja que l'ordre i les dades digitals es combinen per proporcionar dades completes de 16 bits a través de l'SPI. Tanmateix, aquesta lògica es mostra clarament als comentaris del codi.
/ * Aquesta funció serveix per convertir el valor digital en analògic. * / void convert_DAC (valor int signat) { / * Mida del pas = 2 ^ n, per tant, 12 bits 2 ^ 12 = 4096 Per a la referència de 5 V, el pas serà 5/4095 = 0,0012210012210012V o 1 mV (aprox) * / contenidor int sense signe; sense signar int MSB; unsigned int LSB; / * Pas: 1, emmagatzema les dades de 12 bits al contenidor Suposem que les dades són 4095, en binari 1111 1111 1111 * / container = value; / * Pas: 2 Creació de Dummy de 8 bits. Així, dividint 256, els 4 bits superiors es capturen a LSB LSB = 0000 1111 * / LSB = contenidor / 256; / * Pas: 3 Enviament de la configuració punxant les dades de 4 bits. LSB = 0011 0000 O 0000 1111. El resultat és 0011 1111 * / LSB = (0x30) - LSB; / * Pas: 4 El contenidor encara té el valor de 21 bits. Extracció dels 8 bits inferiors. 1111 1111 I 1111 1111 1111. El resultat és 1111 1111 que és MSB * / MSB = 0xFF & container; / * Pas: 4 Enviar les dades de 16 bits dividint-los en dos bytes. * / DAC_CS = 0; // CS és baix durant la transmissió de dades. Segons el full de dades, es requereix SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
A la funció principal, s'utilitza un bucle for on es creen les dades digitals per crear la sortida d'1V, 2V, 3V, 4V i 5V. El valor digital es calcula en funció del voltatge de sortida / 0,0012210012210012 milivolts.
void main () { system_init (); introduction_screen (); número int = 0; int volt = 0; mentre que (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { número = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DADES enviades: -"); lcd_print_number (número); lcd_com (SECOND_LINE); lcd_puts ("Sortida: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (número); __delay_ms (300); } } }
Prova de la conversió digital a analògica mitjançant PIC
El circuit construït es prova amb diversos metres. A les imatges següents, el voltatge de sortida i les dades digitals es mostren a la pantalla LCD. El multímetre està llegint de prop.

A continuació s’adjunta el codi complet amb un vídeo de treball.
