विषयसूची:

PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच: 3 कदम
PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच: 3 कदम

वीडियो: PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच: 3 कदम

वीडियो: PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच: 3 कदम
वीडियो: Stepping Into the 16-bit World with the Microchip 16-bit PIC24F16KA102 Family Microcontroller 2024, नवंबर
Anonim
PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच
PIC16F886 माइक्रोकंट्रोलर के साथ कैपेसिटिव टच

इस ट्यूटोरियल में हम जानेंगे कि आप कैपेसिटेंस में अंतर का पता लगाने के लिए PIC16F886 माइक्रोकंट्रोलर का उपयोग कैसे कर सकते हैं, इसे बाद में यह बताने के लिए इस्तेमाल किया जा सकता है कि टच पैड दबाया जा रहा है या नहीं। इस प्रोजेक्ट को बनाने से पहले पिक माइक्रोकंट्रोलर्स से परिचित होना अच्छा है।

चरण 1: अपने सर्किट को तार दें

वायर अप योर सर्किट
वायर अप योर सर्किट

सबसे पहले, ऊपर दिए गए योजनाबद्ध के अनुसार सर्किट को वायरिंग करके शुरू करते हैं। टच पैड बनाने के लिए आप एल्युमिनियम फॉयल को एक चौकोर आकार में मोड़ सकते हैं और तार पर टेप लगा सकते हैं। आप 100k रोकनेवाला के लिए विभिन्न मूल्यों के साथ प्रयोग कर सकते हैं, मैंने पाया कि 100k ने मेरे लिए अच्छा काम किया है।

RC4 पिन का उपयोग मापी जाने वाली कैपेसिटेंस को चार्ज/डिस्चार्ज करना शुरू करने के लिए किया जाता है। C12IN0 एक आंतरिक तुलनित्र के - पक्ष से जुड़ा है और C1IN पिन उसी तुलनित्र के + पक्ष से जुड़ा है। जब C12IN0 वोल्टेज C1IN वोल्टेज से ऊपर पहुंच जाता है, तो माइक्रोकंट्रोलर कैपेसिटेंस को पूरी तरह से चार्ज के रूप में देखता है। प्रतिरोधक वोल्टेज विभक्त सुनिश्चित करता है कि C1IN 5 वोल्ट के करीब है।

चूंकि टच पैड आपके और सर्किट ग्राउंड के बीच एक महत्वपूर्ण समाई होने पर निर्भर करता है, इसलिए संभावना है कि बैटरी काम न करे।

चरण 2: हैडर फ़ाइल

हैडर फ़ाइल
हैडर फ़ाइल

सभी कनेक्शन के साथ समाप्त? अच्छा, हम हेडर फाइल के साथ आगे बढ़ेंगे। हम XC8 कंपाइलर का उपयोग करेंगे और जैसा कि शीर्षक से पता चलता है कि अब आप अपने प्रोजेक्ट में एक नई हेडर फाइल बनाएंगे और निम्नलिखित कोड को कॉपी-पेस्ट करेंगे। आप बिना किसी हेडर फ़ाइल के इसे अपने मुख्य कोड के ऊपर कॉपी-पेस्ट भी कर सकते हैं।

#define CALIBRATION_SAMPLE 20#परिभाषित करें TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

इंट काउंट;

इंट कैलिब्रेशनवैल्यू, मैक्सकैलिब्रेशनवैल्यू, मिनकैलिब्रेशनवैल्यू;

