Toto je náš 9. kurz Výučba mikrokontrolérov PIC pomocou MPLAB a XC8. Doteraz sme prebrali mnoho základných návodov, ako je napríklad začiatky s MPLABX, blikanie LED pomocou PIC, časovače v PIC, prepojenie LCD, prepojenie so 7 segmentmi atď. Ak ste úplným začiatočníkom, navštívte kompletný zoznam návodov PIC tu a začni sa učiť.
V tomto tutoriáli sa dozvieme, ako používať ADC s našim mikrokontrolérom PIC PICF877A. Väčšina projektov mikrokontrolérov bude obsahovať ADC (analógovo-digitálny prevodník), pretože je to jeden z najbežnejších spôsobov čítania údajov z reálneho sveta. Takmer všetky snímače, ako napríklad snímač teploty, snímač toku, tlakový snímač, snímače prúdu, snímače napätia, gyroskopy, akcelerometre, snímače vzdialenosti a takmer všetky známe snímače alebo prevodníky vytvárajú na základe snímania snímačov analógové napätie od 0 V do 5 V. Napríklad teplotný snímač môže vydávať 2,1 V, keď je teplota 25 ° C, a stúpať na 4,7, keď je teplota 60 ° C. Aby bolo možné zistiť teplotu v reálnom svete, musí MCU iba načítať výstupné napätie tohto teplotného senzora a dať ho do súvislosti s teplotou v reálnom svete. Preto je ADC dôležitým pracovným nástrojom pre projekty MCU a umožňuje sa naučiť, ako ho môžeme použiť na našom PIC16F877A.
Prečítajte si tiež naše predchádzajúce články o používaní ADC v iných mikrokontroléroch:
- Ako používať ADC v Arduino Uno?
- Výukový program ADC pre Raspberry Pi
- Prepojenie ADC0808 s mikrokontrolérom 8051
ADC v mikrokontroléri PIC PIC16F877A:
Existuje veľa druhov ADC a každý z nich má svoju vlastnú rýchlosť a rozlíšenie. Najbežnejšie typy ADC sú blesk, postupná aproximácia a sigma-delta. Typ ADC používa v PIC16F877A je nazývaný ako postupnou aproximáciou ADC SAR v krátkej. Poďme sa teda naučiť niečo o SAR ADC predtým, ako ho začneme používať.
Postupná aproximácia ADC: SAR ADC pracuje pomocou komparátora a niektorých logických konverzácií. Tento typ ADC používa referenčné napätie (ktoré je premenné) a porovnáva vstupné napätie s referenčným napätím pomocou komparátora a rozdiel, ktorým bude digitálny výstup, sa uloží z najvýznamnejšieho bitu (MSB). Rýchlosť porovnania závisí od frekvencie hodín (Fosc), na ktorej pracuje PIC.
Teraz, keď poznáme základné informácie o ADC, poďme otvoriť náš údajový list a naučíme sa, ako používať ADC na našom PIC16F877A MCU. PIC, ktorý používame, má 10-bitový 8-kanálový ADC. To znamená, že výstupná hodnota nášho ADC bude 0-1024 (2 ^ 10) a na našom MCU je 8 pinov (kanálov), ktoré dokážu čítať analógové napätie. Hodnota 1024 sa získa o 2 ^ 10, pretože náš ADC je 10 bitový. Osem kolíkov, ktoré dokážu čítať analógové napätie, je uvedených v údajovom liste. Pozrime sa na obrázok nižšie.
Analógové kanály AN0 až AN7 sú pre vás zvýraznené. Iba tieto piny budú schopné čítať analógové napätie. Takže pred načítaním vstupného napätia musíme v našom kóde určiť, ktorý kanál sa má použiť na načítanie vstupného napätia. V tomto tutoriále použijeme kanál 4 s potenciometrom na čítanie analógového napätia na tomto kanáli.
A / D modul má štyri registre, ktoré je potrebné nakonfigurovať na čítanie údajov zo vstupných pinov. Ide o tieto registre:
• Vysoký register výsledku A / D (ADRESH)
• Nízky register výsledku A / D (ADRESL)
• A / D riadiaci register 0 (ADCON0)
• A / D riadiaci register 1 (ADCON1)
Programovanie pre ADC:
Program pre použitie ADC s PIC mikrokontroléra je veľmi jednoduchá, budeme musieť pochopiť tieto štyri registre a potom číta niektorý analógové napätie bude jednoduché. Ako obvykle inicializujte konfiguračné bity a začnime s void main ().
Vo vnútri prázdna main () musíme inicializovať náš ADC pomocou registrov ADCON1 a ADCON0. Register ADCON0 má nasledujúce bity:
V tomto registri musíme zapnúť modul ADC tak, že urobíme ADON = 1 a zapneme A / D konverzné hodiny pomocou bitov ADCS1 a ADCS0, zvyšok nebude zatiaľ nastavený. V našom programe sú A / D prevádzkové hodiny vybrané ako Fosc / 16, môžete vyskúšať svoje vlastné frekvencie a zistiť, ako sa výsledok zmení. Kompletné informácie sú k dispozícii na strane s údajmi na strane 127. Preto sa ADCON0 inicializuje nasledovne.
ADCON0 = 0b01000001;
Teraz má register ADCON1 nasledujúce bity:
V tomto registri musíme urobiť A / D Result Format Select bit high by ADFM = 1 a make ADCS2 = 1 to select the Fosc / 16 again. Ostatné bity zostávajú nulové, pretože sme plánovali použiť interné referenčné napätie. Kompletné informácie sú k dispozícii na strane s údajmi na strane 128. Preto nastavíme ADCON1 nasledovne.
ADCON1 = 0x11000000;
Teraz po inicializácii modulu ADC v našej hlavnej funkcii sa dostaneme do cyklu while a začneme čítať hodnoty ADC. Ak chcete načítať hodnotu ADC, musíte postupovať podľa nasledujúcich krokov.
- Inicializujte modul ADC
- Vyberte analógový kanál
- Spustite ADC tak, že nastavíte Go / Done trochu vysoko
- Počkajte, kým bit Go / DONE neklesne
- Získajte výsledok ADC z registrov ADRESH a ADRESL
1. Inicializácia modulu ADC: Už sme sa naučili, ako inicializovať ADC, takže na spustenie ADC voláme túto funkciu nižšie.
Funkcia void ADC_Initialize () je nasledovná.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON a Fosc / 16 is selected ADCON1 = 0b11000000; // Je vybrané interné referenčné napätie}
2. Vyberte analógový kanál: Teraz musíme zvoliť, ktorý kanál použijeme na načítanie hodnoty ADC. Umožňuje to urobiť funkciu, aby sme sa mohli ľahko prepínať medzi jednotlivými kanálmi vo vnútri while cyklu.
unsigned int ADC_Read (kanál s nepodpísaným znakom) {// **** Výber kanála ** /// ADCON0 & = 0x11000101; // Vymazanie bitov na výber kanála ADCON0 - = kanál << 3; // Nastavenie požadovaných bitov // ** Výber kanála je dokončený *** ///}
Potom je kanál, ktorý sa má zvoliť, prijatý do variabilného kanálu. V rade
ADCON0 & = 0x1100101;
Predošlý výber kanála (ak existuje) je vymazaný. To sa deje pomocou bitového operátora a operátora „&“. Bity 3, 4 a 5 sú vynútené na 0, zatiaľ čo ostatné sa ponechajú na svojich predchádzajúcich hodnotách.
Potom sa požadovaný kanál vyberie ľavým posunutím čísla kanálu trikrát a nastavením bitov pomocou bitového alebo operátora „-“.
ADCON0 - = kanál << 3; // Nastavenie požadovaných bitov
3. Spustite ADC tak, že nastavíte bit Go / Done vysoko: Po výbere kanála musíme zahájiť konverziu ADC jednoducho tak, že nastavíte bit GO_nDONE vysoko:
GO_nDONE = 1; // Inicializuje A / D prevod
4. Počkajte, kým bit Go / DONE neklesne na nízko: Bit GO / DONE zostane vysoký, kým nebude dokončený prevod ADC, a preto musíme počkať, kým sa tento bit opäť nedostane na nízku úroveň. To je možné vykonať pomocou while slučky.
while (GO_nDONE); // Počkajte na dokončenie A / D prevodu
5. Získajte výsledok ADC z registra ADRESH a ADRESL: Keď sa bit Go / DONE opäť zníži na nízku hodnotu, znamená to, že konverzia ADC je dokončená. Výsledkom ADC bude 10-bitová hodnota. Pretože náš MCU je 8-bitový MCU, výsledok sa rozdelí na horný 8-bitový a dolný 2-bitový. Horný 8-bitový výsledok je uložený v registri ADRESH a dolný 2-bit je uložený v registri ADRESL. Preto ich musíme pridať do registrov, aby sme získali našu 10-bitovú hodnotu ADC. Tento výsledok vráti funkcia, ako je uvedené nižšie:
návrat ((ADRESH << 8) + ADRESL); // Vráti výsledok
Tu je zobrazená úplná funkcia, ktorá sa používa na výber kanálu ADC, spustenie ADC a vrátenie výsledku.
unsigned int ADC_Read (kanál s nepodpísaným znakom) {ADCON0 & = 0x11000101; // Vymazanie bitov na výber kanála ADCON0 - = kanál << 3; // Nastavenie požadovaných bitov __delay_ms (2); // Čas získania nabitia kondenzátora GO_nDONE = 1; // Inicializuje A / D prevod, zatiaľ čo (GO_nDONE); // Počkajte na A / D prevod na dokončenie vrátenia ((ADRESH << 8) + ADRESL); // Vráti výsledok}
Teraz máme funkciu, ktorá zoberie výber kanálu ako vstup a vráti nám hodnotu ADC. Z tohto dôvodu môžeme rovno volať túto funkciu v našom while slučky, pretože sme čítanie analógové napätie z kanála 4 v tomto tutoriálu, volanie funkcie bude vyzerať nasledovne.
i = (ADC_Read (4)); // uloží výsledok adc do „i“.
Na vizualizáciu výstupu nášho ADC budeme potrebovať akési zobrazovacie moduly ako LCD alebo 7-segmentové. V tomto tutoriále používame na overenie výstupu 7-segmentový displej. Ak chcete vedieť, ako používať 7-segmentový s obrázkom, postupujte podľa tutoriálu tu.
Kompletný kód je uvedený nižšie a tento proces je tiež vysvetlené v Video na konci.
Nastavenie a testovanie hardvéru:
Ako je obvyklé, simulujte kód pomocou programu Proteus skôr, ako skutočne použijete náš hardvér, schémy projektu sú uvedené nižšie:
Pripojenie štvormiestneho sedem segmentového zobrazovacieho modulu s mikrokontrolérom PIC je rovnaké ako v predchádzajúcom projekte, práve sme ku kolíku 7, ktorý je analógovým kanálom 4, pridali potenciometer. Zmenou banky sa do MCU pošle premenlivé napätie. ktoré načíta modul ADC a zobrazí na 7-segmentovom displeji. V predchádzajúcom návode sa dozviete viac o štvormiestnom 7-segmentovom displeji a jeho prepojení s PIC MCU.
Tu sme použili tú istú dosku mikrokontroléra PIC, ktorú sme vytvorili v návode na blikanie LED. Po zaistení pripojenia nahrajte program do PIC a mali by ste vidieť výstup ako tento
Tu sme načítali hodnotu ADC z banky a previedli ju na skutočné napätie mapovaním výstupu 0-1024 ako 0-5 voltov (ako je znázornené v programe). Hodnota sa potom zobrazí na 7-segmentovom segmente a overí sa pomocou multimetra.
To je všetko, teraz sme pripravení využiť všetky analógové senzory dostupné na trhu, vyskúšajte to a ak máte problémy ako obvykle, použite sekciu komentárov, radi vám pomôžeme.