Dette er vores 9. tutorial om PIC-mikrocontrollere, der lærer MPLAB og XC8. Indtil nu har vi dækket mange grundlæggende tutorials som at komme i gang med MPLABX, LED blinker med PIC, Timere i PIC, interface LCD, interface 7-segment osv. Hvis du er en absolut nybegynder, kan du besøge den komplette liste over PIC-tutorials her og begynd at lære.
I denne vejledning lærer vi, hvordan du bruger ADC med vores PIC-mikrocontroller PICF877A. De fleste af Microcontroller-projekterne involverer en ADC (analog til digital konverter) i den, fordi den er en af de mest anvendte måder at læse data fra den virkelige verden på. Næsten alle sensorer som temperatursensor, fluxsensor, trykføler, strømfølere, spændingssensorer, gyroskoper, accelerometre, afstandssensor og næsten alle kendte sensorer eller transducere producerer en analog spænding på 0V til 5V baseret på sensorernes aflæsning. En temperatursensor kan f.eks. Afgive 2,1 V, når temperaturen er 25 ° C, og gå op til 4,7, når temperaturen er 60 ° C. For at kende temperaturen i den virkelige verden skal MCU bare læse udgangsspændingen for denne temperatursensor og relatere den til den virkelige verdens temperatur. Derfor er ADC et vigtigt arbejdsredskab til MCU-projekter og lader os lære, hvordan vi kan bruge det på vores PIC16F877A.
Se også vores tidligere artikler om brug af ADC i andre mikrocontrollere:
- Hvordan bruges ADC i Arduino Uno?
- Raspberry Pi ADC vejledning
- Interfacing ADC0808 med 8051 Microcontroller
ADC i PIC Microcontroller PIC16F877A:
Der er mange typer ADC til rådighed, og hver har sin egen hastighed og opløsning. De mest almindelige typer ADC'er er flash, successiv tilnærmelse og sigma-delta. Den type ADC, der anvendes i PIC16F877A, kaldes kort sagt den successive tilnærmelse ADC eller SAR. Så lad os lære lidt om SAR ADC, før vi begynder at bruge det.
Efterfølgende tilnærmelse ADC: SAR ADC fungerer ved hjælp af en komparator og nogle logiske samtaler. Denne type ADC bruger en referencespænding (som er variabel) og sammenligner indgangsspændingen med referencespændingen ved hjælp af en komparator, og forskellen, som vil være en digital udgang, gemmes fra den mest betydningsfulde bit (MSB). Sammenligningshastigheden afhænger af den urfrekvens (Fosc), som PIC'en fungerer på.
Nu hvor vi kender nogle grundlæggende om ADC, kan vi åbne vores datablad og lære at bruge ADC på vores PIC16F877A MCU. Den PIC, vi bruger, har 10-bit 8-kanals ADC. Dette betyder, at outputværdien af vores ADC vil være 0-1024 (2 ^ 10), og der er 8 ben (kanaler) på vores MCU, som kan læse analog spænding. Værdien 1024 opnås med 2 ^ 10, da vores ADC er 10 bit. De otte ben, der kan læse den analoge spænding, er nævnt i databladet. Lad os se på billedet nedenfor.
De analoge kanaler AN0 til AN7 er fremhævet for dig. Kun disse ben kan læse analog spænding. Så før vi læser en indgangsspænding, skal vi i vores kode angive, hvilken kanal der skal bruges til at aflæse indgangsspændingen. I denne vejledning bruger vi kanal 4 med et potentiometer til at læse den analoge spænding på denne kanal.
A / D-modulet har fire registre, der skal konfigureres til at læse data fra inputstifterne. Disse registre er:
• Højregister for A / D-resultat (ADRESH)
• Lavt register for A / D-resultat (ADRESL)
• A / D-kontrolregister 0 (ADCON0)
• A / D-kontrolregister 1 (ADCON1)
Programmering til ADC:
Det program for at bruge ADC med PIC Microcontroller er meget enkel, vi bare nødt til at forstå disse fire registre og derefter læse enhver analog spænding vil være enkel. Initialér som sædvanlig konfigurationsbitene, og lad os starte med det ugyldige main ().
Inde i det ugyldige hoved () skal vi initialisere vores ADC ved hjælp af ADCON1-registeret og ADCON0-registeret. ADCON0-registret har følgende bits:
I dette register skal vi tænde ADC-modulet ved at lave ADON = 1 og tænde A / D-konverteringsuret ved hjælp af bitene ADCS1 og ADCS0 bits, resten indstilles ikke for nu. I vores program er A / D-konverteringsuret valgt som Fosc / 16, du kan prøve dine egne frekvenser og se, hvordan resultatet ændres. Komplette detaljer tilgængelige på databladets side 127. Derfor initialiseres ADCON0 som følger.
ADCON0 = 0b01000001;
Nu har ADCON1-registret følgende bits:
I dette register skal vi lave A / D-resultatformat Vælg bit høj med ADFM = 1 og lave ADCS2 = 1 for at vælge Fosc / 16 igen. De andre bits forbliver nul, da vi har planlagt at bruge den interne referencespænding. Komplette detaljer tilgængelige på datablad side 128. Derfor sætter vi ADCON1 som følger.
ADCON1 = 0x11000000;
Efter initialisering af ADC-modulet i vores hovedfunktion, kan vi komme ind i while-sløjfen og begynde at læse ADC-værdierne. For at læse en ADC-værdi skal følgende trin følges.
- Initialiser ADC-modulet
- Vælg den analoge kanal
- Start ADC ved at gøre Go / Done lidt høj
- Vent på, at Go / DONE-biten bliver lav
- Få ADC-resultatet fra ADRESH- og ADRESL-registret
1. Initialiser ADC-modulet: Vi har allerede lært, hvordan man initialiserer en ADC, så vi kalder bare denne nedenstående funktion for at initialisere ADC
Den ugyldige ADC_Initialize () -funktion er som følger.
ugyldig ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON og Fosc / 16 er valgt ADCON1 = 0b11000000; // Intern referencespænding er valgt}
2. Vælg den analoge kanal: Nu skal vi vælge, hvilken kanal vi skal bruge til at læse ADC-værdien. Lad os lave en funktion til dette, så det bliver let for os at skifte mellem hver kanal inde i while- sløjfen.
usigneret int ADC_Read (usigneret char-kanal) {// **** Valg af kanal ** /// ADCON0 & = 0x11000101; // Rydning af kanalvalgbits ADCON0 - = kanal << 3; // Indstilling af de krævede bits // ** Kanalvalg er afsluttet *** ///}
Derefter modtages kanal, der skal vælges, inde i den variable kanal. I køen
ADCON0 & = 0x1100101;
Det forrige kanalvalg (hvis nogen) ryddes. Dette gøres ved hjælp af bitvisningen og operatoren "&". Bitene 3, 4 og 5 tvinges til at være 0, mens de andre overlades til at være i deres tidligere værdier.
Derefter vælges den ønskede kanal ved at venstre skifte kanalnummeret tre gange og indstille bitene ved hjælp af bitvisningen eller operatoren “-”.
ADCON0 - = kanal << 3; // Indstilling af de krævede bits
3. Start ADC ved at gøre Go / Done bit høj: Når kanalen er valgt, skal vi starte ADC-konverteringen ved blot at gøre GO_nDONE bit høj:
GO_nDONE = 1; // Initialiserer A / D-konvertering
4. Vent på, at Go / DONE-biten bliver lav: GO / DONE-biten forbliver høj, indtil ADC-konverteringen er afsluttet, hvorfor vi bliver nødt til at vente, indtil denne bit bliver lav igen. Dette kan gøres ved hjælp af en while- loop.
mens (GO_nDONE); // Vent på, at A / D-konvertering er afsluttet
5. Få ADC-resultatet fra ADRESH- og ADRESL-registeret: Når Go / DONE- biten bliver lav igen, betyder det, at ADC-konverteringen er fuldført. Resultatet af ADC vil være en 10-bit værdi. Da vores MCU er en 8-bit MCU, er resultatet opdelt i øvre 8-bit og den nederste 2-bit. Det øverste 8-bit resultat er gemt i registeret ADRESH, og det nederste 2-bit er gemt i registeret ADRESL. Derfor skal vi tilføje disse til registre for at få vores 10-bit ADC-værdi. Dette resultat returneres af funktionen som vist nedenfor:
retur ((ADRESH << 8) + ADRESL); // Returnerer resultat
Den komplette funktion, der bruges til at vælge ADC-kanal, udløse ADC og returnere resultatet, vises her.
usigneret int ADC_Read (usigneret char-kanal) {ADCON0 & = 0x11000101; // Rydning af kanalvalgbits ADCON0 - = kanal << 3; // Indstilling af de krævede bits __forsink_ms (2); // Anskaffelsestid for at oplade holdkondensator GO_nDONE = 1; // Initialiserer A / D-konvertering mens (GO_nDONE); // Vent på, at A / D-konvertering fuldender returneringen ((ADRESH << 8) + ADRESL); // Returnerer resultat}
Nu har vi en funktion, der tager kanalvalget som input og returnerer os ADC-værdien. Derfor kan vi direkte kalde denne funktion inde i vores mens løkke, da vi læser den analoge spænding fra kanal 4 i denne vejledning, vil funktionskaldet være som følger.
i = (ADC_Read (4)); // gemme resultatet af adc i “i”.
For at visualisere output fra vores ADC har vi brug for en slags skærmmoduler som LCD eller 7-segmentet. I denne vejledning bruger vi et 7-segment display til at verificere output. Hvis du vil vide, hvordan du bruger 7-segment med billede, skal du følge vejledningen her.
Den komplette kode er angivet nedenfor, og processen forklares også i videoen i slutningen.
Opsætning og test af hardware:
Som sædvanlig simulerer du koden ved hjælp af Proteus, før du faktisk går med vores hardware, skemaerne for projektet er vist nedenfor:
Forbindelser af 4-cifret syv segment display modul med PIC mikrocontroller er de samme som det foregående projekt, vi har netop tilføjet et potentiometer til pin 7, som er den analoge kanal 4. Ved at variere potten sendes en variabel spænding til MCU som læses af ADC-modulet og vises på 7-segment displaymodulet. Tjek den foregående vejledning for at lære mere om 4-cifret 7-segment display og dets grænseflade med PIC MCU.
Her har vi brugt det samme PIC Microcontroller-kort, som vi har oprettet i LED-blinkende vejledning. Efter at have sikret forbindelse, skal du uploade programmet til PIC, og du skal se en output som denne
Her har vi læst ADC-værdien fra potten og konverteret den til den faktiske spænding ved at kortlægge 0-1024-udgangen som 0-5 volt (som vist i programmet). Værdien vises derefter på 7-segmentet og verificeres ved hjælp af multimeteret.
Det er det, nu er vi klar til at bruge alle de analoge sensorer, der er tilgængelige på markedet. Gå videre og prøv dette, og hvis du som normalt har problemer med at bruge kommentarsektionen, hjælper vi dig gerne.