To je naša 9. vadnica učenja mikrokrmilnikov PIC z uporabo MPLAB in XC8. Do zdaj smo obravnavali številne osnovne vaje, kot so začetek uporabe MPLABX, utripanje LED s PIC, merilniki časa v PIC, povezovanje LCD-jev, povezovanje 7-segmentov itd. Če ste absolutni začetnik, obiščite celoten seznam vadnic PIC tukaj in začnite se učiti.
V tej vadnici bomo izvedeli, kako uporabljati ADC z našim mikrokrmilnikom PIC PICF877A. Večina projektov mikrokrmilnika bo vključevala ADC (analogno v digitalni pretvornik), ker je to eden najpogosteje uporabljenih načinov branja podatkov iz resničnega sveta. Skoraj vsi senzorji, kot so temperaturni senzor, senzor pretoka, senzor tlaka, trenutni senzorji, napetostni senzorji, žiroskopi, merilniki pospeška, senzor razdalje in skoraj vsi znani senzorji ali pretvorniki, na podlagi odčitkov senzorjev proizvajajo analogno napetost od 0 do 5 V. Na primer, temperaturni senzor lahko oddaja 2,1 V, ko je temperatura 25 ° C, in naraste na 4,7, ko je temperatura 60 ° C. Da bi spoznal temperaturo v resničnem svetu, mora MCU samo prebrati izhodno napetost tega temperaturnega senzorja in jo povezati s temperaturo v resničnem svetu. Zato je ADC pomembno delovno orodje za projekte MCU in omogoča, da se naučimo, kako ga lahko uporabimo na našem PIC16F877A.
Preverite tudi naše prejšnje članke o uporabi ADC v drugih mikrokrmilnikih:
- Kako uporabljati ADC v Arduino Uno?
- Vadnica za ADC Raspberry Pi
- Povezava ADC0808 z mikrokrmilnikom 8051
ADC v mikrokrmilniku PIC16F877A:
Na voljo je veliko vrst ADC in vsak ima svojo hitrost in ločljivost. Najpogostejši tipi ADC so bliskavica, zaporedni približek in sigma-delta. Vrsta ADC uporablja v PIC16F877A se imenuje kot postopno približevanje ADC SAR na kratko. Naučimo se torej nekaj o SAR ADC, preden ga začnemo uporabljati.
Zaporedni približevalni ADC: SAR ADC deluje s pomočjo primerjalnika in nekaterih logičnih pogovorov. Ta vrsta ADC uporablja referenčno napetost (ki je spremenljiva) in primerja vhodno napetost z referenčno napetostjo s primerjalnikom in razlika, ki bo digitalni izhod, se shrani iz najpomembnejšega bita (MSB). Hitrost primerjave je odvisna od frekvence ure (Fosc), na kateri deluje PIC.
Zdaj, ko poznamo nekaj osnov o ADC, lahko odpremo naš podatkovni list in se naučimo uporabljati ADC na našem MCU PIC16F877A. PIC, ki ga uporabljamo, ima 10-bitni 8-kanalni ADC. To pomeni, da bo izhodna vrednost našega ADC 0-1024 (2 ^ 10), na našem MCU pa je 8 nožic (kanalov), ki lahko berejo analogno napetost. Vrednost 1024 dobimo z 2 ^ 10, saj je naš ADC 10 bitov. V obrazcu je omenjenih osem zatičev, ki lahko berejo analogno napetost. Oglejmo si spodnjo sliko.
Analogni kanali AN0 do AN7 so označeni za vas. Samo ti zatiči bodo lahko brali analogno napetost. Torej moramo pred branjem vhodne napetosti v naši kodi določiti, kateri kanal naj bo uporabljen za branje vhodne napetosti. V tej vadnici bomo uporabili kanal 4 z potenciometrom za odčitavanje analogne napetosti na tem kanalu.
A / D modul ima štiri registre, ki jih je treba konfigurirati za branje podatkov iz vhodnih zatičev. Ti registri so:
• A / D rezultat visokega registra (ADRESH)
• A / D rezultat nizkega registra (ADRESL)
• A / D nadzorni register 0 (ADCON0)
• A / D nadzorni register 1 (ADCON1)
Programiranje za ADC:
Program za uporabo ADC z mikrokrmilniška PIC je zelo preprosta, smo morali razumeti te štiri registre in nato branje koli analogno napetost bo enostavna. Kot ponavadi inicializiramo konfiguracijske bite in začnimo s void main ().
Znotraj void main () moramo svoj ADC inicializirati z uporabo registrov ADCON1 in ADCON0. Register ADCON0 ima naslednje bite:
V tem registru moramo modul ADC vklopiti z ADON = 1 in vklopiti uro pretvorbe A / D z uporabo bitov ADCS1 in ADCS0 bitov, ostalo za zdaj ne bo nastavljeno. V našem programu je ura pretvorbe A / D izbrana kot Fosc / 16, lahko preizkusite svoje frekvence in vidite, kako se rezultat spremeni. Popolne podrobnosti so na voljo na strani podatkovnega lista 127. Zato bo ADCON0 inicializiran na naslednji način.
ADCON0 = 0b01000001;
Zdaj ima register ADCON1 naslednje bitove:
V tem registru moramo narediti A / D Result Format Select bit bit high z ADFM = 1 in narediti ADCS2 = 1, da ponovno izberemo Fosc / 16. Ostali bit ostajajo nič, saj smo načrtovali uporabo notranje referenčne napetosti. Popolne podrobnosti so na voljo na strani s podatki 128. Zato bomo ADCON1 nastavili na naslednji način.
ADCON1 = 0x11000000;
Zdaj po inicializaciji modula ADC znotraj naše glavne funkcije, vstopimo v zanko while in začnemo brati vrednosti ADC. Če želite prebrati vrednost ADC, je treba upoštevati naslednje korake.
- Inicializirajte modul ADC
- Izberite analogni kanal
- Zaženite ADC tako, da premaknete / končate nekoliko visoko
- Počakajte, da se bit Go / DONE konča
- Pridobite rezultat ADC iz registra ADRESH in ADRESL
1. Inicializirajte modul ADC: Že smo se naučili, kako inicializirati ADC, zato samo pokličemo to spodnjo funkcijo za inicializacijo ADC
Funkcija void ADC_Initialize () je naslednja.
neveljavno ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON in izbran je Fosc / 16 ADCON1 = 0b11000000; // izbrana je notranja referenčna napetost}
2. Izberite analogni kanal: Zdaj moramo izbrati, kateri kanal bomo uporabili za branje vrednosti ADC. Naredimo funkcijo za to, tako da bomo lahko preprosto preklapljali med posameznimi kanali znotraj medtem zanke.
unsigned int ADC_Read (unsigned char channel) {// **** Izbira kanala ** /// ADCON0 & = 0x11000101; // Brisanje bitov za izbiro kanala ADCON0 - = channel << 3; // Nastavitev zahtevanih bitov // ** Izbira kanala je končana *** ///}
Nato se kanal, ki ga želite izbrati, sprejme znotraj spremenljivega kanala. V vrsti
ADCON0 & = 0x1100101;
Izbriše se prejšnja izbira kanala (če obstaja). To se naredi z uporabo bitnega in operatorja "&". Biti 3, 4 in 5 so prisiljeni, da so 0, ostali pa ostanejo v svojih prejšnjih vrednostih.
Nato izberemo želeni kanal tako, da trikrat premaknemo številko kanala in nastavimo bitove z uporabo bitnega ali operatorja "-".
ADCON0 - = kanal << 3; // Nastavitev zahtevanih bitov
3. Zaženite ADC tako, da nastavite bit Go / Done bit visoko: Ko je kanal izbran, moramo pretvorbo ADC začeti preprosto tako, da nastavimo bit GO_nDONE visoko:
GO_nDONE = 1; // Inicializira A / D pretvorbo
4. Počakajte, da se bit Go / DONE zniža: Bit GO / DONE bo ostal visok, dokler ni končana pretvorba ADC, zato moramo počakati, da ta bit spet zniža. To lahko storite z uporabo zanke while .
medtem ko (GO_nDONE); // Počakajte, da se A / D pretvorba zaključi
5. Pridobite rezultat ADC iz registra ADRESH in ADRESL: Ko bit Go / DONE ponovno postane nizek, to pomeni, da je pretvorba ADC končana. Rezultat ADC bo 10-bitna vrednost. Ker je naš MCU 8-bitni MCU, je rezultat razdeljen na zgornji 8-bitni in spodnji 2-bitni. Zgornji 8-bitni rezultat je shranjen v registru ADRESH, spodnji 2-bit pa v registru ADRESL. Zato jih moramo dodati v registre, da dobimo 10-bitno vrednost ADC. Ta rezultat vrne funkcija, kot je prikazano spodaj:
vrnitev ((ADRESH << 8) + ADRESL); // Vrne rezultat
Tu je prikazana celotna funkcija, ki se uporablja za izbiro kanala ADC, sprožitev ADC in vrnitev rezultata.
unsigned int ADC_Read (nepodpisani char char) {ADCON0 & = 0x11000101; // Brisanje bitov za izbiro kanala ADCON0 - = channel << 3; // Nastavitev zahtevanih bitov __delay_ms (2); // Čas pridobivanja za polnjenje zadrževalnega kondenzatorja GO_nDONE = 1; // Inicializira A / D pretvorbo medtem (GO_nDONE); // Počakajte, da se A / D pretvorba zaključi z vrnitvijo ((ADRESH << 8) + ADRESL); // Vrne rezultat}
Zdaj imamo funkcijo, ki bo za vhod sprejela izbiro kanala in nam vrnila vrednost ADC. Zato lahko to funkcijo neposredno pokličemo znotraj naše zanke while , ker beremo analogno napetost s kanala 4 v tej vadnici, bo klic funkcije naslednji.
i = (ADC_Read (4)); // shranimo rezultat adc v “i”.
Za vizualizacijo izhoda našega ADC bomo potrebovali nekakšne prikazovalne module, kot sta LCD ali 7-segment. V tej vadnici za preverjanje izhoda uporabljamo 7-segmentni zaslon. Če želite vedeti, kako uporabljati 7-segment s pic, sledite vadnici tukaj.
Popolna koda je navedeno v nadaljevanju, in proces je pojasnjeno tudi v video na koncu.
Namestitev in testiranje strojne opreme:
Kot ponavadi simuliramo kodo z uporabo Proteusa, preden dejansko začnemo uporabljati našo strojno opremo, je shema projekta prikazana spodaj:
Povezave 4-mestnega sedemsegmentnega prikazovalnega modula z mikrokrmilnikom PIC so enake kot pri prejšnjem projektu, pravkar smo na zatič 7, ki je analogni kanal, dodali potenciometer. S spreminjanjem lonca bo na MCU poslana spremenljiva napetost ki ga bo modul ADC prebral in prikazal na 7-segmentnem modulu zaslona. Oglejte si prejšnjo vadnico, če želite izvedeti več o 4-mestnem 7-segmentnem zaslonu in njegovem povezovanju s PIC MCU.
Tu smo uporabili isto ploščo mikrokrmilnika PIC, ki smo jo ustvarili v Vadnici za utripanje LED. Po zagotovitvi povezave naložite program v PIC in videli bi takšen izhod
Tu smo iz lonca prebrali vrednost ADC in jo pretvorili v dejansko napetost tako, da smo izhod 0-1024 preslikali v 0-5 voltov (kot je prikazano v programu). Nato se vrednost prikaže na 7-segmentu in preveri z multimetrom.
To je to, zdaj smo pripravljeni uporabiti vse analogne senzorje, ki so na voljo na trgu, poizkusite to in če imate kakršne koli težave kot običajno, uporabite odsek za komentarje, z veseljem vam bomo pomagali.