यह MPLAB और XC8 का उपयोग करते हुए PIC PIC माइक्रोकंट्रोलर्स सीखने का हमारा 9 वां ट्यूटोरियल है । अब तक, हमने कई मूल ट्यूटोरियल को कवर किया है जैसे कि MPLABX के साथ शुरुआत करना, PIC के साथ एलईडी ब्लिंक करना, PIC में टाइमर, एलसीडी को इंटरफेज करना, 7-सेगमेंट को इंटरफेज करना आदि। यदि आप एक पूर्ण शुरुआत हैं, तो कृपया यहां पर PIC ट्यूटोरियल की पूरी सूची देखें और सीखना शुरू करें।
इस ट्यूटोरियल में, हम सीखेंगे कि अपने PIC माइक्रोकंट्रोलर PICF877A के साथ ADC का उपयोग कैसे करें। अधिकांश माइक्रोकंट्रोलर परियोजनाओं में एक एडीसी (एनालॉग से डिजिटल कनवर्टर) शामिल होगा, क्योंकि यह वास्तविक दुनिया से डेटा पढ़ने के लिए सबसे अधिक इस्तेमाल किया जाने वाला तरीका है। लगभग सभी सेंसर जैसे तापमान सेंसर, फ्लक्स सेंसर, प्रेशर सेंसर, करंट सेंसर, वोल्टेज सेंसर, जायरोस्कोप, एक्सेलेरोमीटर, डिस्टेंस सेंसर और लगभग हर ज्ञात सेंसर या ट्रांसड्यूसर सेंसर रीडिंग के आधार पर 0V से 5V के अनुरूप वोल्टेज का उत्पादन करता है। उदाहरण के लिए एक तापमान संवेदक 2.1V दे सकता है जब तापमान 25C होता है और तापमान 60C होने पर 4.7 तक जाता है। वास्तविक दुनिया के तापमान को जानने के लिए, MCU को बस इस तापमान संवेदक के आउटपुट वोल्टेज को पढ़ना है और इसे वास्तविक दुनिया के तापमान से संबंधित करना है। इसलिए ADC MCU परियोजनाओं के लिए एक महत्वपूर्ण कार्य उपकरण है और हम इसे अपने PIC16F877A पर उपयोग कर सकते हैं।
अन्य माइक्रोकंट्रोलर में ADC का उपयोग करने पर हमारे पिछले लेखों की भी जाँच करें:
- Arduino Uno में ADC का उपयोग कैसे करें?
- रास्पबेरी पाई एडीसी ट्यूटोरियल
- 8051 माइक्रोकंट्रोलर के साथ ADC0808 को इंटरफैस करना
PIC माइक्रोकंट्रोलर PIC16F877A में ADC:
कई प्रकार के एडीसी उपलब्ध हैं और हर एक की अपनी गति और संकल्प है। सबसे सामान्य प्रकार के एडीसी फ्लैश, क्रमिक सन्निकटन और सिग्मा-डेल्टा हैं। PIC16F877A में इस्तेमाल एडीसी के प्रकार के लगातार सन्निकटन एडीसी के रूप में कहा जाता है या संक्षेप में एसएआर। तो चलिए SAR ADC के बारे में थोड़ा सीख लेते हैं इससे पहले कि हम इसका इस्तेमाल करना शुरू करें।
क्रमिक स्वीकृति एडीसी: एसएआर एडीसी एक तुलनित्र और कुछ तर्क वार्तालापों की मदद से काम करता है। इस प्रकार के एडीसी एक संदर्भ वोल्टेज (जो परिवर्तनशील है) का उपयोग करता है और एक तुलनित्र और अंतर का उपयोग करके संदर्भ वोल्टेज के साथ इनपुट वोल्टेज की तुलना करता है, जो एक डिजिटल आउटपुट होगा, सबसे महत्वपूर्ण बिट (MSB) से बचाया जाता है। तुलना की गति क्लॉक फ़्रीक्वेंसी (फ़ोकस) पर निर्भर करती है, जिस पर PIC चल रही है।
अब जब हम ADC के बारे में कुछ मूल बातें जानते हैं, तो हमारी डेटाशीट को खोलते हैं और सीखते हैं कि ADC का उपयोग हमारे PIC16F877V MCU पर कैसे करें। हम जिस PIC का उपयोग कर रहे हैं, उसमें 10-बिट 8-चैनल ADC है। इसका अर्थ है कि हमारे ADC का आउटपुट मान 0-1024 (2 ^ 10) होगा और हमारे MCU पर 8 पिन (चैनल) हैं जो एनालॉग वोल्टेज पढ़ सकते हैं। 1024 से मान 2 ^ 10 से प्राप्त होता है क्योंकि हमारा ADC 10 बिट है। आठ पिन जो एनालॉग वोल्टेज पढ़ सकते हैं, उनका उल्लेख डेटशीट में किया गया है। नीचे दी गई तस्वीर को देखें।
एनालॉग चैनल AN0 से AN7 आपके लिए हाइलाइट किए गए हैं। केवल ये पिन एनालॉग वोल्टेज को पढ़ने में सक्षम होंगे। इसलिए इनपुट वोल्टेज पढ़ने से पहले हमें अपने कोड में बताना होगा कि इनपुट वोल्टेज को पढ़ने के लिए किस चैनल का उपयोग किया जाना है। इस ट्यूटोरियल में हम चैनल पर एनालॉग वोल्टेज को पढ़ने के लिए एक पोटेंशियोमीटर के साथ चैनल 4 का उपयोग करेंगे।
ए / डी मॉड्यूल में चार रजिस्टर हैं जिन्हें इनपुट पिन से डेटा पढ़ने के लिए कॉन्फ़िगर किया जाना है। ये रजिस्टर हैं:
• ए / डी परिणाम उच्च रजिस्टर (ADRESH)
• ए / डी परिणाम कम रजिस्टर (ADRESL)
• ए / डी नियंत्रण रजिस्टर 0 (ADCON0)
• ए / डी नियंत्रण रजिस्टर 1 (ADCON1)
ADC के लिए प्रोग्रामिंग:
PIC माइक्रोकंट्रोलर के साथ एडीसी का उपयोग करने का कार्यक्रम बहुत सरल है, हमें बस इन चार रजिस्टरों को समझना होगा और फिर किसी भी एनालॉग वोल्टेज को पढ़ना सरल होगा। हमेशा की तरह कॉन्फ़िगरेशन बिट्स को इनिशियलाइज़ करें और आइए void main () से शुरू करें।
शून्य मुख्य () के अंदर हमें ADCON1 रजिस्टर और ADCON0 रजिस्टर का उपयोग करके अपने ADC को इनिशियलाइज़ करना है । ADCON0 रजिस्टर में निम्न बिट्स हैं:
इस रजिस्टर में हमें ADC = 1 बनाकर ADC मॉड्यूल को चालू करना होगा और ADCS1 और ADCS0 बिट्स का उपयोग करके A / D रूपांतरण घड़ी को चालू करना होगा, बाकी अभी सेट नहीं होंगे। हमारे कार्यक्रम में ए / डी रूपांतरण घड़ी को फ़ॉस्क / 16 के रूप में चुना गया है आप अपनी स्वयं की आवृत्तियों को आज़मा सकते हैं और देख सकते हैं कि परिणाम कैसे बदलता है। डेटशीट के पेज 127 पर उपलब्ध संपूर्ण विवरण। इसलिए ADCON0 को इस प्रकार आरंभ किया जाएगा।
ADCON0 = 0b01000001;
अब ADCON1 रजिस्टर में निम्न बिट्स हैं:
इस रजिस्टर में हमें ADFM = 1 द्वारा A / D रिजल्ट फॉर्मेट सेलेक्ट बिट को उच्च बनाना है और FCS / 16 को फिर से चुनने के लिए ADCS2 = 1 बनाना है। आंतरिक संदर्भ वोल्टेज का उपयोग करने की योजना के रूप में अन्य बिट्स शून्य बने हुए हैं। संपूर्ण विवरण डेटाशीट पेज 128 पर उपलब्ध है। इसलिए ADCON1 हम निम्नानुसार सेट करेंगे।
ADCON1 = 0x11000000;
अब ADC मॉड्यूल को हमारे मुख्य फंक्शन के अंदर इनिशियलाइज़ करने के बाद, लूप में आते हैं और ADC मान पढ़ना शुरू करते हैं। ADC मान पढ़ने के लिए निम्न चरणों का पालन करना होगा ।
- एडीसी मॉड्यूल को प्रारंभ करें
- एनालॉग चैनल का चयन करें
- गो / डन को थोड़ा ऊँचा बनाकर ADC शुरू करें
- कम पाने के लिए गो / पूर्ण के लिए प्रतीक्षा करें
- ADRESH और ADRESL रजिस्टर से ADC परिणाम प्राप्त करें
1. ADC मॉड्यूल को इनिशियलाइज़ करें: हम पहले से ही सीख चुके हैं कि ADC को इनिशियलाइज़ कैसे किया जाता है इसलिए हम इसे फंक्शन के नीचे कहते हैं।
शून्य ADC_Initialize () समारोह इस प्रकार है।
शून्य ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON और Fosc / 16 को ADCON1 = 0b11000000 चुना गया है; // आंतरिक संदर्भ वोल्टेज चयनित है}
2. एनालॉग चैनल का चयन करें: अब हमें ADC मान को पढ़ने के लिए किस चैनल का उपयोग करना है। इस के लिए एक समारोह बनाने के लिए, इतना है कि यह आसान हमारे भीतर प्रत्येक चैनल के बीच शिफ्ट करने के लिए किया जाएगा की सुविधा देता है , जबकि पाश।
अहस्ताक्षरित int ADC_Read (अहस्ताक्षरित चार चैनल) {// **** चैनल का चयन ** /// ADCON0 & = 0x11000101; // चैनल चयन बिट्स साफ़ करना ADCON0 - = चैनल << 3; // आवश्यक बिट्स सेट करना // ** चैनल चयन पूरा *** ///}
फिर चुने जाने वाले चैनल को चर चैनल के अंदर प्राप्त किया जाता है। कतार में
ADCON0 & = 0x1100101;
पिछला चैनल चयन (यदि कोई हो) को मंजूरी दे दी गई है। यह बिटवाइज़ और ऑपरेटर “&” का उपयोग करके किया जाता है। बिट्स 3, 4 और 5 को 0 होने के लिए मजबूर किया जाता है जबकि अन्य को उनके पिछले मूल्यों में छोड़ दिया जाता है।
फिर वांछित चैनल को चैनल नंबर को तीन बार शिफ्ट करके और बिटवाइज या ऑपरेटर "-" का उपयोग करके बिट्स सेट करके चुना जाता है।
ADCON0 - = चैनल << 3; // आवश्यक बिट्स की स्थापना
3. ADC को गो / डन बिट उच्च बनाकर प्रारंभ करें: एक बार चैनल चुने जाने के बाद हमें ADC रूपांतरण को केवल GO_nDONE को उच्च बनाकर शुरू करना होगा:
GO_nDONE = 1; // प्रारंभिक ए / डी रूपांतरण
4. कम पाने के लिए Go / Done बिट का इंतज़ार करें: ADC कनवर्ज़न पूरा होने तक GO / DONE बिट अधिक रहेगा, इसलिए हमें इस बिट के फिर से कम होने तक इंतज़ार करना होगा। यह थोड़ी देर लूप का उपयोग करके किया जा सकता है ।
जबकि (GO_nDONE); // A / D रूपांतरण पूरा होने तक प्रतीक्षा करें
5. ADRESH और ADRESL रजिस्टर से ADC परिणाम प्राप्त करें: जब गो / पूर्ण बिट कम हो जाता है तो इसका अर्थ है कि ADC रूपांतरण पूर्ण है। ADC का परिणाम 10-बिट मान होगा। चूंकि हमारा MCU एक 8-बिट MCU है, इसलिए परिणाम ऊपरी 8-बिट और निचले 2-बिट में विभाजित है। ऊपरी 8-बिट परिणाम रजिस्टर ADRESH में संग्रहीत किया जाता है और निचला 2-बिट रजिस्टर ADRESL में संग्रहीत किया जाता है। इसलिए हमें अपने 10-बिट एडीसी मूल्य प्राप्त करने के लिए इन्हें रजिस्टर में जोड़ना होगा। यह परिणाम फ़ंक्शन द्वारा वापस दिखाया गया है:
वापसी (ADRESH << 8) + ADRESL); // परिणाम देता है
पूर्ण फ़ंक्शन जो ADC चैनल का चयन करने के लिए उपयोग किया जाता है, ADC को ट्रिगर करता है और परिणाम वापस करता है यहां दिखाया गया है।
अहस्ताक्षरित int ADC_Read (अहस्ताक्षरित चार चैनल) {ADCON0 & = 0x11000101; // चैनल चयन बिट्स साफ़ करना ADCON0 - = चैनल << 3; // आवश्यक बिट्स सेट करना __delay_ms (2); // कैपेसिटर GO_nDONE = 1 को चार्ज करने का अधिग्रहण समय; // प्रारंभ में A / D रूपांतरण करता है (GO_nDONE); // वापसी के लिए ए / डी रूपांतरण के लिए प्रतीक्षा करें ((ADRESH << 8) + ADRESL); // परिणाम देता है}
अब हमारे पास एक फ़ंक्शन है जो चैनल चयन को इनपुट के रूप में लेगा और हमें ADC मान लौटाएगा। इसलिए हम सीधे हमारे अंदर इस समारोह कॉल कर सकते हैं , जबकि , पाश के बाद से हम इस ट्यूटोरियल में चैनल 4 से एनालॉग वोल्टेज पढ़ रहे हैं, समारोह कॉल के रूप में इस प्रकार किया जाएगा।
i = (ADC_Read (4)); // "i" में adc के परिणाम को स्टोर करें।
हमारे एडीसी के आउटपुट की कल्पना करने के लिए हमें एलसीडी या 7-सेगमेंट जैसे किसी प्रकार के डिस्प्ले मॉड्यूल की आवश्यकता होगी। इस ट्यूटोरियल में हम आउटपुट को सत्यापित करने के लिए 7-सेगमेंट डिस्प्ले का उपयोग कर रहे हैं। यदि आप जानना चाहते हैं कि 7-सेगमेंट का उपयोग कैसे करें, तो यहां दिए गए ट्यूटोरियल को फॉलो करें।
पूरा कोड नीचे दी गई है और इस प्रक्रिया को भी समझाया गया है वीडियो के अंत में।
हार्डवेयर सेटअप और परीक्षण:
हमेशा हमारे हार्डवेयर के साथ जाने से पहले प्रोटीन का उपयोग करते हुए कोड का अनुकरण करते हुए, परियोजना की योजनाएं नीचे दी गई हैं:
PIC माइक्रोकंट्रोलर के साथ 4-अंकीय सात सेगमेंट डिस्प्ले मॉड्यूल के कनेक्शन पिछले प्रोजेक्ट के समान हैं, हमने अभी पिन 7 में एक पोटेंशियोमीटर जोड़ा है जो एनालॉग चैनल 4 है। पॉट को अलग करके, एक चर वोल्टेज MCU को भेजा जाएगा जो एडीसी मॉड्यूल द्वारा पढ़ा जाएगा और 7-खंड प्रदर्शन मॉड्यूल पर प्रदर्शित किया जाएगा। 4-अंक 7-खंड प्रदर्शन और PIC MCU के साथ इसके इंटरफेस के बारे में अधिक जानने के लिए पिछले ट्यूटोरियल की जाँच करें।
यहां हमने उसी PIC माइक्रोकंट्रोलर बोर्ड का उपयोग किया है जिसे हमने LED ब्लिंकिंग ट्यूटोरियल में बनाया है। कनेक्शन सुनिश्चित करने के बाद प्रोग्राम को PIC में अपलोड करें और आपको इस तरह आउटपुट देखना चाहिए
यहाँ हमने पॉट से ADC मान पढ़ा है और इसे 0-5 वोल्ट (प्रोग्राम में दिखाया गया है) के रूप में 0-1024 आउटपुट मैप करके वास्तविक वोल्टेज में परिवर्तित कर दिया है। फिर मान 7-खंड पर प्रदर्शित किया जाता है और मल्टीमीटर का उपयोग करके सत्यापित किया जाता है।
यही कारण है, अब हम बाजार में उपलब्ध सभी एनालॉग सेंसर का उपयोग करने के लिए तैयार हैं, आगे बढ़ो और इसे आज़माएं और यदि आपको टिप्पणी अनुभाग का सामान्य रूप से उपयोग करने में कोई समस्या है, तो हमें आपकी मदद करने में खुशी होगी।