Ovo je naša 9. lekcija za učenje PIC mikrokontrolera pomoću MPLAB-a i XC8. Do sada smo obradili mnoge osnovne tutorijale, poput početka rada s MPLABX-om, treptanja LED-a s PIC-om, mjerača vremena u PIC-u, povezivanja LCD-a, povezivanja 7-segmenta itd. Ako ste apsolutni početnik, posjetite cijeli popis PIC-ovih vodiča ovdje i počnite učiti.
U ovom uputstvu naučit ćemo kako koristiti ADC s našim PIC mikrokontrolerom PICF877A. Većina projekata mikrokontrolera uključivat će ADC (analogni u digitalni pretvarač), jer je to jedan od najčešće korištenih načina čitanja podataka iz stvarnog svijeta. Gotovo svi senzori poput senzora temperature, senzora protoka, senzora tlaka, trenutnih senzora, naponskih senzora, žiroskopa, akcelerometara, senzora udaljenosti i gotovo svaki poznati senzor ili pretvarač proizvode analogni napon od 0V do 5V na temelju očitanja senzora. Na primjer, temperaturni senzor može emitirati 2,1 V kada je temperatura 25 ° C i popeti se na 4,7 kada je temperatura 60 ° C. Da bi znao temperaturu u stvarnom svijetu, MCU mora samo očitati izlazni napon ovog temperaturnog senzora i povezati ga s realnom temperaturom. Stoga je ADC važan radni alat za MCU projekte i omogućuje nam naučiti kako ga možemo koristiti na našem PIC16F877A.
Također provjerite naše prethodne članke o korištenju ADC-a u drugim mikrokontrolerima:
- Kako koristiti ADC u Arduino Uno?
- Vodič za ADC za Raspberry Pi
- Povezivanje ADC0808 s 8051 mikrokontrolerom
ADC u PIC mikrokontroleru PIC16F877A:
Dostupno je mnogo vrsta ADC-a, a svaki ima svoju brzinu i razlučivost. Najčešći tipovi ADC-a su bljeskalica, uzastopna aproksimacija i sigma-delta. Vrsta ADC koristi u PIC16F877A se zove kao uzastopnih aproksimacija ADC ili SAR u kratko. Dakle, naučimo malo o SAR ADC-u prije nego što ga počnemo koristiti.
Uzastopni aproksimacijski ADC: SAR ADC radi uz pomoć usporedbe i nekih logičkih razgovora. Ova vrsta ADC-a koristi referentni napon (koji je promjenjiv) i uspoređuje ulazni napon s referentnim naponom pomoću usporedbe, a razlika, koja će biti digitalni izlaz, sprema se iz Najznačajnijeg bita (MSB). Brzina usporedbe ovisi o frekvenciji takta (Fosc) na kojoj PIC radi.
Sad kad znamo neke osnove o ADC-u, otvorimo našu tablicu podataka i naučimo kako koristiti ADC na našem MCU PIC16F877A. PIC koji koristimo ima 10-bitni 8-kanalni ADC. To znači da će izlazna vrijednost našeg ADC-a biti 0-1024 (2 ^ 10) i na našem MCU-u ima 8 pinova (kanala) koji mogu čitati analogni napon. Vrijednost 1024 dobiva se s 2 ^ 10 budući da je naš ADC 10-bitni. Osam pinova koji mogu čitati analogni napon spomenuti su u tehničkom listu. Pogledajmo sliku ispod.

