- MCP4921 DAC (digital til analog omformer)
- Komponenter kreves
- Skjematisk
- Kode Forklaring
- Testing av digital til analog konvertering ved bruk av PIC
Digital og analog er en integrert del av elektronikk. De fleste av enhetene har både ADC og DAC, og de brukes når det er behov for å konvertere signaler enten fra analog til digital eller digital til analog. Også de virkelige verdenssignalene som lyd og lys er analoge i naturen, så når disse virkelige verdenssignalene må brukes, må de digitale signalene konverteres til analoge, for eksempel for å produsere lyd ved hjelp av høyttalere eller for å kontrollere en lyskilde.
En annen type DAC er en Pulse Width Modulator (PWM). En PWM tar et digitalt ord og genererer en digital puls med variabel pulsbredde. Når dette signalet sendes gjennom et filter, blir resultatet rent analogt. Et analogt signal kan ha flere typer data i et signal.
I denne veiledningen vil vi grensesnitt DAC MCP4921 med Microchip PIC16F877A for digital til analog konvertering.
Her i denne opplæringen vil vi konvertere det digitale signalet til et analogt signal og vise den digitale inngangsverdien og den analoge utgangsverdien på 16x2 LCD. Det vil gi 1V, 2V, 3V, 4V og 5V som den endelige analoge utgangen som vises i videoen gitt på slutten. Du kan lære mer om DAC i vår dyrebare opplæring om DAC-grensesnitt med Raspberry Pi, Arduino og STM32-kort.
DAC kan brukes i mange applikasjoner som motorstyring, kontrolllysstyrke på LED-lysene, lydforsterker, videokodere, datainnsamlingssystemer etc. Før du hopper direkte til grensesnittdelen, er det viktig å ha oversikt over MCP4921.
MCP4921 DAC (digital til analog omformer)
MCP4921 er en 12-biters DAC, så MCP4921 vil gi 12 bits utgangsoppløsning. DAC-oppløsning betyr antall digitale biter som kan konverteres til analogt signal. Hvor mange verdier vi kan oppnå fra dette er basert på formelen. For 12-bit er det = 4096. Dette betyr at 12-biters oppløsning DAC kan produsere 4096 forskjellige utganger.
Ved å bruke denne verdien kan man enkelt beregne den enkle analoge trinnspenningen. For å beregne trinnene kreves referansespenningen. Ettersom den logiske spenningen for enheten er 5V, er trinnspenningen 5/4095 (4096-1 fordi utgangspunktet for digital ikke er 1, det er 0), som er 0,00122100122 millivolt. Så, en endring på 1 bit vil endre den analoge utgangen med 0.00122100122.
Så det var konverteringsdelen. Den MCP4921 er en 8-polet IC. Den tapp skjemaet og i beskrivelsen kan bli funnet nedenfor.
Den MCP4921 IC kommuniserer med mikrokontrolleren ved SPI-protokollen. For SPI-kommunikasjon må en enhet være master, som sender data eller kommando til den eksterne enheten som er koblet til som en slave. I SPI-kommunikasjonssystem kan flere slaveenheter kobles til den eneste masterenheten.
For å sende inn data og kommando er det viktig å forstå kommandoregisteret.
På bildet nedenfor vises kommandoregisteret,
Den kommandoregister er et 16-bit register. Bit-15 til bit-12 brukes til konfigurasjonskommandoen. Datainngangen og konfigurasjonen vises tydelig i bildet ovenfor. I dette prosjektet vil MCP4921 brukes som følgende konfigurasjon-
Bitnummer |
Konfigurasjon |
Konfigurasjonsverdi |
Bit 15 |
DAC A |
0 |
Bit 14 |
Ubufret |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Utgang Power Down Control Bit |
1 |
Så binær er 0011 sammen med dataene som bestemmes av D11 til DO bitene i registeret. 16-biters data 0011 xxxx xxxx xxxx må sendes inn der den første 4-biten av MSB er konfigurasjonen, og resten er LSB. Det blir tydeligere ved å se tidsdiagrammet for skrivekommando.
I henhold til tidsskjemaet og databladet er CS-pinnen lav for hele kommandoskrivperioden til MCP4921.
Nå er det på tide å grensesnitt enheten med maskinvaren og skrive kodene.
Komponenter kreves
For dette prosjektet kreves følgende komponenter -
- MCP4921
- PIC16F877A
- 20 MHz krystall
- En LCD-skjerm på 16x2 tegn.
- 2k motstand -1 stk
- 33pF kondensatorer - 2 stk
- 4,7 k motstand - 1 stk
- En multimeter for å måle utgangsspenningen
- Et brødbrett
- 5V strømforsyning, en telefonlader kan fungere.
- Mange tilkoblingskabler eller bergledninger.
- Programmeringsmiljø med mikrochip med programmeringssett og IDE med kompilator
Skjematisk
Kretsdiagram for grensesnitt DAC4921 med PIC Microcontroller er gitt nedenfor:
Kretsen er konstruert i brødbrett-
Kode Forklaring
Komplett kode for konvertering av digitale signaler til analog med PIC16F877A er gitt på slutten av artikkelen. Som alltid må vi først sette konfigurasjonsbitene i PIC-mikrokontrolleren.
// 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 disabled) # pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply)) In-Circuit Serial Programming Enable bit (RB3 / PGM pin har PGM-funksjon; lavspenningsprogrammering aktivert) #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 (Skrivebeskyttelse av; alt programminne kan skrives til av EECON-kontroll) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Kodelinjene nedenfor brukes til å integrere LCD- og SPI-headerfiler, også XTAL Frequency og DACs CS-pin-tilkobling er erklært.
PIC SPI-opplæringen og biblioteket finner du på den gitte lenken.
#inkludere
Funciton SPI_Initialize_Master () er litt modifisert for en annen konfigurasjon som kreves for dette prosjektet. I dette tilfellet er SSPSTAT-registeret konfigurert på en slik måte at inngangsdataene som samples ved slutten av datautgangstiden, og også SPI-klokken som er konfigurert som overføring, forekommer ved overgangen fra aktiv til inaktiv klokkemodus. Annet er det samme.
ugyldig SPI_Initialize_Master () { TRISC5 = 0; // Sett som utgang SSPSTAT = 0b11000000; // s. 74/234 SSPCON = 0b00100000; // sg 75/234 TRISC3 = 0; // Sett som utgang for slave-modus }
For funksjonen nedenfor er SPI_Write () endret litt. Dataoverføring vil skje etter at bufferen er ryddet for å sikre perfekt dataoverføring over SPI.
ugyldig SPI_Write (char innkommende) { SSPBUF = innkommende; // Skriv brukeroppgitte data i buffer mens (! SSPSTATbits.BF); }
Den viktige delen av programmet er MCP4921-driveren. Det er litt vanskelig, da kommandoen og digitale data blir slått sammen for å gi komplette 16-biters data over SPI. Imidlertid er den logikken tydelig vist i kodekommentarene.
/ * Denne funksjonen er for å konvertere den digitale verdien til den analoge. * / ugyldig convert_DAC (usignert int-verdi) { / * Trinnstørrelse = 2 ^ n, derfor 12bit 2 ^ 12 = 4096 For 5V-referanse vil trinnet være 5/4095 = 0,0012210012210012V eller 1mV (ca.) * / usignert int-beholder; usignert int MSB; usignert int LSB; / * Trinn: 1, lagret 12-biters data i beholderen Anta at dataene er 4095, i binær 1111 1111 1111 * / container = verdi; / * Trinn: 2 Opprette Dummy 8 bit. Så ved å dele 256 blir de øvre 4 bitene fanget i LSB LSB = 0000 1111 * / LSB = container / 256; / * Trinn: 3 Sende konfigurasjonen med hulling av 4-biters data. LSB = 0011 0000 ELLER 0000 1111. Resultatet er 0011 1111 * / LSB = (0x30) - LSB; / * Trinn: 4 Beholder har fremdeles 21bit-verdien. Pakke ut de nedre 8 bitene. 1111 1111 OG 1111 1111 1111. Resultatet er 1111 1111 som er MSB * / MSB = 0xFF & container; / * Trinn: 4 Sende 16bits-data ved å dele i to byte. * / DAC_CS = 0; // CS er lav under dataoverføring. I henhold til databladet kreves SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
I hovedfunksjonen brukes en 'for loop' der de digitale dataene for å skape utgang på 1V, 2V, 3V, 4V og 5V opprettes. Den digitale verdien beregnes mot utgangsspenningen / 0,0012210012210012 millivolt.
ugyldig hoved () { system_init (); introduksjon_skjerm (); int tall = 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 (nummer); __forsink_ms (300); } } }
Testing av digital til analog konvertering ved bruk av PIC
Den innebygde kretsen er testet med multimeter. På bildene nedenfor vises utgangsspenningen og de digitale dataene på LCD-skjermen. Multi-måleren viser nøye lesing.
Komplett kode med en arbeidsvideo er vedlagt nedenfor.