- MCP4921 DAC (digital til analog konverter)
- Komponenter, der kræves
- Skematisk
- Kode Forklaring
- Test af digital til analog konvertering ved hjælp af PIC
Digital og analog er en integreret del af elektronik. De fleste af enhederne har både ADC såvel som DAC, og de bruges, når der er behov for at konvertere signaler enten fra analog til digital eller digital til analog. Også de virkelige verdenssignaler som lyd og lys er analoge i naturen, så når disse virkelige verdenssignaler skal bruges, skal de digitale signaler konverteres til analoge, for eksempel for at producere lyd ved hjælp af højttalere eller for at styre en lyskilde.
En anden type DAC er en pulsbreddemodulator (PWM). En PWM tager et digitalt ord og genererer en digital puls med variabel pulsbredde. Når dette signal føres gennem et filter, bliver resultatet rent analogt. Et analogt signal kan have flere typer data i et signal.
I denne vejledning vil vi interface DAC MCP4921 med Microchip PIC16F877A til digital til analog konvertering.
Her i denne vejledning konverterer vi det digitale signal til et analogt signal og viser den digitale indgangsværdi og output-analoge værdi på 16x2 LCD. Det vil give 1V, 2V, 3V, 4V og 5V som den endelige analoge udgang, som demonstreres i videoen, der er vist i slutningen. Du kan læse mere om DAC i vores dyrebare tutorial om DAC-interface med Raspberry Pi, Arduino og STM32-kort.
DAC kan bruges i mange applikationer som f.eks. Motorkontrol, lysstyrke på LED-lys, lydforstærker, videokodere, dataopsamlingssystemer osv. Inden du hopper direkte til grænsefladedelen, er det vigtigt at have et overblik over MCP4921.
MCP4921 DAC (digital til analog konverter)
MCP4921 er en 12 bit DAC, så MCP4921 giver 12 bit outputopløsning. DAC-opløsning betyder antal digitale bits, der kan konverteres til analogt signal. Hvor mange værdier vi kan opnå ud fra dette er baseret på formlen. For 12-bit er det = 4096. Dette betyder, at 12-bit opløsning DAC kunne producere 4096 forskellige udgange.
Ved at bruge denne værdi kan man let beregne den enkle analoge trin spænding. Til beregning af trinene kræves referencespænding. Da enhedens logiske spænding er 5V, er trinspændingen 5/4095 (4096-1, fordi startpunktet for digital ikke er 1, det er 0), hvilket er 0,00122100122 millivolt. Så en ændring på 1 bit vil ændre den analoge udgang med 0,00122100122.
Så det var konverteringsdelen. Den MCP4921 er en 8-polet IC. Den pin diagram og beskrivelsen kan findes nedenfor.
Den MCP4921 IC kommunikerer med mikrocontrolleren af SPI protokol. Til SPI-kommunikation skal en enhed være master, som sender data eller kommando til den eksterne enhed, der er tilsluttet som en slave. I SPI-kommunikationssystem kan flere slaveenheder tilsluttes til den enkelte masterenhed.
For at indsende dataene og kommandoen er det vigtigt at forstå kommandoregistret.
I nedenstående billede vises kommandoregistret,
Den kommando register er et 16-bit register. Bit-15 til bit-12 bruges til konfigurationskommandoen. Dataindtastningen og konfigurationen vises tydeligt i ovenstående billede. I dette projekt vil MCP4921 blive brugt som følgende konfiguration-
Bitnummer |
Konfiguration |
Konfigurationsværdi |
Bit 15 |
DAC A |
0 |
Bit 14 |
Ubufret |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Output Power Down Control Bit |
1 |
Så den binære er 0011 sammen med de data, der bestemmes af D11 til D0 bitene i registret. 16-bit data 0011 xxxx xxxx xxxx skal indsendes, hvor den første 4 bit af MSB er konfigurationen, og resten er LSB. Det bliver tydeligere ved at se tidsdiagrammet for skrivekommando.
I henhold til tidsdiagrammet og databladet er CS-stiften lav i hele kommandoskrivperioden til MCP4921.
Nu er det tid til at interface enheden med hardwaren og skrive koder.
Komponenter, der kræves
Til dette projekt kræves følgende komponenter -
- MCP4921
- PIC16F877A
- 20 MHz krystal
- A Display 16x2 tegn LCD.
- 2k modstand -1 stk
- 33pF kondensatorer - 2 stk
- 4,7 k modstand - 1 stk
- Et multimeter til måling af udgangsspændingen
- Et brødbræt
- 5V strømforsyning, en telefonoplader kan fungere.
- Masser af tilslutningsledninger eller bergledninger.
- Programmeringsmiljø med mikrochip med programmeringssæt og IDE med compiler
Skematisk
Kredsløbsdiagram til grænseflade mellem DAC4921 og PIC Microcontroller er angivet nedenfor:
Kredsløbet er konstrueret i brødplade-
Kode Forklaring
Komplet kode til konvertering af digitale signaler til analog med PIC16F877A findes i slutningen af artiklen. Som altid er vi først nødt til at indstille konfigurationsbitene i PIC-mikrocontrolleren.
// PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) # pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT deaktiveret) # pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT deaktiveret) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) # pragma config LVP = OFF // Low-Voltage (Single-Supply)) Seriel programmering i kredsløb muliggør bit (RB3 / PGM-pin har PGM-funktion; lavspændingsprogrammering aktiveret) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash-programhukommelse Skriv Aktiver bits (skrivebeskyttelse er slået fra; al programhukommelse kan skrives til af EECON-kontrol) #pragma config CP = OFF // Flash- programhukommelseskodebeskyttelsesbit (kodebeskyttelse fra)
Nedenstående kodelinjer bruges til at integrere LCD- og SPI-headerfiler, også XTAL-frekvens og DACs CS-pin-forbindelse er erklæret.
PIC SPI-vejledningen og biblioteket kan findes på det givne link.
#omfatte
Funktion SPI_Initialize_Master () er let modificeret til en anden konfiguration, der kræves til dette projekt. I dette tilfælde er SSPSTAT-registret konfigureret på en sådan måde, at indgangsdataene, der samples ved slutningen af dataudgangstiden, og også SPI-uret, der er konfigureret som transmission, forekommer ved overgangen fra aktiv til inaktiv urtilstandstilstand. Andet er det samme.
ugyldig SPI_Initialize_Master () { TRISC5 = 0; // Indstil som output SSPSTAT = 0b11000000; // s. 74/234 SSPCON = 0b00100000; // sg 75/234 TRISC3 = 0; // Indstil som output for slave-tilstand }
Også for nedenstående funktion ændres SPI_Write () lidt. Dataoverførsel finder sted, når bufferen er ryddet for at sikre perfekt datatransmission over SPI.
ugyldigt SPI_Write (char indkommende) { SSPBUF = indkommende; // Skriv de brugeroplysninger, der er givet i bufferen, mens (! SSPSTATbits.BF); }
Den vigtige del af programmet er MCP4921-driveren. Det er en smule vanskelig del, da kommandoen og digitale data stanses sammen for at give komplette 16-bit data over SPI. Denne logik vises imidlertid tydeligt i kodekommentarerne.
/ * Denne funktion er til konvertering af den digitale værdi til den analoge. * / ugyldigt convert_DAC (usigneret int-værdi) { / * Trinstørrelse = 2 ^ n, Derfor 12bit 2 ^ 12 = 4096 For 5V-reference vil trinnet være 5/4095 = 0,0012210012210012V eller 1mV (ca.) * / usigneret int-container; usigneret int MSB; usigneret int LSB; / * Trin: 1, lagret 12 bit data i beholderen Antag at data er 4095, i binær 1111 1111 1111 * / container = værdi; / * Trin: 2 Oprettelse af dummy 8 bit. Så ved at dividere 256 fanges de øvre 4 bits i LSB LSB = 0000 1111 * / LSB = container / 256; / * Trin: 3 Afsendelse af konfigurationen med stansning af 4-bit data. LSB = 0011 0000 ELLER 0000 1111. Resultatet er 0011 1111 * / LSB = (0x30) - LSB; / * Trin: 4 Beholder har stadig 21bit-værdien. Udpakning af de nederste 8 bits. 1111 1111 OG 1111 1111 1111. Resultatet er 1111 1111, som er MSB * / MSB = 0xFF & container; / * Trin: 4 Afsendelse af 16bits-data ved at opdele i to byte. * / DAC_CS = 0; // CS er lav under datatransmission. I henhold til databladet kræves SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
I hovedfunktionen bruges en 'for loop', hvor de digitale data til oprettelse af output på 1V, 2V, 3V, 4V og 5V oprettes. Den digitale værdi beregnes mod udgangsspændingen / 0,0012210012210012 millivolt.
ugyldig main () { system_init (); introduktionsskærm (); int tal = 0; int volt = 0; mens (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { nummer = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DATA sendt: -"); lcd_print_number (nummer); lcd_com (SECOND_LINE); lcd_puts ("Output: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (antal); __forsinkelse (300); } } }
Test af digital til analog konvertering ved hjælp af PIC
Det indbyggede kredsløb testes ved hjælp af Multi-meter. På nedenstående billeder vises udgangsspændingen og de digitale data på LCD'et. Multi-måleren viser nøje aflæsning.
Komplet kode med en fungerende video er vedhæftet nedenfor.