Tai yra mūsų 9-oji PIC mikrovaldiklių mokymosi naudojant MPLAB ir XC8 pamoka. Iki šiol mes apėmėme daugybę pagrindinių pamokų, tokių kaip pradžia su MPLABX, LED mirksi su PIC, laikmačiai PIC, sąsaja su LCD, sąsaja su 7 segmentais ir kt. Jei esate visiškas pradedantysis, apsilankykite pilname PIC vadovėlių sąraše čia ir pradėk mokytis.
Šioje pamokoje sužinosime, kaip naudoti ADC su mūsų PIC mikrovaldikliu PICF877A. Daugumoje mikrovaldiklių projektų bus įtrauktas ADC (analoginis į skaitmeninį keitiklį), nes tai yra vienas iš dažniausiai naudojamų būdų skaityti duomenis iš realaus pasaulio. Beveik visi jutikliai, tokie kaip temperatūros jutiklis, srauto jutiklis, slėgio jutiklis, srovės jutikliai, įtampos jutikliai, giroskopai, akselerometrai, atstumo jutiklis ir beveik kiekvienas žinomas jutiklis ar keitiklis sukuria analoginę įtampą nuo 0 V iki 5 V, atsižvelgiant į jutiklių rodmenis. Pvz., Temperatūros jutiklis gali išleisti 2,1 V, kai temperatūra yra 25 ° C, ir pakilti iki 4,7, kai temperatūra yra 60 ° C. Norint sužinoti realaus pasaulio temperatūrą, MCU turi tiesiog nuskaityti šio temperatūros jutiklio išėjimo įtampą ir susieti ją su realia pasaulio temperatūra. Taigi ADC yra svarbi MCU projektų darbo priemonė, leidžianti sužinoti, kaip galime jį naudoti savo PIC16F877A.
Taip pat patikrinkite mūsų ankstesnius straipsnius apie ADC naudojimą kituose mikrovaldikliuose:
- Kaip naudoti ADC „Arduino Uno“?
- Raspberry Pi ADC pamoka
- Sąsaja ADC0808 su 8051 mikrovaldikliu
ADC PIC mikrovaldiklyje PIC16F877A:
Yra daugybė ADC tipų ir kiekvienas iš jų turi savo greitį ir skiriamąją gebą. Dažniausiai pasitaikantys ADC tipai yra blykstė, nuoseklus derinimas ir sigma-delta. ADC tipas naudojamas PIC16F877A yra vadinamas iš eilės aproksimacijos ADC ar SAR trumpas. Taigi, prieš pradėdami jį naudoti, sužinokime šiek tiek apie SAR ADC.
Nuoseklus aproksimavimo ADC: SAR ADC veikia palyginimo ir kai kurių loginių pokalbių pagalba. Šio tipo ADC naudoja etaloninę įtampą (kuri yra kintama) ir palygina įvesties įtampą su etalonine įtampa, naudodama palygintuvą, o skirtumas, kuris bus skaitmeninis išėjimas, išsaugomas iš reikšmingiausio bitų (MSB). Palyginimo greitis priklauso nuo laikrodžio dažnio (Fosc), kuriuo veikia PIC.
Dabar, kai žinome keletą ADC pagrindų, galime atidaryti mūsų duomenų lapą ir sužinoti, kaip naudoti ADC mūsų PIC16F877A MCU. PIC, kurį naudojame, turi 10 bitų 8 kanalų ADC. Tai reiškia, kad mūsų ADC išėjimo vertė bus 0-1024 (2 ^ 10), o mūsų MCU yra 8 kaiščiai (kanalai), kurie gali nuskaityti analoginę įtampą. Vertę 1024 gauna 2 ^ 10, nes mūsų ADC yra 10 bitų. Aštuoni kaiščiai, galintys nuskaityti analoginę įtampą, yra paminėti duomenų lape. Pažvelkime į paveikslėlį žemiau.
Jums paryškinami analoginiai kanalai nuo AN0 iki AN7. Tik šie kaiščiai galės nuskaityti analoginę įtampą. Taigi, prieš nuskaitydami įėjimo įtampą, savo kode turime nurodyti, kuris kanalas turi būti naudojamas įvesties įtampai nuskaityti. Šioje pamokoje naudosime 4 kanalą su potenciometru, kad nuskaitytume analoginę įtampą šiame kanale.
A / D modulyje yra keturi registrai, kuriuos reikia sukonfigūruoti, kad būtų galima skaityti duomenis iš įvesties kaiščių. Šie registrai yra:
• A / D rezultatų aukšto lygio registras (ADRESH)
• A / D rezultatų žemas registras (ADRESL)
• A / D valdymo registras 0 (ADCON0)
• A / D valdymo registras 1 (ADCON1)
ADC programavimas:
Naudojant ADC su IPS mikrokontrolerio programa yra labai paprasta, mes tiesiog turime suprasti šiuos keturis registrų ir tada skaityti bet analoginis įtampa bus paprasta. Kaip įprasta, inicijuokite konfigūracijos bitus ir pradėkime nuo „ void main“ ().
Viduje „ void main“ () turime inicijuoti ADC naudodami ADCON1 registrą ir ADCON0 registrą. ADCON0 registre yra šie bitai:
Šiame registre turime įjungti ADC modulį padarydami ADON = 1 ir įjungti A / D konvertavimo laikrodį naudodami bitus ADCS1 ir ADCS0, likusieji kol kas nebus nustatyti. Mūsų programoje A / D keitimo laikrodis yra pasirinktas kaip „Fosc / 16“. Galite išbandyti savo dažnius ir pamatyti, kaip keičiasi rezultatas. Išsami informacija pateikiama duomenų lapo 127 puslapyje. Taigi ADCON0 bus inicijuojamas taip.
ADCON0 = 0b01000001;
Dabar ADCON1 registre yra šie bitai:
Šiame registre turime padaryti A / D rezultatų formatą Pasirinkti bitų aukštą ADFM = 1 ir padaryti ADCS2 = 1, kad vėl pasirinktumėte „Fosc / 16“. Kiti bitai lieka nulis, nes planavome naudoti vidinę atskaitos įtampą. Išsami informacija pateikiama duomenų lapo 128. Puslapyje. Taigi ADCON1 nustatysime taip.
ADCON1 = 0x11000000;
Dabar, inicializavę ADC modulį mūsų pagrindinėje funkcijoje, galite patekti į „loop“ ir pradėti skaityti ADC reikšmes. Norint nuskaityti ADC vertę, reikia atlikti šiuos veiksmus.
- Inicializuokite ADC modulį
- Pasirinkite analoginį kanalą
- Paleiskite ADC padarydami „Go / Done“ šiek tiek aukštą
- Palaukite, kol „Go / DONE“ bitų bus mažai
- Gaukite ADC rezultatą iš ADRESH ir ADRESL registro
1. Inicijuokite ADC modulį: Mes jau išmokome inicijuoti ADC, todėl mes tiesiog vadiname šią žemiau esančią funkciją, kad inicijuotume ADC
Funkcija negaliojanti ADC_Initialize () yra tokia.
negaliojantis ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON ir pasirinktas „Fosc / 16“ ADCON1 = 0b11000000; // Pasirinkta vidinė atskaitos įtampa}
2. Pasirinkite analoginį kanalą: Dabar turime pasirinkti, kurį kanalą ketiname naudoti ADC reikšmei nuskaityti. Leiskite tai padaryti tam, kad mums būtų lengva pereiti tarp kiekvieno kanalo, o „ loop“ viduje.
nepasirašytas int ADC_Read (nepasirašytas char kanalas) {// **** Kanalo pasirinkimas ** /// ADCON0 & = 0x11000101; // Kanalo pasirinkimo bitų išvalymas ADCON0 - = kanalas << 3; // Reikiamų bitų nustatymas // ** Kanalo pasirinkimas baigtas *** ///}
Tada kintamas kanalas gauna pasirinktą kanalą. Eilutėje
ADCON0 & = 0x1100101;
Ankstesnis kanalo pasirinkimas (jei yra) išvalomas. Tai daroma naudojant bitų ir operatorių „&“. 3, 4 ir 5 bitai priversti būti 0, o kiti paliekami ankstesnėse reikšmėse.
Tada norimas kanalas pasirenkamas tris kartus perkeliant kanalo numerį į kairę arba nustatant bitus naudojant bitų arba operatorių „-“.
ADCON0 - = kanalas << 3; // Reikiamų bitų nustatymas
3. Paleiskite ADC padarydami „Go / Done bit bit“ aukštą: Pasirinkę kanalą, turime pradėti ADC konversiją paprasčiausiai nustatydami aukštą GO_nDONE :
GO_nDONE = 1; // Inicijuoja A / D konversiją
4. Palaukite, kol sumažės „ Go / DONE“ bitai: „GO / DONE“ bitai išliks aukšti, kol bus baigta ADC konversija, todėl mes turime palaukti, kol šis bitas vėl sumažės. Tai galima padaryti naudojant Nors kilpa.
o (GO_nDONE); // Palaukite, kol baigsis A / D konversija
5. Gaukite ADC rezultatą iš ADRESH ir ADRESL registro: Kai „Go / DONE“ bitas vėl tampa žemas, tai reiškia, kad ADC konversija baigta. ADC rezultatas bus 10 bitų reikšmė. Kadangi mūsų MCU yra 8 bitų MCU, rezultatas padalijamas į viršutinius 8 ir apatinius 2 bitus. Viršutinis 8 bitų rezultatas saugomas ADRESH registre, o apatinis 2 bitų - ADRESL registre. Taigi mes turime juos pridėti prie registrų, kad gautume 10 bitų ADC vertę. Šį rezultatą grąžina funkcija, kaip parodyta žemiau:
grįžti ((ADRESH << 8) + ADRESL); // Grąžina rezultatą
Čia rodoma visa funkcija, kuri naudojama ADC kanalui pasirinkti, suveikti ADC ir grąžinti rezultatą.
nepasirašytas int ADC_Read (nepasirašytas char kanalas) {ADCON0 & = 0x11000101; // Kanalo pasirinkimo bitų išvalymas ADCON0 - = kanalas << 3; // Reikiamų bitų nustatymas __delay_ms (2); // Įgijimo laikas palaikymo kondensatoriui įkrauti GO_nDONE = 1; // Inicijuoja A / D konversiją, kol (GO_nDONE); // Palaukite, kol A / D konversija baigsis ((ADRESH << 8) + ADRESL); // Grąžina rezultatą}
Dabar mes turime funkciją, kuri ims kanalo pasirinkimą ir grąžins mums ADC vertę. Taigi, mes galime tiesiogiai paskambinti šią funkciją viduje mūsų , o kilpa, nes mes skaito nuo Channel 4 analoginį įtampa šiame samouczku, skambinimo funkcijos bus taip.
i = (ADC_Read (4)); // išsaugokite adc rezultatą „i“.
Norint vizualizuoti mūsų ADC išvestį, mums reikės tam tikrų ekrano modulių, tokių kaip LCD ar 7 segmentų. Šioje pamokoje mes naudojame 7 segmentų ekraną, kad patikrintume išvestį. Jei norite sužinoti, kaip naudoti 7 segmentus su paveikslėliu, vadovaukitės čia esančia pamoka.
Visas kodas pateikiamas žemiau, o procesas taip pat paaiškinamas vaizdo įraše pabaigoje.
Aparatūros nustatymas ir testavimas:
Kaip įprasta, imituodami kodą naudodami „Proteus“, prieš pradėdami naudoti mūsų aparatinę įrangą, projekto schema parodyta žemiau:
Keturių skaitmenų septynių segmentų rodymo modulio su PIC mikrovaldikliu jungtys yra tokios pačios, kaip ir ankstesniame projekte, ką tik pridėjome potenciometrą prie kaiščio 7, kuris yra analoginis kanalas 4. Keičiant puodą, į MCU bus siunčiama kintama įtampa. kurį perskaitys ADC modulis ir parodys 7 segmentų ekrane „Module“. Patikrinkite ankstesnę mokymo programą, kad sužinotumėte daugiau apie 4 skaitmenų 7 segmentų ekraną ir jo sąsają su PIC MCU.
Čia mes naudojome tą pačią PIC mikrovaldiklio plokštę, kurią sukūrėme LED mirksi pamoka. Užtikrinę ryšį, įkelkite programą į PIC ir turėtumėte pamatyti tokį išėjimą
Čia mes perskaitėme ADC vertę iš puodo ir pavertėme ją faktine įtampa, atvaizduodami 0-1024 išėjimą kaip 0-5 voltus (kaip parodyta programoje). Tada vertė rodoma 7 segmentuose ir patikrinama naudojant multimetrą.
Štai ką, dabar mes esame pasirengę naudoti visus rinkoje esančius analoginius jutiklius, tęskite ir išbandykite tai, jei turite kokių nors problemų, kaip įprasta, naudokite komentarų skyrių, mes mielai jums padėsime.