Analogni kanali AN0 do AN7 su istaknuti za vas. Samo ovi pinovi moći će očitavati analogni napon. Dakle, prije čitanja ulaznog napona moramo u našem kodu navesti koji se kanal mora koristiti za očitavanje ulaznog napona. U ovom uputstvu koristit ćemo kanal 4 s potenciometrom za očitavanje analognog napona na ovom kanalu.
A / D modul ima četiri registra koja moraju biti konfigurirana za čitanje podataka s ulaznih pinova. Ti su registri:
• A / D rezultat visokog registra (ADRESH)
• A / D rezultat niskog registra (ADRESL)
• A / D kontrolni registar 0 (ADCON0)
• A / D kontrolni registar 1 (ADCON1)
Programiranje za ADC:
Program za korištenje ADC sa PIC mikrokontroler je vrlo jednostavna, samo moramo shvatiti ove četiri registre, a zatim čitajući bilo analogni napon će biti jednostavan. Kao i obično, inicijalizirajte konfiguracijske bitove i krenimo s void main ().
Unutar void main () moramo inicijalizirati naš ADC pomoću ADCON1 registra i ADCON0 registra. Registar ADCON0 ima sljedeće bitove:

U ovom registru moramo uključiti ADC modul tako da napravimo ADON = 1 i uključiti A / D pretvorbeni sat pomoću bitova ADCS1 i ADCS0 bitova, ostalo za sada neće biti postavljeno. U našem programu je A / D pretvorbeni sat odabran kao Fosc / 16, možete isprobati vlastite frekvencije i vidjeti kako se rezultat mijenja. Potpuni detalji dostupni su na listi podataka na stranici 127. Stoga će se ADCON0 inicijalizirati na sljedeći način.
ADCON0 = 0b01000001;
Sada registar ADCON1 ima sljedeće bitove:

