Šī ir mūsu 9. apmācība par PIC mikrokontrolleru apgūšanu, izmantojot MPLAB un XC8. Līdz šim mēs esam apskatījuši daudzas pamata apmācības, piemēram, darba sākšanu ar MPLABX, gaismas diode mirgo ar PIC, taimeri PIC, saskarnes LCD, saskarnes 7 segmentiem utt. Ja esat absolūti iesācējs, lūdzu, apmeklējiet pilnu PIC apmācību sarakstu šeit un sāciet mācīties.
Šajā apmācībā mēs uzzināsim, kā izmantot ADC ar mūsu PIC mikrokontrolleru PICF877A. Lielākajā daļā mikrokontrolleru projektu tajā būs iesaistīts ADC (Analog to Digital Converter), jo tas ir viens no visbiežāk izmantotajiem veidiem, kā nolasīt datus no reālās pasaules. Gandrīz visi sensori, piemēram, temperatūras sensors, plūsmas sensors, spiediena sensors, strāvas sensori, sprieguma sensori, žiroskopi, akselerometri, attāluma sensors un gandrīz visi zināmie sensori vai devēji rada analogo spriegumu no 0 V līdz 5 V, pamatojoties uz sensoru nolasījumu. Piemēram, temperatūras sensors var izstarot 2,1 V, ja temperatūra ir 25 ° C, un līdz 4,7, ja temperatūra ir 60 ° C. Lai uzzinātu reālās pasaules temperatūru, MCU ir vienkārši jāizlasa šī temperatūras sensora izejas spriegums un jāpiesaista tas reālās pasaules temperatūrai. Tādējādi ADC ir svarīgs darba rīks MCU projektiem un ļauj uzzināt, kā mēs to varam izmantot mūsu PIC16F877A.
Pārbaudiet arī mūsu iepriekšējos rakstus par ADC izmantošanu citos mikrokontrolleros:
- Kā lietot ADC Arduino Uno?
- Aveņu Pi ADC apmācība
- Saskarne ADC0808 ar 8051 mikrokontrolleru
ADC PIC mikrokontrollerī PIC16F877A:
Ir pieejami daudzi ADC veidi, un katram no tiem ir savs ātrums un izšķirtspēja. Visizplatītākie ADC veidi ir zibspuldze, secīga tuvināšana un sigma-delta. ACP veids, ko izmanto PIC16F877A sauc par secīgu tuvināšanu ADC SAR īsumā. Tātad, uzzināsim mazliet par SAR ADC, pirms sākam to lietot.
Secīga tuvināšana ADC: SAR ADC darbojas ar salīdzinātāja palīdzību un dažām loģiskām sarunām. Šāda veida ADC izmanto atsauces spriegumu (kas ir mainīgs) un salīdzina ieejas spriegumu ar atsauces spriegumu, izmantojot salīdzinājumu, un starpība, kas būs digitāla izeja, tiek saglabāta no nozīmīgākā bita (MSB). Salīdzināšanas ātrums ir atkarīgs no pulksteņa frekvences (Fosc), ar kuru darbojas PIC.
Tagad, kad mēs zinām dažus ADC pamatus, ļauj atvērt mūsu datu lapu un uzzināt, kā izmantot ADC mūsu PIC16F877A MCU. PIC, kuru izmantojam, ir 10 bitu 8 kanālu ADC. Tas nozīmē, ka mūsu ADC izejas vērtība būs 0-1024 (2 ^ 10), un mūsu MCU ir 8 tapas (kanāli), kas var nolasīt analogo spriegumu. Vērtību 1024 iegūst 2 ^ 10, jo mūsu ADC ir 10 biti. Astoņas tapas, ar kurām var nolasīt analogo spriegumu, ir minētas datu lapā. Apskatīsim zemāk redzamo attēlu.
Jums ir izcelti analogie kanāli no AN0 līdz AN7. Tikai šīs tapas varēs nolasīt analogo spriegumu. Tāpēc pirms ieejas sprieguma nolasīšanas mūsu kodā ir jānorāda, kurš kanāls jāizmanto, lai nolasītu ieejas spriegumu. Šajā apmācībā mēs izmantosim 4. kanālu ar potenciometru, lai nolasītu analogo spriegumu šajā kanālā.
A / D modulim ir četri reģistri, kas jākonfigurē, lai nolasītu datus no ievades tapām. Šie reģistri ir:
• A / D rezultātu augsts reģistrs (ADRESH)
• A / D rezultātu zems reģistrs (ADRESL)
• A / D vadības reģistrs 0 (ADCON0)
• A / D vadības reģistrs 1 (ADCON1)
Programmēšana ADC:
Izmantojot ADC ar PIC Microcontroller programma ir ļoti vienkārša, mēs vienkārši ir jāsaprot šie četri reģistri un tad lasot kādu analogais spriegums būs vienkārši. Kā parasti, inicializējiet konfigurācijas bitus un sāksim ar void main ().
In void main () mums ir jāinicializē mūsu ADC, izmantojot ADCON1 reģistru un ADCON0 reģistru. ADCON0 reģistrā ir šādi biti:
Šajā reģistrā mums ir jāieslēdz ADC modulis, veicot ADON = 1, un jāieslēdz A / D konversijas pulkstenis, izmantojot bitus ADCS1 un ADCS0, pārējie pagaidām netiks iestatīti. Mūsu programmā A / D pārveidošanas pulkstenis ir izvēlēts kā Fosc / 16. Jūs varat izmēģināt savas frekvences un redzēt, kā mainās rezultāts. Pilnīga informācija ir pieejama datu lapas 127. lpp. Tādējādi ADCON0 tiks inicializēts šādi.
ADCON0 = 0b01000001;
Tagad ADCON1 reģistrā ir šādi biti:
Šajā reģistrā mums A / D rezultātu formāts jāizvēlas mazliet augsts ar ADFM = 1 un jāveic ADCS2 = 1, lai atkal atlasītu Fosc / 16. Pārējie biti paliek nulle, jo mēs esam plānojuši izmantot iekšējo atsauces spriegumu. Pilnīga informācija ir pieejama datu lapas 128. lpp. Tādējādi ADCON1 iestatīsim šādi.
ADCON1 = 0x11000000;
Pēc ADC moduļa inicializācijas mūsu galvenajā funkcijā ļauj nokļūt kamēr cilpa un sākt lasīt ADC vērtības. Lai nolasītu ADC vērtību, ir jāveic šādas darbības.
- Inicializējiet ADC moduli
- Atlasiet analogo kanālu
- Sāciet ADC, padarot Go / Done mazliet augstu
- Pagaidiet, līdz Go / DONE bits kļūst zemāks
- Iegūstiet ADC rezultātu no ADRESH un ADRESL reģistra
1. Inicializējiet ADC moduli: Mēs jau esam iemācījušies inicializēt ADC, tāpēc mēs vienkārši saucam šo funkciju, lai inicializētu ADC
Funkcija void ADC_Initialize () ir šāda.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON un Fosc / 16 ir atlasīts ADCON1 = 0b11000000; // Ir izvēlēts iekšējais atskaites spriegums}
2. Atlasiet analogo kanālu: Tagad mums jāizvēlas kanāls, kuru izmantosim ADC vērtības nolasīšanai. Ļaujim tam izveidot funkciju, lai mums būtu viegli pāriet starp katru kanālu kamēr cilpa.
neparakstīts int ADC_Read (neparakstīts char channel) {// **** Kanāla izvēle ** /// ADCON0 & = 0x11000101; // Kanāla atlases bitu dzēšana ADCON0 - = kanāls << 3; // Nepieciešamo bitu iestatīšana // ** Kanālu izvēle pabeigta *** ///}
Tad mainīgā kanāla iekšpusē tiek saņemts izvēlētais kanāls. Rindā
ADCON0 & = 0x1100101;
Iepriekšējā kanāla izvēle (ja tāda ir) tiek notīrīta. Tas tiek darīts, izmantojot bitu bitu un operatoru “&”. Biti 3, 4 un 5 ir spiesti būt 0, bet pārējie paliek iepriekšējās vērtībās.
Tad tiek izvēlēts vēlamais kanāls, trīs reizes pārvietojot pa kreisi un iestatot bitus, izmantojot bitu ātrumu vai operatoru “-”.
ADCON0 - = kanāls << 3; // Nepieciešamo bitu iestatīšana
3. Sāciet ADC, padarot Go / Done mazliet augstu: Kad kanāls ir izvēlēts, mums jāsāk ADC pārveidošana, vienkārši padarot GO_nDONE mazliet augstu:
GO_nDONE = 1; // Inicializē A / D pārveidošanu
4. Pagaidiet, līdz Go / DONE bits kļūst zems: GO / DONE bits paliks augsts, līdz ADC pārveidošana būs pabeigta, tāpēc mums jāgaida, kamēr šis bits atkal samazināsies. To var izdarīt, izmantojot cilpu while .
kamēr (GO_nDONE); // Pagaidiet, līdz A / D pārveidošana būs pabeigta
5. Iegūstiet ADC rezultātu no ADRESH un ADRESL reģistra: Kad Go / DONE bits atkal kļūst zems, tas nozīmē, ka ADC pārveidošana ir pabeigta. ADC rezultāts būs 10 bitu vērtība. Tā kā mūsu MCU ir 8 bitu MCU, rezultāts tiek sadalīts augšējos 8 bitu un apakšējos 2 bītos. Augšējais 8 bitu rezultāts tiek saglabāts reģistrā ADRESH, bet apakšējais 2 bits tiek glabāts reģistrā ADRESL. Tāpēc mums tie jāpievieno reģistriem, lai iegūtu mūsu 10 bitu ADC vērtību. Šo rezultātu atgriež funkcija, kā parādīts zemāk:
atgriešanās ((ADRESH << 8) + ADRESL); // Atgriež rezultātu
Šeit parādīta pilnīga funkcija, kas tiek izmantota, lai izvēlētos ADC kanālu, aktivizētu ADC un atgrieztu rezultātu.
neparakstīts int ADC_Read (neparakstīts char kanāls) {ADCON0 & = 0x11000101; // Kanāla atlases bitu dzēšana ADCON0 - = kanāls << 3; // Nepieciešamo bitu iestatīšana __delay_ms (2); // Iegūšanas laiks turēt kondensatoru GO_nDONE = 1; // Inicializē A / D reklāmguvumu, kamēr (GO_nDONE); // Gaidiet A / D konvertēšanas pilnīgu atgriešanos ((ADRESH << 8) + ADRESL); // atgriež rezultātu}
Tagad mums ir funkcija, kas kanāla izvēli uzskatīs par ievadi un atgriezīs mums ADC vērtību. Tādējādi mēs varam tieši izsaukt šo funkciju mūsu kamēr cilpā, jo šajā apmācībā mēs lasām analogo spriegumu no 4. kanāla, funkciju izsaukums būs šāds.
i = (ADC_Read (4)); // saglabājiet adc rezultātu “i”.
Lai vizualizētu mūsu ADC produkciju, mums būs nepieciešami kaut kādi displeja moduļi, piemēram, LCD vai 7 segmenti. Šajā apmācībā produkcijas pārbaudei mēs izmantojam 7 segmentu displeju. Ja vēlaties uzzināt, kā izmantot 7 segmentu ar attēlu, izpildiet šeit sniegto apmācību.
Pilnīga kods ir norādīts zemāk, un process ir izskaidrots arī video beigās.
Aparatūras iestatīšana un testēšana:
Kā parasti simulējiet kodu, izmantojot Proteus, pirms faktiski izmantojat mūsu aparatūru, projekta shēma ir parādīta zemāk:
Četrciparu septiņu segmentu displeja moduļa savienojumi ar PIC mikrokontrolleru ir tādi paši kā iepriekšējā projektā, mēs nupat pievienojām potenciometru tapai 7, kas ir analogais kanāls 4. Mainot pot, mainīgais spriegums tiks nosūtīts uz MCU ko nolasīs ADC modulis un parādīs 7 segmentu displejā Module. Pārbaudiet iepriekšējo apmācību, lai uzzinātu vairāk par četrciparu 7 segmentu displeju un tā saskarni ar PIC MCU.
Šeit mēs izmantojām to pašu PIC mikrokontrolleru plati, kuru esam izveidojuši LED mirgojošā apmācībā. Pēc savienojuma nodrošināšanas augšupielādējiet programmu PIC, un jums vajadzētu redzēt šādu izvadi
Šeit mēs esam izlasījuši ADC vērtību no katla un pārveidojuši to par faktisko spriegumu, kartējot 0-1024 izeju kā 0-5 volti (kā parādīts programmā). Pēc tam vērtība tiek parādīta 7 segmentos un tiek pārbaudīta, izmantojot multimetru.
Tas ir tas, ka tagad mēs esam gatavi izmantot visus tirgū pieejamos analogos sensorus, turpiniet to izmēģināt un, ja jums rodas kādas problēmas, kā parasti, izmantojiet komentāru sadaļu, mēs ar prieku jums palīdzēsim.