Tämä on 9. opetusohjelma PIC-mikrokontrollerien oppimisesta MPLAB: n ja XC8: n avulla. Tähän asti olemme käsittäneet monia perusopetusohjelmia, kuten MPLABX: n käytön aloittaminen, LED-merkkivalo vilkkuu PIC: n kanssa, ajastimet PIC: ssä, LCD-liitännät, 7-segmenttiset liitännät jne. ja aloita oppiminen.
Tässä opetusohjelmassa opitaan, kuinka ADC: tä käytetään PIC-mikrokontrollerimme PICF877A kanssa. Suurin osa mikrokontrolleriprojekteista sisältää siihen ADC: n (Analog to Digital Converter), koska se on yksi käytetyimmistä tavoista lukea tietoja todellisesta maailmasta. Lähes kaikki anturit, kuten lämpötila-anturi, vuon anturi, paineanturi, virta-anturit, jänniteanturit, gyroskoopit, kiihtyvyysanturit, etäisyysanturi ja melkein kaikki tunnetut anturit tai anturit tuottavat analogisen jännitteen 0 V - 5 V antureiden lukemien perusteella. Lämpötila-anturi voi antaa esimerkiksi 2,1 V, kun lämpötila on 25 ° C, ja nousta 4,7: een, kun lämpötila on 60 ° C. Todellisen maailman lämpötilan tuntemiseksi MCU: n on vain luettava tämän lämpötila-anturin lähtöjännite ja suhteutettava se reaalimaailman lämpötilaan. Siksi ADC on tärkeä työväline MCU-projekteille ja antaa oppia käyttämään sitä PIC16F877A-laitteessamme.
Tarkista myös edelliset artikkelimme ADC: n käytöstä muissa mikro-ohjaimissa:
- Kuinka käyttää ADC: tä Arduino Unossa?
- Vadelma Pi ADC -opastus
- ADC0808: n ja 8051-mikrokontrollerin liitäntä
ADC PIC-mikrokontrollerissa PIC16F877A:
Saatavilla on useita ADC-tyyppejä, ja jokaisella on oma nopeus ja tarkkuus. Yleisimmät ADC-tyypit ovat salama, peräkkäinen likiarvo ja sigma-delta. Tyyppi ADC käytetään PIC16F877A kutsutaan peräkkäisten lähentämisestä ADC tai SAR lyhyt. Joten oppitaan hieman SAR ADC: stä ennen kuin aloitamme sen käytön.
Peräkkäinen approksimaatio ADC: SAR ADC toimii vertailijan ja joidenkin loogisten keskustelujen avulla. Tämän tyyppinen ADC käyttää referenssijännitettä (joka on muuttuva) ja vertaa tulojännitettä vertailujännitteeseen vertailujännitteellä ja ero, joka tulee olemaan digitaalinen lähtö, tallennetaan merkittävimmältä bitiltä (MSB). Vertailun nopeus riippuu kellotaajuudesta (Fosc), jolla PIC toimii.
Nyt kun tiedämme joitain ADC: n perusteita, voimme avata tietolomakkeen ja oppia käyttämään ADC: tä PIC16F877A MCU: ssa. PIC, jota käytämme, on 10-bittinen 8-kanavainen ADC. Tämä tarkoittaa, että ADC: n lähtöarvo on 0-1024 (2 ^ 10) ja MCU: ssa on 8 nastaa (kanavaa), jotka pystyvät lukemaan analogista jännitettä. Arvo 1024 saadaan 2 ^ 10, koska ADC on 10 bittiä. Kahdeksan nastaa, jotka pystyvät lukemaan analogisen jännitteen, mainitaan lomakkeessa. Katsotaanpa alla olevaa kuvaa.
Analogiset kanavat AN0 - AN7 on korostettu sinulle. Vain nämä nastat pystyvät lukemaan analogista jännitettä. Joten ennen tulojännitteen lukemista meidän on määritettävä koodissamme, mitä kanavaa on käytettävä tulojännitteen lukemiseen. Tässä opetusohjelmassa käytämme potentiometrillä kanavaa 4 lukemaan analogisen jännitteen tällä kanavalla.
A / D-moduulissa on neljä rekisteriä, jotka on määritettävä lukemaan tietoja tuloliittimistä. Nämä rekisterit ovat:
• A / D-tulosrekisteri (ADRESH)
• A / D-tuloksen alarekisteri (ADRESL)
• A / D-ohjausrekisteri 0 (ADCON0)
• A / D-ohjausrekisteri 1 (ADCON1)
Ohjelmointi ADC: lle:
Ohjelma käyttää ADC PIC-mikro on hyvin yksinkertainen, meidän täytyy vain ymmärtää nämä neljä rekistereistä ja lukee jokin analoginen jännite on yksinkertainen. Alusta tavallisesti konfigurointibitit ja aloitetaan void main (): lla.
Sisällä void main () meillä alustaa meidän ADC käyttäen ADCON1 rekisteriin ja ADCON0 rekisteriä. ADCON0-rekisterissä on seuraavat bitit:
Tässä rekisterissä meidän on kytkettävä ADC-moduuli päälle tekemällä ADON = 1 ja käynnistämällä A / D-muuntokello käyttämällä bittiä ADCS1 ja ADCS0, loput eivät ole toistaiseksi asetettuja. Ohjelmassamme A / D-muuntokello on valittu Fosc / 16: ksi, voit kokeilla omia taajuuksiasi ja nähdä, kuinka tulos muuttuu. Täydelliset tiedot ovat datalehden sivulla 127. Siksi ADCON0 alustetaan seuraavasti.
ADCON0 = 0b01000001;
Nyt ADCON1-rekisterissä on seuraavat bitit:
Tässä rekisterissä meidän on tehtävä A / D-tulosformaatin valintabitti korkealla ADFM = 1: llä ja ADCS2 = 1 valitaksesi Fosc / 16 uudelleen. Muut bitit pysyvät nollina, koska olemme suunnitelleet sisäisen referenssijännitteen käyttöä. Täydelliset tiedot ovat datalehden sivulla 128. ADCON1 asettaa siis seuraavat.
ADCON1 = 0x11000000;
Nyt kun olet alustanut ADC-moduulin päätoimintomme sisällä, päästään hetkeksi silmukkaan ja aloitetaan ADC-arvojen lukeminen. ADC-arvon lukemiseksi on noudatettava seuraavia vaiheita.
- Alusta ADC-moduuli
- Valitse analoginen kanava
- Käynnistä ADC tekemällä Go / Done vähän korkeaksi
- Odota, että Go / DONE-bitti laskee
- Hanki ADC-tulos ADRESH- ja ADRESL-rekisteristä
1. Alusta ADC-moduuli: Olemme jo oppineet alustamaan ADC: n, joten kutsumme vain tätä alla olevaa toimintoa alustamaan ADC
Void ADC_Initialize () funktio on olla seuraavanlainen.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON ja Fosc / 16 on valittu ADCON1 = 0b11000000; // Sisäinen referenssijännite on valittu}
2. Valitse analoginen kanava: Meidän on nyt valittava kanava, jota aiomme käyttää ADC-arvon lukemiseen. Tehdään tälle funktio niin, että meidän on helppo siirtyä jokaisen kanavan välillä while- silmukan sisällä.
unsigned int ADC_Read (unsigned char channel) {// **** Kanavan valinta ** /// ADCON0 & = 0x11000101; // Kanavanvalintabittien tyhjentäminen ADCON0 - = kanava << 3; // Vaadittujen bittien asettaminen // ** Kanavan valinta valmis *** ///}
Sitten valittu kanava vastaanotetaan muuttuvan kanavan sisällä. Linjalla
ADCON0 & = 0x1100101;
Edellinen kanavan valinta (jos sellainen on) tyhjennetään. Tämä tehdään käyttämällä bittiä ja operaattoria “&”. Bitit 3, 4 ja 5 pakotetaan olemaan 0, kun taas muiden jätetään olemaan edellisissä arvoissaan.
Sitten haluttu kanava valitaan siirtämällä vasemmalle kanavanumeroa kolmesti ja asettamalla bitit bitti- tai operaattorilla “-”.
ADCON0 - = kanava << 3; // Vaadittujen bittien asettaminen
3. Käynnistä ADC tekemällä Go / Done-bitti korkealle: Kun kanava on valittu, meidän on aloitettava ADC-muunnos yksinkertaisesti tekemällä GO_nDONE- bitti korkealle:
GO_nDONE = 1; // Alustaa A / D-muunnoksen
4. Odota, että Go / DONE-bitti laskee : GO / DONE-bitti pysyy korkealla, kunnes ADC-muunnos on saatu päätökseen, joten meidän on odotettava, kunnes tämä bitti laskee jälleen matalaksi. Tämä voidaan tehdä käyttämällä while- silmukkaa.
kun (GO_nDONE); // Odota, että A / D-muunnos on valmis
5. Hanki ADC-tulos ADRESH- ja ADRESL-rekisteristä: Kun Go / DONE-bitti laskee jälleen matalaksi, se tarkoittaa, että ADC-muunnos on valmis. ADC: n tulos on 10-bittinen arvo. Koska MCU on 8-bittinen MCU, tulos jaetaan ylempiin 8-bittisiin ja alempiin 2-bitteihin. Ylempi 8-bittinen tulos tallennetaan rekisteriin ADRESH ja alin 2-bittinen tallennetaan rekisteriin ADRESL. Siksi meidän on lisättävä nämä rekistereihin saadaksemme 10-bittisen ADC-arvon. Tuloksen palauttaa toiminto, kuten alla on esitetty:
paluu ((ADRESH << 8) + ADRESL); // Palauttaa tuloksen
Tässä näytetään täydellinen toiminto, jota käytetään ADC-kanavan valitsemiseen, ADC: n käynnistämiseen ja tuloksen palauttamiseen.
unsigned int ADC_Read (allekirjoittamaton char-kanava) {ADCON0 & = 0x11000101; // Kanavanvalintabittien tyhjentäminen ADCON0 - = kanava << 3; // Vaadittujen bittien asettaminen __delay_ms (2); // Hankinta-aika pitokondensaattorin lataamiseksi GO_nDONE = 1; // Alustaa A / D-muunnoksen, kun (GO_nDONE); // Odota, että A / D-muunnos palaa loppuun ((ADRESH << 8) + ADRESL); // Palauttaa tuloksen}
Nyt meillä on toiminto, joka ottaa kanavan valinnan tuloksi ja palauttaa meille ADC-arvon. Näin ollen voimme soittaa suoraan tämän toiminnon sisällä meidän kun taas silmukka, koska luemme analoginen jännite kanava 4 oppitunnin funktiokutsun on seuraava.
i = (ADC_Read (4)); // tallenna adc: n tulos kohtaan “i”.
ADC: n tuotoksen visualisoimiseksi tarvitsemme jonkinlaisen näyttömoduulin, kuten nestekidenäytön tai 7-segmentin. Tässä opetusohjelmassa käytämme 7-segmenttistä näyttöä tuloksen vahvistamiseksi. Jos haluat tietää kuinka käyttää 7-segmenttiä kuvan kanssa, seuraa opetusohjelmaa täällä.
Koko koodi annetaan alla ja prosessi on myös selitetty Video lopussa.
Laitteiston asennus ja testaus:
Kuten tavallista, simuloi koodia Proteus-ohjelmalla, ennen kuin menet laitteistomme kanssa, projektin kaaviot esitetään alla:
4-numeroisen seitsemän segmentin näyttömoduulin ja PIC-mikrokontrollerin liitännät ovat samat kuin edellisessä projektissa, olemme juuri lisänneet potentiometrin tapiin 7, joka on analoginen kanava 4. Potia muuttamalla vaihteleva jännite lähetetään MCU: lle jonka ADC-moduuli lukee ja joka näkyy 7-segmenttinäytöllä Module. Katso edellisestä opetusohjelmasta lisätietoja 4-numeroisesta 7-segmenttinäytöstä ja sen liitännästä PIC MCU: n kanssa.
Tässä olemme käyttäneet samaa PIC-mikrokontrollerikorttia, jonka olemme luoneet LED-vilkkumisoppaassa. Kun olet varmistanut yhteyden, lataa ohjelma PIC: ään ja sinun pitäisi nähdä tällainen lähtö
Tässä olemme lukeneet potin ADC-arvon ja muuntaneet sen todelliseksi jännitteeksi kartoittamalla 0-1024-lähdön 0-5 voltiksi (kuten ohjelmassa on esitetty). Arvo näytetään sitten 7-segmentissä ja vahvistetaan yleismittarilla.
Että nyt, nyt olemme valmiita käyttämään kaikkia markkinoilla olevia analogisia antureita, kokeile tätä ja jos sinulla on ongelmia tavalliseen tapaan, käytä kommenttiosaa, autamme mielellämme.