U ovom registru moramo napraviti A / D format rezultata Odabir bita visoko za ADFM = 1 i napraviti ADCS2 = 1 da bismo ponovno odabrali Fosc / 16. Ostali bitovi ostaju nula jer smo planirali koristiti interni referentni napon. Potpuni detalji dostupni su na tablici stranica 128. Stoga ćemo ADCON1 postaviti na sljedeći način.
ADCON1 = 0x11000000;
Nakon inicijalizacije ADC modula unutar naše glavne funkcije, ulazimo u while petlju i započinjemo čitanje ADC vrijednosti. Da bi se očitala vrijednost ADC, potrebno je slijediti sljedeće korake.
- Inicijalizirajte ADC modul
- Odaberite analogni kanal
- Pokrenite ADC tako da postavite Go / Done malo visoko
- Pričekajte da se bit Go / GOTOVO smanji
- Dobijte ADC rezultat iz ADRESH i ADRESL registra
1. Inicijalizirajte ADC modul: Već smo naučili kako inicijalizirati ADC, pa samo pozivamo ovu funkciju ispod kako bismo inicijalizirali ADC
Funkcija void ADC_Initialize () je sljedeća.
poništava ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON i odabran je Fosc / 16 ADCON1 = 0b11000000; // Odabran je unutarnji referentni napon}
2. Odaberite analogni kanal: Sada moramo odabrati koji ćemo kanal koristiti za čitanje ADC vrijednosti. Napravimo funkciju za to, tako da će nam biti lako prebacivati se između svakog kanala unutar while petlje.
unsigned int ADC_Read (nepotpisani char char) {// **** Odabir kanala ** /// ADCON0 & = 0x11000101; // Brisanje bitova za odabir kanala ADCON0 - = channel << 3; // Postavljanje potrebnih bitova // ** Izbor kanala dovršen *** ///}
Tada se kanal koji se odabire prima unutar varijabilnog kanala. U redu
ADCON0 & = 0x1100101;
Prethodni odabir kanala (ako postoji) se briše. To se postiže korištenjem bitnog i operatora "&". Bitovi 3, 4 i 5 prisiljeni su biti 0, dok ostali trebaju biti u svojim prethodnim vrijednostima.
Tada se željeni kanal odabire pomicanjem broja kanala tri puta ulijevo i podešavanjem bitova pomoću bitnog ili operatora "-".
ADCON0 - = kanal << 3; // Postavljanje potrebnih bitova
3. Pokrenite ADC postavljanjem bit-a Go / Done bit: Nakon odabira kanala moramo započeti ADC konverziju jednostavno postavljanjem GO_nDONE bita visoko:
GO_nDONE = 1; // Inicijalizira A / D pretvorbu
4. Pričekajte da bit Go / DONE postane nizak: Bit GO / DONE bit će visok dok se ADC konverzija ne dovrši, stoga moramo pričekati dok ovaj bit opet ne padne. To se može učiniti pomoću while petlje.
dok (GO_nDONE); // Pričekajte da se dovrši A / D konverzija
5. Dobijte ADC rezultat iz ADRESH i ADRESL registra: Kada bit Go / DONE ponovo postane nizak, to znači da je ADC pretvorba dovršena. Rezultat ADC-a bit će 10-bitna vrijednost. Budući da je naš MCU 8-bitni MCU, rezultat je podijeljen na gornji 8-bitni i donji 2-bitni. Gornji 8-bitni rezultat pohranjen je u registar ADRESH, a donji 2-bitni u registar ADRESL. Stoga ih moramo zbrojiti u registre da bismo dobili našu 10-bitnu ADC vrijednost. Ovaj rezultat vraća funkcija kao što je prikazano u nastavku:
povratak ((ADRESH << 8) + ADRESL); // Vraća rezultat
Kompletna funkcija koja se koristi za odabir ADC kanala, pokretanje ADC-a i vraćanje rezultata prikazana je ovdje.
unsigned int ADC_Read (nepotpisani char char) {ADCON0 & = 0x11000101; // Brisanje bitova za odabir kanala ADCON0 - = channel << 3; // Postavljanje potrebnih bitova __delay_ms (2); // Vrijeme stjecanja za punjenje kondenzatora zadržavanja GO_nDONE = 1; // Inicijalizira A / D pretvorbu while (GO_nDONE); // Pričekajte da se A / D pretvorba dovrši ((ADRESH << 8) + ADRESL); // Povratak rezultata}
Sada imamo funkciju koja će odabir kanala uzeti kao ulaz i vratiti nam ADC vrijednost. Stoga smo direktno nazvati ovu funkciju unutar našeg while petlji, jer čitamo analogni napon od kanala 4 u ovom tutorial, funkcija poziv će biti kao što slijedi.
i = (ADC_Pročitaj (4)); // pohraniti rezultat adc u "i".
Da bismo vizualizirali izlaz našeg ADC-a trebat će nam neka vrsta modula za prikaz poput LCD-a ili 7-segmentnog. U ovom uputstvu koristimo 7-segmentni zaslon za provjeru rezultata. Ako želite znati kako koristiti 7-segment s pic slijedite upute ovdje.
Kompletan kod je naveden u nastavku, a proces je također objašnjeno u video na kraju.
Postavljanje i testiranje hardvera:
Kao i obično, simulirajte kôd pomoću Proteusa prije nego što zapravo krenete s našim hardverom, sheme projekta prikazane su u nastavku:

Priključci četveroznamenkastog sedmosegmentnog modula zaslona s PIC mikrokontrolerom isti su kao i u prethodnom projektu, upravo smo dodali potenciometar na pin 7 koji je analogni kanal 4. Promjenom lonca, na MCU će se poslati promjenjivi napon koji će čitati ADC modul i prikazivati na 7-segmentnom modulu zaslona. Provjerite prethodni vodič da biste saznali više o četveroznamenkastom 7-segmentnom zaslonu i njegovom povezivanju s PIC MCU.
Ovdje smo koristili istu PIC mikrokontrolersku ploču koju smo stvorili u vodiču za treptanje LED-a. Nakon osiguranja veze učitajte program u PIC i trebali biste vidjeti ovakav izlaz


Ovdje smo očitali ADC vrijednost iz lonca i pretvorili je u stvarni napon mapiranjem izlaza 0-1024 kao 0-5 volti (kao što je prikazano u programu). Vrijednost se zatim prikazuje na 7-segmentu i provjerava pomoću multimetra.
To je to, sada smo spremni koristiti sve analogne senzore dostupne na tržištu, samo pokušajte i ako imate bilo kakvih problema kao i obično, upotrijebite odjeljak za komentare, rado ćemo vam pomoći.
