Dette er vår 9. opplæring om å lære PIC-mikrokontrollere ved hjelp av MPLAB og XC8. Til nå har vi dekket mange grunnleggende opplæringer som å komme i gang med MPLABX, LED som blinker med PIC, Timere i PIC, grensesnitt LCD, grensesnitt 7-segment osv. Hvis du er en absolutt nybegynner, kan du gå til den komplette listen over PIC-veiledninger her og begynn å lære.
I denne opplæringen vil vi lære hvordan du bruker ADC med vår PIC-mikrokontroller PICF877A. De fleste av Microcontroller-prosjektene vil involvere en ADC (Analog til Digital-omformer) i den, fordi det er en av de mest brukte måtene å lese data fra den virkelige verden. Nesten alle sensorer som temperaturføler, flussføler, trykkføler, strømfølere, spenningssensorer, gyroskoper, akselerometre, avstandssensor og nesten alle kjente sensorer eller transdusere produserer en analog spenning på 0V til 5V basert på sensoravlesningen. En temperatursensor kan for eksempel gi 2.1V når temperaturen er 25C og gå opp til 4.7 når temperaturen er 60C. For å kjenne temperaturen i den virkelige verden, må MCU bare lese utgangsspenningen til denne temperatursensoren og relatere den til den virkelige verdens temperaturen. Derfor er ADC et viktig arbeidsverktøy for MCU-prosjekter og lar oss lære hvordan vi kan bruke det på PIC16F877A.
Sjekk også våre tidligere artikler om bruk av ADC i andre mikrokontrollere:
- Hvordan bruke ADC i Arduino Uno?
- Raspberry Pi ADC opplæring
- Grensesnitt ADC0808 med 8051 mikrokontroller
ADC i PIC Microcontroller PIC16F877A:
Det er mange typer ADC tilgjengelig, og hver og en har sin egen hastighet og oppløsning. De vanligste typene ADC er flash, suksessiv tilnærming og sigma-delta. Den typen ADC som brukes i PIC16F877A kalles kort fortløpende tilnærming ADC eller SAR. Så la oss lære litt om SAR ADC før vi begynner å bruke den.
Suksessiv tilnærming ADC: SAR ADC fungerer ved hjelp av en komparator og noen logiske samtaler. Denne typen ADC bruker en referansespenning (som er variabel) og sammenligner inngangsspenningen med referansespenningen ved hjelp av en komparator, og forskjellen, som vil være en digital utgang, lagres fra den mest betydningsfulle biten (MSB). Hastigheten på sammenligningen avhenger av klokkefrekvensen (Fosc) som PIC opererer på.
Nå som vi vet noen grunnleggende om ADC, kan vi åpne databladet vårt og lære hvordan du bruker ADC på vår PIC16F877A MCU. PIC-en vi bruker har 10-biters 8-kanals ADC. Dette betyr at utgangsverdien til ADC-en vår vil være 0-1024 (2 ^ 10) og det er 8 pinner (kanaler) på MCU-en vår som kan lese analog spenning. Verdien 1024 oppnås med 2 ^ 10 siden ADC er 10 bit. De åtte pinnene som kan lese den analoge spenningen er nevnt i databladet. La oss se på bildet nedenfor.
De analoge kanalene AN0 til AN7 er uthevet for deg. Bare disse pinnene kan lese analog spenning. Så før vi leser en inngangsspenning, må vi i koden spesifisere hvilken kanal som skal brukes til å lese inngangsspenningen. I denne opplæringen vil vi bruke kanal 4 med et potensiometer for å lese den analoge spenningen på denne kanalen.
A / D-modulen har fire registre som må konfigureres for å lese data fra inngangspinnene. Disse registerene er:
• A / D-resultatregister (ADRESH)
• A / D Resultat lavt register (ADRESL)
• A / D-kontrollregister 0 (ADCON0)
• A / D-kontrollregister 1 (ADCON1)
Programmering for ADC:
The program for å bruke ADC med PIC mikrokontroller er veldig enkelt, vi må bare forstå disse fire registre og deretter lese noen analog spenning vil være enkelt. Initialiser som vanlig konfigurasjonsbitene, og la oss starte med ugyldig hoved ().
Inne i tomrummet () må vi initialisere ADC ved å bruke ADCON1-registeret og ADCON0-registeret. ADCON0-registeret har følgende biter:
I dette registeret må vi slå på ADC-modulen ved å lage ADON = 1 og slå på A / D-konverteringsklokken ved å bruke bitene ADCS1 og ADCS0, resten vil ikke være satt for nå. I vårt program er A / D-konverteringsklokken valgt som Fosc / 16, du kan prøve dine egne frekvenser og se hvordan resultatet endres. Komplette detaljer tilgjengelig på databladets side 127. Derfor blir ADCON0 initialisert som følger.
ADCON0 = 0b01000001;
Nå har ADCON1-registeret følgende biter:
I dette registeret må vi lage A / D resultatformat Velg bit høyt med ADFM = 1 og lage ADCS2 = 1 for å velge Fosc / 16 igjen. De andre bitene forblir null da vi har planlagt å bruke den interne referansespenningen. Komplette detaljer tilgjengelig på datablad side 128. Derfor vil vi sette ADCON1 som følger.
ADCON1 = 0x11000000;
Nå etter at vi har initialisert ADC-modulen i hovedfunksjonen, kan vi gå inn i mensløyfen og begynne å lese ADC-verdiene. For å lese en ADC-verdi må følgende trinn følges.
- Initialiser ADC-modulen
- Velg den analoge kanalen
- Start ADC ved å gjøre Go / Done litt høyt
- Vent til Go / DONE-biten blir lav
- Få ADC-resultatet fra ADRESH og ADRESL-registeret
1. Initialiser ADC-modulen: Vi har allerede lært hvordan du initialiserer en ADC, så vi kaller bare denne funksjonen nedenfor for å initialisere ADC
Den ugyldige ADC_Initialize () -funksjonen er som følger.
ugyldig ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON og Fosc / 16 er valgt ADCON1 = 0b11000000; // Intern referansespenning er valgt}
2. Velg den analoge kanalen: Nå må vi velge hvilken kanal vi skal bruke for å lese ADC-verdien. La oss gjøre en funksjon for dette, slik at det vil være enkelt for oss å skifte mellom hver kanal inne i mens sløyfen.
usignert int ADC_Read (usignert char-kanal) {// **** Velge kanal ** /// ADCON0 & = 0x11000101; // Slette kanalvalgbitene ADCON0 - = kanal << 3; // Innstilling av nødvendige biter // ** Kanalvalg fullført *** ///}
Deretter mottas kanalen som skal velges inne i den variable kanalen. I køen
ADCON0 & = 0x1100101;
Det forrige kanalvalget (hvis noen) blir slettet. Dette gjøres ved å bruke bitviseren og operatoren "&". Bittene 3, 4 og 5 blir tvunget til å være 0 mens de andre får være i sine tidligere verdier.
Deretter velges ønsket kanal ved å flytte kanalnummeret tre ganger og sette bitene ved hjelp av bitvisningen eller operatoren “-”.
ADCON0 - = kanal << 3; // Still inn de nødvendige bitene
3. Start ADC ved å gjøre Go / Done bit høyt: Når kanalen er valgt, må vi starte ADC-konverteringen ganske enkelt ved å gjøre GO_nDONE bit høy:
GO_nDONE = 1; // Initialiserer A / D-konvertering
4. Vent til Go / DONE-biten blir lav: GO / DONE-biten vil forbli høy til ADC-konverteringen er fullført, og derfor må vi vente til denne biten blir lav igjen. Dette kan gjøres ved å bruke en while- løkke.
mens (GO_nDONE); // Vent til A / D-konvertering er fullført
5. Få ADC-resultatet fra ADRESH- og ADRESL-registeret: Når Go / DONE-biten blir lav igjen, betyr det at ADC-konverteringen er fullført. Resultatet av ADC vil være en 10-biters verdi. Siden MCU-en vår er en 8-biters MCU, blir resultatet delt inn i øvre 8-bits og de nedre 2-bits. Det øvre 8-biters resultatet er lagret i registeret ADRESH og den nedre 2-bit er lagret i registeret ADRESL. Derfor må vi legge disse til i registre for å få vår 10-bit ADC-verdi. Dette resultatet returneres av funksjonen som vist nedenfor:
retur ((ADRESH << 8) + ADRESL); // Returnerer resultat
Den komplette funksjonen som brukes til å velge ADC-kanal, utløse ADC og returnere resultatet, vises her.
usignert int ADC_Read (usignert char-kanal) {ADCON0 & = 0x11000101; // Slette kanalvalgbitene ADCON0 - = kanal << 3; // Still inn de nødvendige bitene __forsink_ms (2); // Oppkjøpstid for å lade hold kondensator GO_nDONE = 1; // Initialiserer A / D-konvertering mens (GO_nDONE); // Vent til A / D-konvertering for å fullføre retur ((ADRESH << 8) + ADRESL); // Returnerer resultat}
Nå har vi en funksjon som tar kanalvalget som inngang og gir oss ADC-verdien. Derfor kan vi direkte kalle denne funksjonen i vår mens sløyfen, siden vi leser den analoge spenningen fra kanal 4 i denne opplæringen, vil funksjonssamtalen være som følger.
i = (ADC_Read (4)); // lagre resultatet av adc i “i”.
For å visualisere utdataene fra ADC-en vår, trenger vi en slags skjermmoduler som LCD eller 7-segmentet. I denne opplæringen bruker vi en 7-segment skjerm for å verifisere utdataene. Hvis du vil vite hvordan du bruker 7-segment med bilde, følg veiledningen her.
Den komplette koden er gitt nedenfor, og prosessen er også forklart i videoen til slutt.
Maskinvareoppsett og testing:
Som vanlig simulerer du koden ved hjelp av Proteus før du faktisk går med maskinvaren vår, og skjemaene for prosjektet er vist nedenfor:
Tilkoblinger av firesifret syv segment display modul med PIC mikrokontroller er de samme som forrige prosjekt, vi har nettopp lagt til et potensiometer til pinnen 7 som er den analoge kanalen 4. Ved å variere potten vil en variabel spenning bli sendt til MCU som vil bli lest av ADC-modulen og vises på 7-segment displaymodulen. Sjekk forrige opplæring for å lære mer om firesifret 7-segment skjerm og grensesnittet med PIC MCU.
Her har vi brukt det samme PIC Microcontroller-kortet som vi har laget i LED blinkende tutorial. Etter å ha sikret tilkobling, last opp programmet til PIC, og du bør se en utdata som dette
Her har vi lest ADC-verdien fra potten og konvertert den til den faktiske spenningen ved å kartlegge 0-1024-utgangen som 0-5 volt (som vist i programmet). Verdien vises deretter på 7-segmentet og bekreftes ved hjelp av multimeteret.
Det er det, nå er vi klare til å bruke alle de analoge sensorene som er tilgjengelige i markedet. Prøv dette, og hvis du har noen problemer som vanlig, bruk kommentarseksjonen, vil vi gjerne hjelpe deg.