Ez a 9. oktatóanyagunk a PIC mikrokontrollerek megtanulásáról MPLAB és XC8 használatával. Mostanáig számos olyan alapvető oktatóanyagot ismertettünk, mint az MPLABX használatának megkezdése, a PIC-vel villogó LED, a PIC-ben időzítők, az LCD-interfész, a 7-szegmenses interfészek stb. és kezdje el a tanulást.
Ebben az oktatóanyagban megtanuljuk az ADC használatát a PICF877A PIC mikrovezérlőnkkel. A mikrokontroller projektek többségében egy ADC (Analog to Digital Converter) is részt vesz benne, mert ez az egyik leggyakrabban használt módszer a valós világból történő adatok olvasására. Szinte az összes érzékelő, például a hőmérséklet-érzékelő, a fluxus-érzékelő, a nyomásérzékelő, az áramérzékelők, a feszültségérzékelők, a giroszkópok, a gyorsulásmérők, a távolságérzékelő, és szinte minden ismert érzékelő vagy átalakító 0–5 V közötti analóg feszültséget állít elő az érzékelők leolvasása alapján. A hőmérséklet-érzékelő például 2,1 V-ot adhat ki, ha a hőmérséklet 25 ° C, és 4,7-re emelkedhet, ha a hőmérséklet 60 ° C. A való világ hőmérsékletének megismerése érdekében az MCU-nak csak le kell olvasnia ennek a hőmérséklet-érzékelőnek a kimeneti feszültségét, és viszonyítania kell azt a valós hőmérséklethez. Ezért az ADC fontos munkaeszköz az MCU projektek számára, és megtanulja, hogyan használhatjuk a PIC16F877A készüléken.
Ellenőrizze az ADC más mikrokontrollerekben történő használatáról szóló korábbi cikkeket is:
- Hogyan kell használni az ADC-t az Arduino Uno-ban?
- Raspberry Pi ADC bemutató
- Az ADC0808 összekapcsolása a 8051 mikrokontrollerrel
ADC a PIC16F877A PIC mikrovezérlőben:
Sokféle ADC áll rendelkezésre, és mindegyiknek megvan a maga sebessége és felbontása. Az ADC-k leggyakoribb típusai a flash, az egymást követő közelítés és a sigma-delta. A PIC16F877A-ban használt ADC- t röviden Szekvenciális közelítés ADC-nek vagy SAR- nak hívják. Tehát tanuljunk meg egy kicsit a SAR ADC-ről, mielőtt elkezdenénk használni.
Egymás utáni közelítő ADC: A SAR ADC komparátor és néhány logikai beszélgetés segítségével működik. Ez a típusú ADC referenciafeszültséget használ (amely változó), és összehasonlítja a bemeneti feszültséget a referenciafeszültséggel egy komparátor segítségével, és a különbség, amely digitális kimenet lesz, elmentésre kerül a Legjelentősebb bitről (MSB). Az összehasonlítás sebessége az óra frekvenciájától (Fosc) függ, amelyen a PIC működik.
Most, hogy ismerjük az ADC néhány alapját, nyissuk meg az adatlapunkat, és megtanuljuk az ADC használatát a PIC16F877A MCU-nkon. Az általunk használt PIC 10 bites 8 csatornás ADC-vel rendelkezik. Ez azt jelenti, hogy az ADC kimeneti értéke 0-1024 (2 ^ 10) lesz, és az MCU-nkon 8 érintkező (csatorna) van, amelyek leolvashatják az analóg feszültséget. Az 1024 értéket 2 ^ 10 kapja meg, mivel az ADC 10 bit. Az analóg feszültséget leolvasó nyolc érintkezőt az adatlap tartalmazza. Nézzük meg az alábbi képet.
Az AN0-AN7 analóg csatornák kiemelve vannak az Ön számára. Csak ezek a csapok képesek leolvasni az analóg feszültséget. Tehát a bemeneti feszültség beolvasása előtt meg kell adnunk a kódunkban, hogy melyik csatornát kell használni a bemeneti feszültség leolvasásához. Ebben az oktatóanyagban a 4. csatornát fogjuk használni egy potenciométerrel az analóg feszültség leolvasására ezen a csatornán.
Az A / D modul négy regiszterrel rendelkezik, amelyeket be kell állítani az adatok beolvasására a bemeneti csapokról. Ezek a nyilvántartások:
• A / D eredmények magas nyilvántartása (ADRESH)
• A / D eredmény alacsony nyilvántartás (ADRESL)
• A / D vezérlő regiszter 0 (ADCON0)
• A / D ellenőrzési regisztráció 1 (ADCON1)
Programozás az ADC számára:
Az ADC és a PIC mikrokontroller használatának programja nagyon egyszerű, csak meg kell értenünk ezt a négy regisztert, majd az analóg feszültségek leolvasása egyszerű lesz. Szokás szerint inicializálja a konfigurációs biteket, és kezdjük a void main () paranccsal.
Bent a void main () van inicializálni a ADC segítségével a ADCON1 nyilvántartás és ADCON0 nyilvántartásban. Az ADCON0 regiszter a következő bitekkel rendelkezik:
Ebben a regiszterben be kell kapcsolnunk az ADC modult az ADON = 1 érték megadásával, és be kell kapcsolnunk az A / D konverziós órát az ADCS1 és ADCS0 bitek használatával, a többit egyelőre nem állítjuk be. Programunkban az A / D konverziós órát Fosc / 16-ként választják, kipróbálhatja saját frekvenciáit, és megnézheti, hogyan változik az eredmény. A részletek az adatlap 127. oldalán találhatók. Ezért az ADCON0 inicializálása a következőképpen történik.
ADCON0 = 0b01000001;
Most az ADCON1 regiszter a következő bitekkel rendelkezik:
Ebben a regiszterben az A / D Result Format Select bitet magasra kell állítani ADFM = 1 értékkel, és az ADCS2 = 1 értéket kell megadnunk a Fosc / 16 ismételt kiválasztásához. A többi bit nulla marad, mivel a belső referenciafeszültség használatát terveztük. Teljes részletek az adatlap 128. oldalán találhatók. Ezért az ADCON1 a következőket állítja be.
ADCON1 = 0x11000000;
Miután az ADC modult inicializálta a fő funkciónkban, engedje be a while ciklust és kezdje el olvasni az ADC értékeket. Az ADC érték beolvasásához a következő lépéseket kell végrehajtani.
- Inicializálja az ADC modult
- Válassza ki az analóg csatornát
- Indítsa el az ADC-t úgy, hogy a Go / Done bitet magasra állítja
- Várja meg, amíg a Go / DONE bit alacsony lesz
- Szerezze meg az ADC eredményt az ADRESH és az ADRESL regiszterből
1. Az ADC modul inicializálása: Már megtanultuk, hogyan kell inicializálni az ADC-t, ezért ezt az alábbi függvénynek hívjuk az ADC inicializálásához.
A void ADC_Initialize () függvény a következő.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON és a Fosc / 16 van kiválasztva ADCON1 = 0b11000000; // belső referenciafeszültség van kiválasztva}
2. Válassza ki az analóg csatornát: Most ki kell választanunk, hogy melyik csatornát fogjuk használni az ADC érték leolvasásához. Készítsünk egy függvényt ehhez, így könnyebben tudunk váltani az egyes csatornák között a while hurokban.
unsigned int ADC_Read (unsigned char channel) {// **** A csatorna kiválasztása ** /// ADCON0 & = 0x11000101; // A csatornaválasztó bitek törlése ADCON0 - = csatorna << 3; // A szükséges bitek beállítása // ** A csatornaválasztás befejeződött *** ///}
Ezután a változó csatornán belül fogadja a kiválasztandó csatornát. A sorban
ADCON0 & = 0x1100101;
Az előző csatornaválasztás (ha van ilyen) törlődik. Ez a bitenkénti és az „&” operátor használatával történik. A 3., 4. és 5. bit 0-ra kényszerül, míg a többi marad a korábbi értékeiben.
Ezután a kívánt csatornát úgy választja ki, hogy balra eltolja a csatorna számát háromszor, és a biteket a bitenként vagy a „-” operátor segítségével állítja be.
ADCON0 - = csatorna << 3; // A szükséges bitek beállítása
3. Indítsa el az ADC-t a Go / Done bit bit magas szintjére állításával : A csatorna kiválasztása után el kell indítanunk az ADC konverziót, egyszerűen a GO_nDONE bit magasra állításával :
GO_nDONE = 1; // Inicializálja az A / D konverziót
4. Várja meg, amíg a Go / DONE bit alacsony lesz: A GO / DONE bit magas marad, amíg az ADC átalakítás be nem fejeződik, ezért meg kell várnunk, amíg ez a bit ismét alacsony szintre nem kerül. Ez történhet egy , míg hurok.
míg (GO_nDONE); // Várja meg az A / D átalakítás befejezését
5. Szerezze meg az ADC eredményt az ADRESH és az ADRESL regiszterből: Amikor a Go / DONE bit ismét alacsony szintre kerül, ez azt jelenti, hogy az ADC átalakítás befejeződött. Az ADC eredménye 10 bites érték lesz. Mivel az MCU egy 8 bites MCU, az eredmény fel van osztva a felső 8 és az alsó 2 bitre. A felső 8 bites eredmény az ADRESH regiszterben, az alsó 2 bites az ADRESL regiszterben tárolódik. Ezért ezeket össze kell adnunk a regiszterekben, hogy megkapjuk a 10 bites ADC értékünket. Ezt az eredményt a függvény adja vissza az alábbiak szerint:
return ((ADRESH << 8) + ADRESL); // Eredményt ad vissza
Itt látható az a teljes funkció, amely az ADC csatorna kiválasztására, az ADC kiváltására és az eredmény visszaadására szolgál.
unsigned int ADC_Read (unsigned char channel) {ADCON0 & = 0x11000101; // A csatornaválasztó bitek törlése ADCON0 - = csatorna << 3; // A szükséges bitek beállítása __delay_ms (2); // Tartási kondenzátor töltési ideje GO_nDONE = 1; // A / D átalakítást inicializálja, míg (GO_nDONE); // Várja meg az A / D konverzió teljes visszatérését ((ADRESH << 8) + ADRESL); // Eredményt ad vissza}
Most van egy olyan funkciónk, amely a csatorna kiválasztását veszi bemenetként, és visszaadja nekünk az ADC értéket. Ezért közvetlenül hívhatjuk ezt a függvényt a while hurokunk belsejében, mivel ebben az oktatóanyagban a 4. csatorna analóg feszültségét olvassuk, a függvényhívás a következő lesz.
i = (ADC_Read (4)); // tárolja az adc eredményét az „i” -ben.
Az ADC kimenetének megjelenítéséhez valamilyen megjelenítő modulokra lesz szükségünk, például az LCD-re vagy a 7 szegmensre. Ebben az oktatóanyagban egy 7 szegmenses kijelzőt használunk a kimenet ellenőrzéséhez. Ha szeretné tudni, hogyan kell használni a 7 szegmenses képet, kövesse az itt bemutatott oktatóanyagot.
A teljes kódot az alábbiakban adjuk meg, és a folyamatot a végén található videó is elmagyarázza.
Hardver beállítása és tesztelése:
Szokás szerint a kódot a Proteus segítségével szimuláljuk, mielőtt a hardverünkhöz igazodnánk, a projekt vázlata az alábbiakban látható:
A 4 számjegyű, hét szegmenses kijelzőmodul és a PIC mikrovezérlő csatlakozásai megegyeznek az előző projekttel, most hozzáadtunk egy potenciométert a 7 tűhöz, amely az analóg 4 csatorna. A pot változtatásával változó feszültséget küld az MCU amelyet az ADC modul el fog olvasni és megjeleníti a 7 szegmenses Module kijelzőn. Ellenőrizze az előző oktatóanyagot, hogy többet tudjon meg a 4-jegyű 7-szegmenses kijelzőről és annak PIC MCU-val való összekapcsolásáról.
Itt ugyanazt a PIC mikrokontroller kártyát használtuk, amelyet a LED villogó bemutatójában hoztunk létre. Miután biztosította a kapcsolatot, töltse fel a programot a PIC-be, és látnia kell egy ilyen kimenetet
Itt leolvashattuk az edény ADC értékét, és átalakítottuk a tényleges feszültségre azáltal, hogy a 0-1024 kimenetet 0-5 voltként feltérképeztük (a programban látható módon). Ezután az érték megjelenik a 7 szegmensben, és a multiméter segítségével ellenőrizhető.
Ennek ellenére most már készen állunk a piacon elérhető összes analóg érzékelő használatára, folytassa és próbálja ki ezt, és ha bármilyen problémája van, használja a megjegyzés részt, szívesen segítünk.