Toto je náš 9. kurz Výuky mikrokontrolérů PIC pomocí MPLAB a XC8. Dosud jsme prozkoumali mnoho základních tutoriálů, jako je začátek s MPLABX, blikání LED s PIC, časovače v PIC, propojení LCD, propojení 7 segmentů atd. Pokud jste úplný začátečník, pak prosím navštivte kompletní seznam tutoriálů PIC zde a začít se učit.
V tomto tutoriálu se naučíme, jak používat ADC s naším mikrokontrolérem PIC PICF877A. Většina projektů mikrokontroléru bude zahrnovat ADC (analogově-digitální převodník), protože je to jeden z nejpoužívanějších způsobů čtení dat ze skutečného světa. Téměř všechny senzory, jako jsou teplotní senzory, senzory toku, tlakové senzory, proudové senzory, napěťové senzory, gyroskopy, akcelerometry, senzory vzdálenosti a téměř všechny známé senzory nebo převodníky, produkují analogové napětí 0V až 5V na základě odečtu senzorů. Například teplotní senzor může vydávat 2,1 V, když je teplota 25 ° C, a jít až na 4,7, když je teplota 60 ° C. Aby bylo možné znát teplotu skutečného světa, musí MCU pouze přečíst výstupní napětí tohoto teplotního senzoru a přičíst ho k teplotě reálného světa. Proto je ADC důležitým pracovním nástrojem pro projekty MCU a umožňuje zjistit, jak jej můžeme použít na našem PIC16F877A.
Podívejte se také na naše předchozí články o používání ADC v jiných mikrokontrolérech:
- Jak používat ADC v Arduino Uno?
- Výukový program ADC pro Raspberry Pi
- Propojení ADC0808 s mikrokontrolérem 8051
ADC v mikrokontroléru PIC PIC16F877A:
Existuje mnoho typů ADC a každý z nich má vlastní rychlost a rozlišení. Nejběžnějšími typy ADC jsou blesk, postupná aproximace a sigma-delta. Typ ADC používá v PIC16F877A je nazýván jako postupnou aproximací ADC SAR v krátké. Dozvěděme se tedy něco o SAR ADC, než jej začneme používat.
Postupná aproximace ADC: SAR ADC pracuje pomocí komparátoru a několika logických konverzací. Tento typ ADC používá referenční napětí (které je proměnné) a porovnává vstupní napětí s referenčním napětím pomocí komparátoru a rozdíl, který bude digitálním výstupem, se ukládá z nejvýznamnějšího bitu (MSB). Rychlost srovnání závisí na taktovací frekvenci (Fosc), na které PIC pracuje.
Nyní, když víme základní základy ADC, si necháme otevřít náš datový list a naučíme se používat ADC na našem PIC16F877A MCU. PIC, který používáme, má 10bitový 8kanálový ADC. To znamená, že výstupní hodnota našeho ADC bude 0-1024 (2 ^ 10) a na našem MCU je 8 pinů (kanálů), které mohou číst analogové napětí. Hodnota 1024 je získána 2 ^ 10, protože náš ADC je 10 bitů. Osm kolíků, které umí číst analogové napětí, je uvedeno v datovém listu. Podívejme se na obrázek níže.
Analogové kanály AN0 až AN7 jsou pro vás zvýrazněny. Pouze tyto piny budou schopny číst analogové napětí. Takže před čtením vstupního napětí musíme v našem kódu určit, který kanál má být použit pro čtení vstupního napětí. V tomto tutoriálu použijeme kanál 4 s potenciometrem ke čtení analogového napětí na tomto kanálu.
A / D modul má čtyři registry, které je třeba nakonfigurovat pro čtení dat ze vstupních pinů. Tyto registry jsou:
• A / D Result High Register (ADRESH)
• Nízký registr výsledku A / D (ADRESL)
• Řídicí registr A / D 0 (ADCON0)
• Řídicí registr A / D 1 (ADCON1)
Programování pro ADC:
Program pro použití ADC s PIC mikrokontroléru je velmi jednoduchá, budeme muset pochopit tyto čtyři registry a pak čte některý analogové napětí bude jednoduché. Jako obvykle inicializujte konfigurační bity a začněme s void main ().
Uvnitř void main () musíme inicializovat náš ADC pomocí registrů ADCON1 a ADCON0. Registr ADCON0 má následující bity:
V tomto registru musíme zapnout modul ADC provedením ADON = 1 a zapnout A / D převodní hodiny pomocí bitů ADCS1 a ADCS0, zbytek zatím nebude nastaven. V našem programu jsou A / D převodní hodiny vybrány jako Fosc / 16, můžete vyzkoušet své vlastní frekvence a zjistit, jak se výsledek změní. Úplné podrobnosti jsou k dispozici na stránce s údajovými listy na straně 127. Proto bude ADCON0 inicializován následovně.
ADCON0 = 0b01000001;
Nyní má registr ADCON1 následující bity:
V tomto registru musíme udělat A / D Result Format Select bit high by ADFM = 1 a make ADCS2 = 1 to select the Fosc / 16 again. Ostatní bity zůstávají nulové, protože jsme plánovali použít interní referenční napětí. Kompletní podrobnosti jsou k dispozici na stránce s údaji o produktu na straně 128. Proto nastavíme ADCON1 následovně.
ADCON1 = 0x11000000;
Nyní po inicializaci modulu ADC uvnitř naší hlavní funkce se dostaneme do smyčky while a začneme číst hodnoty ADC. Chcete-li načíst hodnotu ADC, musíte postupovat podle následujících kroků.
- Inicializujte modul ADC
- Vyberte analogový kanál
- Spusťte ADC tím, že uděláte Go / Done trochu vysoko
- Počkejte, až se bit Go / DONE sníží
- Získejte výsledek ADC z registrů ADRESH a ADRESL
1. Inicializace modulu ADC: Již jsme se naučili, jak inicializovat ADC, takže voláme tuto níže uvedenou funkci pro inicializaci ADC
Funkce void ADC_Initialize () je následující.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON a Fosc / 16 is selected ADCON1 = 0b11000000; // Je vybráno interní referenční napětí}
2. Vyberte analogový kanál: Nyní musíme vybrat, který kanál použijeme ke čtení hodnoty ADC. Pojďme pro to vytvořit funkci, takže pro nás bude snadné přepínat mezi jednotlivými kanály uvnitř smyčky while .
unsigned int ADC_Read (unsigned char channel) {// **** Výběr kanálu ** /// ADCON0 & = 0x11000101; // Vymazání bitů pro výběr kanálu ADCON0 - = kanál << 3; // Nastavení požadovaných bitů // ** Výběr kanálu dokončen *** ///}
Poté je kanál, který má být vybrán, přijat uvnitř variabilního kanálu. V řadě
ADCON0 & = 0x1100101;
Předchozí výběr kanálu (pokud existuje) je zrušen. To se provádí pomocí bitového operátoru a operátoru „&“. Bity 3, 4 a 5 jsou nuceny být 0, zatímco ostatní jsou ponechány ve svých předchozích hodnotách.
Poté je požadovaný kanál vybrán levým posunutím čísla kanálu třikrát a nastavením bitů pomocí bitového nebo operátoru „-“.
ADCON0 - = kanál << 3; // Nastavení požadovaných bitů
3. Spusťte ADC tak, že nastavíte bit Go / Done vysoko: Jakmile je vybrán kanál, musíme spustit ADC převod jednoduše tak, že nastavíte bit GO_nDONE vysoko:
GO_nDONE = 1; // Inicializuje A / D převod
4. Počkejte, až se bit Go / DONE sníží: Bit GO / DONE zůstane vysoký, dokud nebude dokončena konverze ADC, a proto musíme počkat, dokud tento bit opět neklesne. To lze provést pomocí while smyčky.
while (GO_nDONE); // Počkejte na dokončení A / D převodu
5. Získejte výsledek ADC z registru ADRESH a ADRESL: Když bit Go / DONE opět poklesne, znamená to, že převod ADC je dokončen. Výsledkem ADC bude 10bitová hodnota. Protože náš MCU je 8bitový MCU, výsledek je rozdělen na horní 8bitové a spodní 2bitové. Horní 8bitový výsledek je uložen v registru ADRESH a spodní 2bitový je uložen v registru ADRESL. Proto je musíme sečíst do registrů, abychom získali naši 10bitovou hodnotu ADC. Tento výsledek je vrácen funkcí, jak je znázorněno níže:
návrat ((ADRESH << 8) + ADRESL); // Vrátí výsledek
Zde je zobrazena kompletní funkce, která se používá k výběru kanálu ADC, spuštění ADC a vrácení výsledku.
unsigned int ADC_Read (nepodepsaný char kanál) {ADCON0 & = 0x11000101; // Vymazání bitů pro výběr kanálu ADCON0 - = kanál << 3; // Nastavení požadovaných bitů __delay_ms (2); // Pořizovací doba pro nabití kondenzátoru GO_nDONE = 1; // Inicializuje A / D převod, zatímco (GO_nDONE); // Počkejte na A / D převod a dokončete návrat ((ADRESH << 8) + ADRESL); // Vrátí výsledek}
Nyní máme funkci, která vezme výběr kanálu jako vstup a vrátí nám hodnotu ADC. Proto můžeme tuto funkci přímo volat uvnitř naší smyčky while , protože v tomto tutoriálu čteme analogové napětí z kanálu 4, volání funkce bude následující.
i = (ADC_Read (4)); // uloží výsledek adc do „i“.
Abychom si mohli představit výstup našeho ADC, budeme potřebovat nějaký druh zobrazovacích modulů, jako je LCD nebo 7segmentový. V tomto kurzu používáme k ověření výstupu 7segmentový displej. Pokud chcete vědět, jak používat 7 segmentů s obrázkem, postupujte podle návodu zde.
Kompletní kód je uveden níže a tento proces je také vysvětleno v Video na konci.
Nastavení a testování hardwaru:
Jako obvykle simulujeme kód pomocí Proteus, než skutečně použijeme náš hardware, schémata projektu jsou uvedena níže:
Připojení čtyřmístného sedmisegmentového zobrazovacího modulu s mikrokontrolérem PIC jsou stejná jako v předchozím projektu, právě jsme přidali potenciometr na pin 7, což je analogový kanál 4. Změnou potu bude do MCU odesláno proměnné napětí které budou načteny modulem ADC a zobrazeny na 7segmentovém zobrazovacím modulu. V předchozím výukovém programu se dozvíte více o čtyřmístném sedmisegmentovém displeji a jeho propojení s PIC MCU.
Zde jsme použili stejnou desku mikrokontroléru PIC, kterou jsme vytvořili v tutoriálu s blikáním LED. Po zajištění připojení nahrajte program do PIC a měli byste vidět takový výstup
Zde jsme načetli hodnotu ADC z banku a převedli ji na skutečné napětí mapováním výstupu 0-1024 jako 0-5 voltů (jak je znázorněno v programu). Hodnota se poté zobrazí na 7segmentu a ověří se pomocí multimetru.
A to je vše, nyní jsme připraveni použít všechny analogové senzory dostupné na trhu, vyzkoušejte to a pokud máte nějaké problémy jako obvykle, použijte sekci komentářů, rádi vám pomůžeme.