- MCP4921 DAC (skaitmeninis į analoginį keitiklį)
- Būtini komponentai
- Schema
- Kodo paaiškinimas
- „Digital to Analog Conversion“ testavimas naudojant PIC
Skaitmeninis ir analoginis yra neatsiejama elektronikos dalis. Daugumoje prietaisų yra ir ADC, ir DAC, ir jie naudojami, kai reikia konvertuoti signalus iš analoginio į skaitmeninį arba skaitmeninį į analoginį. Taip pat realaus pasaulio signalai, tokie kaip garsas ir šviesa, yra analogiški, todėl kai tik reikia naudoti šiuos realaus pasaulio signalus, skaitmeniniai signalai turi būti paversti analoginiais, pavyzdžiui, norint sukurti garsą naudojant garsiakalbius arba valdyti šviesos šaltinį.
Kitas DAC tipas yra pulso pločio moduliatorius (PWM). PWM paima skaitmeninį žodį ir sukuria kintamo impulso pločio skaitmeninį impulsą. Kai šis signalas perduodamas per filtrą, rezultatas bus grynai analogas. Analoginiame signale gali būti kelių tipų duomenys.
Šioje pamokoje susiesime DAC MCP4921 su „Microchip PIC16F877A“, kad galėtume konvertuoti į skaitmeninį į analoginį.
Šioje pamokoje skaitmeninį signalą paversime analoginiu signalu ir 16x2 LCD ekrane parodysime įvesties skaitmeninę vertę ir išvesties analoginę vertę. Tai suteiks 1 V, 2 V, 3 V, 4 V ir 5 V kaip galutinę analoginę išvestį, kuri parodoma pabaigoje pateiktame vaizdo įraše. Daugiau apie DAC galite sužinoti mūsų vertingoje DAC sąsajos su „Raspberry Pi“, „Arduino“ ir „STM32“ plokštėmis pamokoje.
DAC gali būti naudojamas daugelyje programų, tokių kaip variklio valdymas, LED žibintų valdymo ryškumas, garso stiprintuvas, vaizdo kodavimo įrenginiai, duomenų gavimo sistemos ir kt. Prieš pereinant tiesiai į sąsajos dalį, svarbu turėti MCP4921 apžvalgą.
MCP4921 DAC (skaitmeninis į analoginį keitiklį)
„MCP4921“ yra 12 bitų DAC, taigi „MCP4921“ suteiks 12 bitų išvesties skiriamąją gebą. DAC skiriamoji geba reiškia skaitmeninių bitų, kuriuos galima konvertuoti į analoginius signalus, skaičių. Kiek iš to galime pasiekti vertybių, remiasi formulė. 12 bitų reikšmė yra = 4096. Tai reiškia, kad 12 bitų skiriamoji geba DAC gali sukurti 4096 skirtingus išėjimus.
Naudojant šią vertę, galima lengvai apskaičiuoti vieno analoginio žingsnio įtampą. Skaičiuojant žingsnius reikalinga etaloninė įtampa. Kadangi prietaiso loginė įtampa yra 5 V, pakopinė įtampa yra 5/4095 (4096-1, nes skaitmeninės pradžios taškas nėra 1, tai yra 0), tai yra 0,00122100122 milivoltai. Taigi, pakeitus 1 bitą, analoginė išvestis bus pakeista į 0.00122100122.
Taigi, tai buvo konversijos dalis. MCP4921 yra 8-pin IC. Kaištis diagrama ir aprašymas galima rasti žemiau.
MCP4921 IC susisiekia su pagal SPI protokolą mikrokontrolerio. Norėdami naudotis SPI ryšiu, prietaisas turi būti pagrindinis, kuris pateikia duomenis arba komandą išoriniam įrenginiui, prijungtam kaip vergas. SPI ryšio sistemoje su vienu pagrindiniu įrenginiu galima prijungti kelis vergų įrenginius.
Norint pateikti duomenis ir komandą, svarbu suprasti komandų registrą.
Žemiau esančiame paveikslėlyje parodytas komandų registras,
Komandų registras yra 16 bitų registras. Nuo 15 iki 12 bitų naudojama konfigūracijos komandai. Duomenų įvestis ir konfigūracija aiškiai parodyta aukščiau esančiame paveikslėlyje. Šiame projekte MCP4921 bus naudojamas kaip tokia konfigūracija-
Bitų skaičius |
Konfigūracija |
Konfigūracijos vertė |
15 bitai |
DAC A |
0 |
14 bitas |
Neperkeltas |
0 |
13 bitas |
1x (V OUT * D / 4096) |
1 |
12 bitas |
Išvesties išjungimo valdymo bitas |
1 |
Taigi dvejetainis yra 0011 kartu su duomenimis, kuriuos lemia registro bitai nuo D11 iki D0. 16 bitų duomenis 0011 xxxx xxxx xxxx reikia pateikti ten, kur pirmieji 4 MSB bitai yra konfigūracija, o likusi dalis yra LSB. Tai bus aiškiau, matant rašymo komandos laiko diagramą.
Pagal laiko schemą ir duomenų lapą, CS kaištis yra mažas per visą komandų rašymo į MCP4921 laikotarpį.
Dabar atėjo laikas susieti įrenginį su aparatine įranga ir rašyti kodus.
Būtini komponentai
Šiam projektui reikalingi šie komponentai:
- MCP4921
- PIC16F877A
- 20 MHz kristalas
- Ekranas 16x2 simbolių LCD.
- 2k rezistorius -1 vnt
- 33pF kondensatoriai - 2 vnt
- 4,7 k rezistorius - 1 vnt
- Daugiametris išėjimo įtampai matuoti
- Duonos lenta
- 5 V maitinimo šaltinis, telefono įkroviklis gali veikti.
- Daugybė prijungimo laidų ar bergų laidų.
- Mikroschemų programavimo aplinka su programuotojo rinkiniu ir IDE su kompiliatoriumi
Schema
Žemiau pateikiama DAC4921 sąsajos su PIC mikrovaldikliu schema:
Grandinė sukurta Breadboard-
Kodo paaiškinimas
Užbaigti kodas už konvertuojant skaitmeninius signalus į analoginius su PIC16F877A yra duotas straipsnio pabaigoje. Kaip visada, pirmiausia turime nustatyti konfigūracijos bitus PIC mikrovaldiklyje.
// PIC16F877A konfigūracijos bitų nustatymai // „C“ šaltinio eilutės konfigūracijos teiginiai // CONFIG #pragma config FOSC = HS // Osciliatoriaus pasirinkimo bitai (HS osciliatorius) #pragma config WDTE = OFF // Watchdog Timer Įjungti bitą (WDT išjungtas) # pragma config PWRTE = OFF // Įjungimo laikmatis Įgalinti bitą (PWRT išjungtas) #pragma config BOREN = Įjungtas // Brown-out Reset Įjungti bitą (įjungtas BOR) #pragma config LVP = OFF // Žemos įtampos (vieno maitinimo šaltinis)) In-Circuit Serial Programming Enable bit (RB3 / PGM kaištei yra PGM funkcija; įjungtas žemos įtampos programavimas) #pragma config CPD = OFF // duomenų EEPROM atminties kodo apsaugos bitas (duomenų EEPROM kodo apsauga išjungta) #pragma config WRT = IŠJUNGTAS // „Flash“ programos atminties įrašymas Įgalinti bitus (Rašymo apsauga išjungta; visa programos atmintis gali būti įrašyta EECON valdymu) #pragma config CP = IŠJUNGTAS // „Flash“ programos atminties kodo apsaugos bitas (kodo apsauga išjungta)
Žemiau nurodytos kodo eilutės naudojamos integruoti LCD ir SPI antraštės failus, taip pat deklaruojamas XTAL dažnis ir DAC CS pin jungtis.
PIC SPI mokymo programą ir biblioteką galite rasti pateiktoje nuorodoje.
# įtraukti
„Funciton“ SPI_Initialize_Master () yra šiek tiek pakeistas, kad būtų nustatyta kita šio projekto konfigūracija. Šiuo atveju SSPSTAT registras yra sukonfigūruotas taip, kad įvesties duomenys, atrinkti duomenų išvesties laiko pabaigoje, taip pat SPI laikrodis, sukonfigūruotas kaip „Transmit“, įvyktų pereinant iš aktyvaus į laukimo režimo būsenos režimą. Kitas yra tas pats.
negaliojantis SPI_Initialize_Master () { TRISC5 = 0; // Nustatyti kaip išėjimą SSPSTAT = 0b11000000; // p. 74/234 SSPCON = 0b00100000; // p. 75/234 TRISC3 = 0; // Nustatyti kaip išvestį vergo režimui }
Be to, žemiau esančiai funkcijai SPI_Write () yra šiek tiek pakeista. Duomenys bus perduoti išvalius buferį, kad būtų užtikrintas tobulas duomenų perdavimas per SPI.
void SPI_Write (char gaunamas) { SSPBUF = gaunamas; // Įrašykite vartotojo pateiktus duomenis į buferį while (! SSPSTATbits.BF); }
Svarbi programos dalis yra MCP4921 tvarkyklė. Tai yra šiek tiek sudėtinga dalis, nes komanda ir skaitmeniniai duomenys yra sujungiami, kad būtų galima pateikti visus 16 bitų duomenis per SPI. Tačiau ta logika aiškiai parodyta kodo komentaruose.
/ * Ši funkcija skirta skaitmeninei vertei konvertuoti į analoginę. * / void convert_DAC (nepasirašyta int reikšmė) { / * Žingsnio dydis = 2 ^ n, todėl 12bit 2 ^ 12 = 4096 5V nuorodai žingsnis bus 5/4095 = 0,0012210012210012V arba 1mV (apytiksliai) * / nepasirašytas int konteineris; nepasirašytas tarp MSB; nepasirašytas int LSB; / * Žingsnis: 1, išsaugoję 12 bitų duomenis į konteinerį Tarkime, kad duomenys yra 4095, dvejetainiu 1111 1111 1111 * / container = reikšmė; / * Žingsnis: 2 8 bitų manekeno sukūrimas. Taigi, padalijant 256, viršutiniai 4 bitai užfiksuojami LSB LSB = 0000 1111 * / LSB = container / 256; / * Žingsnis: 3 Siunčiama konfigūracija perforuojant 4 bitų duomenis. LSB = 0011 0000 ARBA 0000 1111. Rezultatas yra 0011 1111 * / LSB = (0x30) - LSB; / * Žingsnis: 4 konteineris vis tiek turi 21 bitų vertę. Ištraukiant apatinius 8 bitus. 1111 1111 IR 1111 1111 1111. Rezultatas yra 1111 1111, kuris yra MSB * / MSB = 0xFF & konteineris; / * Žingsnis: 4 Siunčiant 16 bitų duomenis padalijant į du baitus. * / DAC_CS = 0; // Duomenų perdavimo metu CS yra mažai. Pagal duomenų lapą reikia SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Pagrindinėje funkcijoje naudojamas „už kilpą“, kai kuriami skaitmeniniai duomenys, skirti sukurti 1 V, 2 V, 3 V, 4 V ir 5 V išvestį. Skaitmeninė vertė apskaičiuojama pagal išėjimo įtampą / 0,0012210012210012 milivoltą.
void main () { system_init (); įvadas_ekranas (); int skaičius = 0; int voltas = 0; o (1) { už (volt = 1; voltas <= MAX_VOLT; voltas ++) { skaičius = voltas / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DUOMENYS išsiųsti: -"); lcd_print_number (skaičius); „lcd_com“ (SECOND_LINE); lcd_puts ("Išvestis: -"); lcd_print_number (voltas); lcd_puts ("V"); konvertuoti_DAC (skaičius); __delay_ms (300); } } }
„Digital to Analog Conversion“ testavimas naudojant PIC
Sukurta grandinė išbandoma naudojant „Multi-meter“. Žemiau esančiuose vaizduose išėjimo įtampa ir skaitmeniniai duomenys rodomi LCD. Daugialypis skaitiklis rodo artimą skaitymą.
Visas kodas su veikiančiu vaizdo įrašu yra pridėtas žemiau.