- MCP4921 DAC (digitalno-analogni pretvornik)
- Potrebne komponente
- Shema
- Razlaga kode
- Testiranje digitalne v analogno pretvorbo s pomočjo PIC
Digital and Analog je sestavni del elektronike. Večina naprav ima tako ADC kot DAC in se uporabljajo, kadar je treba pretvoriti signale iz analognega v digitalni ali digitalni v analogni. Tudi signali iz resničnega sveta, kot sta zvok in svetloba, so po naravi analogni, zato je treba digitalne signale, kadar je treba uporabiti te resnične signale, pretvoriti v analogne, na primer za ustvarjanje zvoka s pomočjo zvočnikov ali za nadzor svetlobnega vira.
Druga vrsta DAC je modulator impulzne širine (PWM). PWM sprejme digitalno besedo in ustvari digitalni impulz s spremenljivo širino impulza. Ko se ta signal prenese skozi filter, bo rezultat povsem analogen. Analogni signal ima lahko več vrst podatkov v signalu.
V tej vadnici bomo povezali DAC MCP4921 z Microchip PIC16F877A za digitalno analogno pretvorbo.
Tu v tej vadnici bomo pretvorili digitalni signal v analogni signal in prikazali vhodno digitalno vrednost in izhodno analogno vrednost na LCD 16x2. Zagotovil bo 1V, 2V, 3V, 4V in 5V kot končni analogni izhod, ki je prikazan v videu na koncu. Več o DAC lahko izveste v naši dragoceni vadnici povezovanja DAC s ploščami Raspberry Pi, Arduino in STM32.
DAC se lahko uporablja v številnih aplikacijah, kot so krmiljenje motorja, nadzor svetlosti LED-luči, ojačevalnik zvoka, kodirniki videa, sistemi za zbiranje podatkov itd. Preden skočite neposredno na vmesniški del, je pomembno, da imate pregled o MCP4921.
MCP4921 DAC (digitalno-analogni pretvornik)
MCP4921 je 12-bitni DAC, zato bo MCP4921 zagotavljal 12 bitov izhodne ločljivosti. Ločljivost DAC pomeni število digitalnih bitov, ki jih je mogoče pretvoriti v analogni signal. Koliko vrednosti lahko s tem dosežemo, temelji na formuli. Za 12-bitno je = 4096. To pomeni, da lahko 12-bitni DAC ločljivosti ustvari 4096 različnih izhodov.
Z uporabo te vrednosti lahko enostavno izračunamo enostopenjsko analogno napetost. Za izračun korakov je potrebna referenčna napetost. Ker je logična napetost naprave 5V, je koračna napetost 5/4095 (4096-1, ker izhodišče za digitalno ni 1, je 0), kar je 0,00122100122 milivolta. Torej, sprememba 1 bita bo spremenila analogni izhod s 0,00122100122.
Torej, to je bil del pretvorbe. MCP4921 je 8-pin IC. Spodnji diagram in opis najdete spodaj.
MCP4921 IC komunicira z mikrokrmilnikom, ki ga protokola SPI. Za komunikacijo SPI mora biti naprava glavna, ki odda podatke ali ukaz zunanji napravi, priključeni kot pomožni enoti. V komunikacijskem sistemu SPI je mogoče z eno glavno napravo povezati več pomožnih naprav.
Za oddajo podatkov in ukaza je pomembno razumeti ukazni register.
Na spodnji sliki je prikazan ukazni register,
Ukazni register je 16-bitni register postal. Bit-15 do bit-12 se uporablja za ukaz za konfiguracijo. Vnos podatkov in konfiguracija sta jasno prikazana na zgornji sliki. V tem projektu bo MCP4921 uporabljen kot naslednja konfiguracija -
Številka bitov |
Konfiguracija |
Vrednost konfiguracije |
Bit 15 |
DAC A |
0 |
Bit 14 |
Nebuferirano |
0 |
Bit 13 |
1x (V IZHOD * D / 4096) |
1. |
Bit 12 |
Izhodni nadzorni bit |
1. |
Binarni je torej 0011 skupaj s podatki, ki jih določajo bitji D11 do D0 registra. Predložiti je treba 16-bitne podatke 0011 xxxx xxxx xxxx, kjer je prvi 4-bitni MSB konfiguracija, ostalo pa LSB. Jasneje bo, če si ogledate časovni diagram ukaza za pisanje.
Glede na časovni diagram in podatkovni list je zatič CS nizek za celotno obdobje pisanja ukaza na MCP4921.
Zdaj je čas, da napravo povežemo s strojno opremo in zapišemo kode.
Potrebne komponente
Za ta projekt so potrebne naslednje komponente -
- MCP4921
- PIC16F877A
- 20 MHz kristal
- Zaslon LCD s 16 x 2 znaki.
- 2k upor -1 kos
- 33pF kondenzatorji - 2 kos
- 4.7k upor - 1 kos
- Večmeter za merjenje izhodne napetosti
- Tabela
- 5V napajalnik, telefonski polnilnik lahko deluje.
- Veliko priključnih žic ali berg žic.
- Programsko okolje Microchip s programerskim kompletom in IDE s prevajalnikom
Shema
Shema vezja za povezovanje DAC4921 z mikrokrmilnikom PIC je podana spodaj:
Vezje je zgrajeno v Breadboard-
Razlaga kode
Popolna koda za pretvorbo digitalnih signalov v analogno s PIC16F877A je podana na koncu članka. Kot vedno moramo najprej nastaviti konfiguracijske bite v mikrokrmilniku PIC.
// PIC16F877A Nastavitve konfiguracijskega bita // Izjave o konfiguraciji izvorne vrstice 'C' // CONFIG #pragma config FOSC = HS // Oscilator Izbirni bit (HS oscilator) #pragma config WDTE = OFF // Bit Watchg Enable bit (WDT disabled) # pragma config PWRTE = OFF // bit za vklop časovnika za vklop (PWRT onemogočen) #pragma config BOREN = ON // bit za omogočanje ponastavitve Brown-out (omogočen BOR) #pragma config LVP = OFF // nizkonapetostna (enojna napajalna enota)) Bit za omogočanje serijskega programiranja v krogu (pin RB3 / PGM ima funkcijo PGM; nizkonapetostno programiranje je omogočeno) #pragma config CPD = OFF // Bit zaščite pomnilniške kode EEPROM (zaščita kode EEPROM podatkov izključena) #pragma config WRT = OFF // Flash Program Memory Flash Omogoči bitove (Zaščita pred izklopom; ves programski pomnilnik lahko zapišete z nadzorom EECON) #pragma config CP = OFF // Flash Program Flash Code Protection bit (Zaščita kode izključena)
Spodnje vrstice kode se uporabljajo za integracijo datotek z glavami LCD in SPI, navedena je tudi frekvenca XTAL in CS-pin DAC-ove povezave.
Vadnico in knjižnico PIC SPI najdete na dani povezavi.
#include
Funkcija SPI_Initialize_Master () je nekoliko spremenjena za drugačno konfiguracijo, potrebno za ta projekt. V tem primeru je register SSPSTAT konfiguriran tako, da se vhodni podatki, vzorčeni ob koncu izhodnega časa podatkov, in tudi ura SPI, konfigurirana kot Transmit, pojavijo na prehodu iz aktivnega stanja v stanju mirovanja. Tudi drugo je enako.
void SPI_Initialize_Master () { TRISC5 = 0; // Nastavi kot izhod SSPSTAT = 0b11000000; // str 74/234 SSPCON = 0b00100000; // str 75/234 TRISC3 = 0; // Nastavi kot izhod za pomožni način }
Za spodnjo funkcijo je SPI_Write () nekoliko spremenjen. Do prenosa podatkov bo prišlo, ko bo medpomnilnik izpraznjen, da se zagotovi popoln prenos podatkov prek SPI.
void SPI_Write (char dohodno) { SSPBUF = dohodno; // Uporabniku dane podatke zapišite v medpomnilnik while (! SSPSTATbits.BF); }
Pomemben del programa je gonilnik MCP4921. To je rahlo zapleten del, saj se ukaz in digitalni podatki združijo, da se zagotovijo celotni 16-bitni podatki prek SPI. Vendar je ta logika jasno prikazana v komentarjih kode.
/ * Ta funkcija je namenjena pretvorbi digitalne vrednosti v analogno. * / void convert_DAC (nepodpisana vrednost int) { / * Velikost koraka = 2 ^ n, torej 12bit 2 ^ 12 = 4096 Za referenco 5V bo korak 5/4095 = 0,0012210012210012V ali 1mV (približno) * / nepodpisani int vsebnik; nepodpisan int MSB; nepodpisan int LSB; / * Korak: 1, shranil je 12-bitne podatke v vsebnik Recimo, da so podatki 4095, v binarni obliki 1111 1111 1111 * / vsebnik = vrednost; / * Korak: 2 Ustvarjanje lutke 8 bitov. Torej, z delitvijo 256, so zajeti zgornji 4 biti v LSB LSB = 0000 1111 * / LSB = vsebnik / 256; / * Korak: 3 Pošiljanje konfiguracije s prebijanjem 4-bitnih podatkov. LSB = 0011 0000 ALI 0000 1111. Rezultat je 0011 1111 * / LSB = (0x30) - LSB; / * Korak: 4 Vsebnik ima še vedno 21-bitno vrednost. Izdvajanje spodnjih 8 bitov. 1111 1111 IN 1111 1111 1111. Rezultat je 1111 1111, kar je MSB * / MSB = 0xFF & vsebnik; / * Korak: 4 Pošiljanje 16-bitnih podatkov z delitvijo na dva bajta. * / DAC_CS = 0; // CS je med prenosom podatkov nizek. Glede na podatkovni list je potreben SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
V glavni funkciji se uporablja „zanka“, kjer se ustvarijo digitalni podatki za ustvarjanje izhodnih napetosti 1V, 2V, 3V, 4V in 5V. Digitalna vrednost se izračuna glede na izhodno napetost / 0,0012210012210012 milivolt.
void main () { system_init (); uvodni_zaslon (); int število = 0; int volt = 0; medtem ko (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { število = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DATA Sent: -"); lcd_print_number (število); lcd_com (SECOND_LINE); lcd_puts ("Izhod: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (število); __zakasnitev_ms (300); } } }
Testiranje digitalne v analogno pretvorbo s pomočjo PIC
Vgrajeno vezje se preskusi z uporabo merilnika z večmerom. Na spodnjih slikah sta izhodna napetost in digitalni podatki prikazani na LCD-prikazovalniku. Multi-meter prikazuje natančno branje.
Celotna koda z delujočim videom je priložena spodaj.