Ito ang aming ika-9 na tutorial ng Pag- aaral ng mga microcontroller ng PIC gamit ang MPLAB at XC8. Hanggang ngayon, natakpan namin ang maraming pangunahing tutorial tulad ng pagsisimula sa MPLABX, LED blinking with PIC, Timers in PIC, interfacing LCD, interfacing 7-segment etc. Kung ikaw ay isang ganap na nagsisimula, mangyaring bisitahin ang kumpletong listahan ng mga tutorial sa PIC dito at simulang matuto.
Sa tutorial na ito, matututunan natin Paano Gumamit ng ADC sa aming PIC microcontroller PICF877A. Karamihan sa mga proyekto ng Microcontroller ay magsasangkot ng isang ADC (Analog to Digital converter) dito, sapagkat ito ay isa sa mga pinaka ginagamit na paraan upang mabasa ang data mula sa totoong mundo. Halos lahat ng mga sensor tulad ng sensor ng temperatura, sensor ng pagkilos ng bagay, sensor ng presyon, kasalukuyang sensor, boltahe sensor, gyroscope, accelerometers, distansya sensor, at halos lahat ng kilalang sensor o transducer ay gumagawa ng isang analog boltahe na 0V hanggang 5V batay sa pagbabasa ng mga sensor. Halimbawa, ang isang sensor ng temperatura ay maaaring magbigay ng 2.1V kapag ang temperatura ay 25C at umakyat sa 4.7 kapag ang temperatura ay 60C. Upang malaman ang temperatura ng totoong mundo, kailangang basahin lamang ng MCU ang output boltahe ng sensor ng temperatura na ito at iugnay ito sa tunay na temperatura ng mundo. Samakatuwid ang ADC ay isang mahalagang tool sa trabaho para sa mga proyekto ng MCU at hinayaan malaman kung paano natin ito magagamit sa aming PIC16F877A.
Suriin din ang aming nakaraang mga artikulo sa paggamit ng ADC sa iba pang mga microcontroller:
- Paano Gumamit ng ADC sa Arduino Uno?
- Tutorial ng Raspberry Pi ADC
- Ang interfacing ADC0808 sa 8051 Microcontroller
ADC sa PIC Microcontroller PIC16F877A:
Maraming mga uri ng ADC na magagamit at ang bawat isa ay may sariling bilis at resolusyon. Ang pinakakaraniwang uri ng mga ADC ay ang flash, sunud-sunod na approximation, at sigma-delta. Ang uri ng ADC na ginamit sa PIC16F877A ay tinawag bilang Sunud-sunod na approximation na ADC o SAR sa maikling salita. Kaya't alamin muna natin ang tungkol sa SAR ADC bago natin simulang gamitin ito.
Sunud-sunod na Pagtatantya ADC: Gumagana ang SAR ADC sa tulong ng isang kumpara at ilang mga pag-uusap sa lohika. Ang ganitong uri ng ADC ay gumagamit ng isang sanggunian boltahe (na kung saan ay variable) at ihinahambing ang input boltahe sa sanggunian boltahe gamit ang isang kumpara at pagkakaiba, na kung saan ay isang digital output, ay nai-save mula sa Pinaka-makabuluhang bit (MSB). Ang bilis ng paghahambing ay nakasalalay sa dalas ng Clock (Fosc) kung saan gumagana ang PIC.
Ngayon alam na namin ang ilang mga pangunahing kaalaman sa ADC, hinahayaan na buksan ang aming datasheet at malaman kung paano gamitin ang ADC sa aming PIC16F877A MCU. Ang PIC na ginagamit namin ay may 10-bit 8-channel ADC. Nangangahulugan ito na ang halaga ng output ng aming ADC ay magiging 0-1024 (2 ^ 10) at mayroong 8 mga pin (channel) sa aming MCU na maaaring mabasa ang analog boltahe. Ang halagang 1024 ay nakuha ng 2 ^ 10 dahil ang aming ADC ay 10 bit. Ang walong mga pin na maaaring basahin ang boltahe ng analog ay nabanggit sa datasheet. Hayaan tingnan ang larawan sa ibaba.
Ang mga analog na channel na AN0 hanggang AN7 ay naka-highlight para sa iyo. Ang mga pin lamang na ito ang makakabasa ng boltahe ng analog. Kaya bago basahin ang isang boltahe ng pag-input kailangan nating tukuyin sa aming code kung aling channel ang dapat gamitin upang mabasa ang boltahe ng pag-input. Sa tutorial na ito gagamitin namin ang channel 4 na may potensyomiter upang mabasa ang analog boltahe sa channel na ito.
Ang module na A / D ay mayroong apat na rehistro na kailangang mai-configure upang mabasa ang data mula sa mga pin ng Input. Ang mga rehistro na ito ay:
• Mataas na Rehistro ng A / D na Resulta (ADRESH)
• Mababang Rehistro ng A / D Resulta (ADRESL)
• A / D Control Rehistro 0 (ADCON0)
• A / D Control Rehistro 1 (ADCON1)
Programming para sa ADC:
Ang programa para sa paggamit ng ADC na may PIC Microcontroller ay napaka-simple, kailangan lang nating maunawaan ang apat na rehistro at pagkatapos ay basahin ang anumang analog boltahe ay magiging simple. Tulad ng karaniwang ipasimuno ang mga bit ng pagsasaayos at magsimula tayo sa walang bisa na pangunahing ().
Sa loob ng void main () kailangan nating simulan ang aming ADC sa pamamagitan ng paggamit ng ADCON1 register at ADCON0 register. Ang rehistro ng ADCON0 ay may mga sumusunod na piraso:
Sa rehistro na ito kailangan nating buksan ang module ng ADC sa pamamagitan ng paggawa ng ADON = 1 at i-on ang A / D Conversion Clock sa pamamagitan ng paggamit ng mga bit na ADCS1 at ADCS0 bit, ang natitira ay hindi maitatakda para sa ngayon. Sa aming programa ang orasan ng A / D na conversion ay napili bilang Fosc / 16 maaari mong subukan ang iyong sariling mga frequency at makita kung paano nagbabago ang resulta. Kumpletuhin ang mga detalyeng magagamit sa pahina ng datasheet 127. Samakatuwid ang ADCON0 ay isisimulan bilang mga sumusunod.
ADCON0 = 0b01000001;
Ngayon ang rehistro ng ADCON1 ay may mga sumusunod na piraso:
Sa rehistro na ito kailangan naming gumawa ng A / D Result Format Piliin ang medyo mataas ng ADFM = 1 at gawin ang ADCS2 = 1 upang piliin muli ang Fosc / 16. Ang iba pang mga piraso ay mananatiling zero habang pinaplano naming gamitin ang panloob na boltahe ng sanggunian. Kumpletuhin ang mga detalyeng magagamit sa pahina ng datasheet 128. Samakatuwid ang ADCON1 ay itatakda namin bilang mga sumusunod.
ADCON1 = 0x11000000;
Ngayon pagkatapos ng pagsisimula ng ADC module sa loob ng aming pangunahing pag-andar, hinayaan ang loop habang nagsimulang basahin ang mga halaga ng ADC. Upang mabasa ang halagang ADC ang mga sumusunod na hakbang ay dapat sundin.
- Simulan ang Module ng ADC
- Piliin ang analog channel
- Simulan ang ADC sa pamamagitan ng paggawa ng Go / Tapos na medyo mataas
- Maghintay para sa Go / TAPOS na bit upang makakuha ng mababa
- Kunin ang resulta ng ADC mula sa rehistro ng ADRESH at ADRESL
1. Simulan ang Module ng ADC: Nalaman na namin kung paano simulan ang isang ADC kaya tinawag lang namin ito sa ibaba na pag-andar upang simulan ang ADC
Ang walang bisa na pagpapaandar ng ADC_Initialize () ay ang mga sumusunod.
walang bisa ang ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON at Fosc / 16 ay napili ADCON1 = 0b11000000; // Napili ang panloob na boltahe ng sanggunian}
2. Piliin ang analog channel: Ngayon kailangan nating pumili kung aling channel ang gagamitin namin upang mabasa ang halaga ng ADC. Hinahayaan kang gumawa ng isang pagpapaandar para dito, upang madali para sa amin na lumipat sa pagitan ng bawat channel sa loob ng habang loop.
unsigned int ADC_Read (unsigned char channel) {// **** Pagpili ng channel ** /// ADCON0 & = 0x11000101; // Clearing the Channel Selection Bits ADCON0 - = channel << 3; // Pagtatakda ng kinakailangang Mga Bits // ** Kumpleto ang pagpili ng Channel *** ///}
Pagkatapos ang mapipiling channel ay natanggap sa loob ng variable channel. Sa linya
ADCON0 & = 0x1100101;
Ang nakaraang pagpili ng channel (kung mayroon man) ay na-clear. Ginagawa ito sa pamamagitan ng paggamit ng bitwise at operator na "&". Ang mga piraso na 3, 4 at 5 ay pinilit na maging 0 habang ang iba ay naiwan na maging sa kanilang dating mga halaga.
Pagkatapos ang ninanais na channel ay napili ng kaliwang paglilipat ng numero ng channel ng tatlong beses at pagtatakda ng mga piraso gamit ang bitwise o operator na "-".
ADCON0 - = channel << 3; // Pagtatakda ng mga kinakailangang Bits
3. Simulan ang ADC sa pamamagitan ng paggawa ng Go / Tapos na medyo mataas: Kapag napili ang channel kailangan naming simulan ang ADC conversion sa pamamagitan lamang ng paggawa ng GO_nDONE na medyo mataas:
GO_nDONE = 1; // Pinasimulan ang A / D Conversion
4. Maghintay para sa Go / TAPOS na bit upang makakuha ng mababa: Ang GO / DONE bit ay mananatiling mataas hanggang ang ADC conversion ay nakumpleto, samakatuwid kailangan nating maghintay hanggang sa ang bit na ito ay bumaba muli. Maaari itong magawa sa pamamagitan ng paggamit ng isang habang loop.
habang (GO_nDONE); // Hintaying makumpleto ang A / D Conversion
5. Kunin ang resulta ng ADC mula sa ADRESH at ADRESL register: Kapag ang Go / DONE bit ay naging mababa muli nangangahulugan ito na ang pag-convert ng ADC ay kumpleto na. Ang resulta ng ADC ay magiging isang 10-bit na halaga. Dahil ang aming MCU ay isang 8-bit MCU ang resulta ay nahahati sa itaas na 8-bit at sa mas mababang 2-bits. Ang itaas na 8-bit na resulta ay nakaimbak sa rehistro na ADRESH at ang mas mababang 2-bit ay nakaimbak sa rehistro na ADRESL. Samakatuwid kailangan nating idagdag ang mga ito sa mga rehistro upang makuha ang aming 10-bit na halaga ng ADC. Ang resulta na ito ay naibalik ng pagpapaandar tulad ng ipinakita sa ibaba:
bumalik ((ADRESH << 8) + ADRESL); // Returns Resulta
Ang kumpletong pag-andar na ginagamit upang piliin ang ADC channel, i-trigger ang ADC at ibalik ang resulta ay ipinakita dito.
unsigned int ADC_Read (unsigned char channel) {ADCON0 & = 0x11000101; // Clearing the Channel Selection Bits ADCON0 - = channel << 3; // Pagtatakda ng mga kinakailangang Bits __delay_ms (2); // Oras ng acquisition upang singilin ang hold capacitor GO_nDONE = 1; // Pinasimulan ang A / D Conversion habang (GO_nDONE); // Maghintay para sa A / D Conversion upang makumpleto ang pagbabalik ((ADRESH << 8) + ADRESL); // Returns Result}
Ngayon ay mayroon kaming isang pagpapaandar na kukuha ng pagpipilian ng channel bilang input at ibalik sa amin ang halaga ng ADC. Samakatuwid maaari naming direktang tawagan ang pagpapaandar na ito sa loob ng aming habang loop, dahil binabasa namin ang analog boltahe mula sa channel 4 sa tutorial na ito, ang tawag na function ay ang mga sumusunod.
i = (ADC_Read (4)); // iimbak ang resulta ng adc sa “i”.
Upang mailarawan ang output ng aming ADC kakailanganin namin ang ilang uri ng mga module ng pagpapakita tulad ng LCD o ng 7-segment. Sa tutorial na ito gumagamit kami ng isang 7-segment na display upang ma-verify ang output. Kung nais mong malaman kung paano gamitin ang 7-segment na may pic sundin ang tutorial dito.
Ang kumpletong code ay ibinibigay sa ibaba at ang proseso ay ipinaliwanag din sa Video sa dulo.
Pag-setup at Pagsubok ng Hardware:
Tulad ng dati ay gayahin ang code gamit ang Proteus bago talaga pumunta sa aming hardware, ang mga iskema ng proyekto ay ipinapakita sa ibaba:
Ang mga koneksyon ng 4-digit na pitong segment na display module na may PIC microcontroller ay kapareho ng nakaraang proyekto, nagdagdag lamang kami ng isang potensyomiter sa pin 7 na kung saan ay ang analog channel 4. Sa pamamagitan ng pag-iiba ng palayok, isang variable na boltahe ay ipapadala sa MCU na mababasa ng module ng ADC at ipapakita sa 7-segment na Modyul ng pagpapakita. Suriin ang nakaraang tutorial upang matuto nang higit pa tungkol sa 4-digit na 7-segment na pagpapakita at ang interfacing nito sa PIC MCU.
Dito ginamit namin ang parehong board ng PIC Microcontroller na nilikha namin sa LED blinking Tutorial. Matapos matiyak ang koneksyon i-upload ang programa sa PIC at dapat mong makita ang isang output na tulad nito
Nabasa natin dito ang halaga ng ADC mula sa palayok at na-convert ito sa aktwal na boltahe sa pamamagitan ng pagmamapa ng 0-1024 output bilang 0-5 volts (tulad ng ipinakita sa programa). Pagkatapos ay ipinakita ang halaga sa 7-segment at na-verify gamit ang multimeter.
Iyon iyon, handa na kaming gamitin ang lahat ng mga Analog Sensor na magagamit sa merkado, magpatuloy at subukan ito at kung mayroon kang anumang mga problema tulad ng dati gamitin ang seksyon ng komento, malulugod kaming tulungan ka.