int getChargeTime () {

इंट टाइमरकाउंट = 0; इंट ओवरफ्लोकाउंट = 0; // डिस्चार्ज कैपेसिटेंस को RC4 = 0 मापा जाना है; _delay_ms(DISCHARGE_TIME); // "कैपेसिटर" को पूरी तरह से (लगभग पूरी तरह से वास्तव में) डिस्चार्ज करने के लिए पर्याप्त देरी दें // टाइमर ओवरफ्लो फ्लैग T0IF = 0 को साफ़ करें; // टाइमर के अतिप्रवाह के लिए प्रतीक्षा करें, 0 से गिनती शुरू करें जबकि (! T0IF); टी0आईएफ = 0; // RC4 = 1 को मापने के लिए कैपेसिटेंस चार्ज करना शुरू करें; // कैपेसिटेंस के लिए रेफरेंस वोल्टेज तक चार्ज होने की प्रतीक्षा करें जबकि (C1OUT) {timerCount = TMR0; अगर (T0IF) {ओवरफ्लोकाउंट ++; टी0आईएफ = 0; } } गिनती = (256 * ओवरफ्लोकाउंट) + टाइमरकाउंट; // रीसेट टाइमरकाउंट टाइमरकाउंट = 0; अतिप्रवाह गणना = 0; वापसी की गिनती; }

इंट टचिंग (इंट टॉलरेंस) {

// कई नमूनों का औसत दोगुना औसत = 0; for(int i = 0; i कैलिब्रेशनवैल्यू + टॉलरेंस) औसत++; } औसत /= TOUCH_SAMPLE; // औसत 0 और 1 के बीच की संख्या होगी यदि (औसत> 0.2) रिटर्न 1; वापसी 0; }

शून्य जांचना () {

इंट औसत = 0; int नमूने[CALIBRATION_SAMPLE]; // के लिए औसत मूल्य प्राप्त करें (int i = 0; i < CALIBRATION_SAMPLE; i ++) {नमूने = getChargeTime (); औसत + = नमूने ; } औसत /= CALIBRATION_SAMPLE; अंशांकन वैल्यू = औसत; // अधिकतम / न्यूनतम मान प्राप्त करें maxCalibrationValue = नमूने [0]; minCalibrationValue = नमूने [0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = नमूने ; अगर (नमूने < minCalibrationValue) minCalibrationValue = नमूने ; } }

शून्य सेटअप कैपेसिटिव टच () {

// आउटपुट के रूप में चार्ज/डिस्चार्ज पिन सेट करना, इस मामले में यह RC4 TRISCbits. TRISC4 = 0 है; // टाइमर सेट करना0 T0CS = 0; पीएसए = 1; // तुलनित्र की स्थापना C1CH0 = 0; C1CH1 = 0; सी1आर = 0; C1ON = 1; C1POL = 0; // क्लियरिंग काउंट वैल्यू काउंट = 0; // क्लियरिंग कैलिब्रेशन वैल्यू कैलिब्रेशन वैल्यू = 0; मैक्स कैलिब्रेशनवैल्यू = 0; न्यूनतम अंशांकन वैल्यू = 0; // स्टार्ट कैलिब्रेट पर कैलिब्रेशन चलाएं (); }

चरण 3: मुख्य कोड लिखना

मुख्य कोड से शुरू करते हुए, आपको पिछले चरण में बनाई गई हेडर फ़ाइल को शामिल करना होगा। निम्न कोड एक उदाहरण है कि आप स्विच के रूप में isTouching फ़ंक्शन का उपयोग कैसे कर सकते हैं। मेरे मामले में मैंने हेडर को कैपेसिटिव टच.एच नाम दिया है।

#शामिल

#शामिल "कैपेसिटिवटच.एच"

// यह चर बताता है कि बटन पहले से दबाया गया है या नहीं

इंट लास्टस्टेट = 0;

शून्य मुख्य () {

// RC5 को आउटपुट TRISCbits. TRISC5 = 0 के रूप में सेट करना; // आपको इस फ़ंक्शन को प्रोग्राम सेटअप कैपेसिटिवटच () की शुरुआत में कॉल करने की आवश्यकता है; _देरी_एमएस (1000); // अपने सटीक सेटअप कैलिब्रेट () के बाद कैलिब्रेट करें; जबकि (1) {// जांच कर रहा है कि बटन दबाया जा रहा है अगर (isTouching(15) && lastState == 0) {if (RC5) RC5 = 0; अन्य RC5 = 1; लास्टस्टेट = 1; } // जाँच कर रहा है कि क्या बटन जारी किया जा रहा है अगर (lastState == 1 &&! isTouching(15)) lastState = 0; _देरी_एमएस(20); } }

जांचना:

जब इस फ़ंक्शन को वेरिएबल कैलिब्रेशन वैल्यू कहा जाता है, तो अधिकतम कैलिब्रेशन वैल्यू और मिन कैलिब्रेशन वैल्यू अपडेट हो जाएंगे। कैलिब्रेशनवैल्यू का उपयोग isTouching फ़ंक्शन द्वारा किया जाता है। ध्यान रखें कि कैलिब्रेशन के दौरान टच पैड को अकेला छोड़ देना चाहिए।

सेटअप कैपेसिटिव टच:

आपके कार्यक्रम की शुरुआत में कॉल करने की आवश्यकता है। यह अन्य कार्यों द्वारा उपयोग किए जाने वाले आवश्यक बिट्स को सेट करता है। यह एक कैलिब्रेशन भी चलाता है। हालाँकि मुझे एक सेकंड प्रतीक्षा करके और फिर से अलग से कैलिब्रेशन चलाकर बेहतर परिणाम मिले।

छू रहा है:

यदि यह C12IN0 पर कैपेसिटेंस में वृद्धि का पता लगाता है तो यह फ़ंक्शन 1 लौटाता है और यदि कैपेसिटेंस कैलिब्रेशन के दौरान था तो कैपेसिटेंस के करीब होने पर 0 देता है। सीधे शब्दों में कहें, अगर कोई पैड को छूता है तो isTouching फ़ंक्शन 1 वापस आ जाएगा। फ़ंक्शन भी एक इनपुट के रूप में एक पैरामीटर चाहता है, यह ट्रिगर करने के लिए सहिष्णुता है। सहिष्णुता मूल्य जितना अधिक होता है, उतना ही कम संवेदनशील होता है। मेरे सेटअप में मैंने पाया कि 15 ने अच्छी तरह से काम किया है, लेकिन क्योंकि यह थरथरानवाला आवृत्ति पर निर्भर करता है और जब आप इसे दबाते हैं तो कितना समाई जोड़ा जाता है, आपको इस मूल्य के साथ प्रयोग करना चाहिए जब तक कि आपको कुछ ऐसा न मिल जाए जो आपके लिए काम करता हो।

चार्जटाइम प्राप्त करें:

जब आप जानना चाहते हैं कि सीवीआरईएफ वोल्टेज को कैपेसिटेंस चार्ज करने में कितना समय लगेगा, तो यह फ़ंक्शन इसका परीक्षण करेगा और एक पूर्णांक लौटाएगा। सेकंड में समय प्राप्त करने के लिए आप इस सूत्र का उपयोग करते हैं: (4 * getChargeTime) / थरथरानवाला आवृत्ति = चार्जटाइमइनसेकंड इस सूत्र का उपयोग isTouching फ़ंक्शन से सेकंड तक सहिष्णुता इनपुट प्राप्त करने के लिए भी किया जा सकता है।

सिफारिश की: