اللمس بالسعة مع متحكم PIC16F886: 3 خطوات
اللمس بالسعة مع متحكم PIC16F886: 3 خطوات
Anonim
اللمس بالسعة مع متحكم PIC16F886
اللمس بالسعة مع متحكم PIC16F886

في هذا البرنامج التعليمي سوف نستعرض كيف يمكنك استخدام متحكم PIC16F886 لاكتشاف الفروق في السعة ، ويمكن استخدام هذا لاحقًا لمعرفة ما إذا كان يتم الضغط على لوحة اللمس. من الجيد أن تكون على دراية بالميكروكونترولر الموافقة المسبقة عن علم قبل القيام بهذا المشروع.

الخطوة 1: اربط دائرتك

اربط دائرتك
اربط دائرتك

أولاً ، لنبدأ بتوصيل الأسلاك بالدائرة وفقًا للتخطيط أعلاه. لصنع لوحة اللمس ، يمكنك طي ورق الألمنيوم في مربع وشريط لاصق على سلك. يمكنك تجربة قيم مختلفة للمقاوم 100 كيلو ، وجدت أن 100 كيلو تعمل بشكل جيد بالنسبة لي.

يتم استخدام دبوس RC4 لبدء شحن / تفريغ السعة المراد قياسها. يتم توصيل C12IN0 بالجانب - من المقارنة الداخلية ويتم توصيل دبوس C1IN بالجانب + من نفس المقارنة. يرى المتحكم الدقيق أن السعة مشحونة بالكامل عندما يصل جهد C12IN0 إلى أعلى من جهد C1IN. يتأكد مقسم الجهد المقاوم من أن C1IN قريب من 5 فولت.

نظرًا لأن لوحة اللمس تعتمد على وجود سعة كبيرة بينك وبين أرضية الدائرة ، فهناك احتمال أن البطارية قد لا تعمل.

الخطوة 2: ملف الرأس

ملف الرأس
ملف الرأس

هل انتهيت من جميع الاتصالات؟ حسنًا ، سننتقل إلى ملف الرأس. سنستخدم مترجم XC8 وكما يوحي العنوان ، يجب عليك الآن إنشاء ملف رأس جديد في مشروعك ونسخ الكود التالي ولصقه. يمكنك أيضًا نسخه ولصقه أعلى الكود الرئيسي دون أي ملف رأس.

#define CALIBRATION_SAMPLE 20 # حدد TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

عدد كثافة العمليات

المعايرة الدولية القيمة ، maxCalibrationValue ، minCalibrationValue ؛

int getChargeTime () {

int timerCount = 0 ؛ int overflowCount = 0 ؛ // سعة التفريغ المراد قياسها RC4 = 0 ؛ _delay_ms (DISCHARGE_TIME) ، // أعط تأخيرًا كافيًا لتفريغ "المكثف" بالكامل (تقريبًا في الواقع) // امسح علامة تجاوز المؤقت T0IF = 0 ؛ // انتظر حتى يتجاوز الموقت ، ابدأ العد من 0 أثناء (! T0IF) ؛ T0IF = 0 ؛ // بدء شحن السعة المراد قياسها RC4 = 1 ؛ // انتظر حتى تصل السعة إلى جهد الإحالة بينما (C1OUT) {timerCount = TMR0 ؛ إذا (T0IF) {overflowCount ++ ؛ T0IF = 0 ؛ }} count = (256 * overflowCount) + timerCount ؛ // إعادة تعيين timerCount timerCount = 0 ؛ overflowCount = 0 ؛ عدد العودة }

int isTouching (التسامح int) {

// متوسط عينات متعددة متوسط مزدوج = 0 ؛ لـ (int i = 0 ؛ i calibrationValue + التسامح) المتوسط ++ ؛ } متوسط / = TOUCH_SAMPLE ؛ // سيكون المتوسط رقمًا بين 0 و 1 إذا (متوسط> 0.2) يعود 1 ؛ العودة 0 ؛ }

معايرة باطلة () {

متوسط كثافة العمليات = 0 ؛ عينات int [CALIBRATION_SAMPLE] ؛ // احصل على متوسط قيمة لـ (int i = 0؛ i <CALIBRATION_SAMPLE؛ i ++) {sample = getChargeTime () ؛ متوسط + = عينات ؛ } متوسط / = CALIBRATION_SAMPLE ؛ معايرة القيمة = متوسط ؛ // الحصول على قيم قصوى / دقيقة maxCalibrationValue = عينات [0] ؛ minCalibrationValue = عينات [0] ؛ لـ (int i = 0 ؛ i maxCalibrationValue) maxCalibrationValue = عينات ؛ إذا (عينات <minCalibrationValue) minCalibrationValue = عينات ؛ }}

setupCapacitiveTouch () باطل {

// إعداد دبوس الشحن / التفريغ كإخراج ، في هذه الحالة يكون RC4 TRISCbits. TRISC4 = 0 ؛ // إعداد جهاز ضبط الوقت 0 T0CS = 0 ؛ PSA = 1 ؛ // إعداد المقارنة C1CH0 = 0 ؛ C1CH1 = 0 ؛ C1R = 0 ؛ C1ON = 1 ؛ C1POL = 0 ؛ // عدد قيم العد المقاصة = 0 ؛ // مسح معايرة قيم المعايرةValue = 0 ؛ maxCalibrationValue = 0 ؛ minCalibrationValue = 0 ؛ // قم بإجراء المعايرة عند بدء المعايرة () ؛ }

الخطوة الثالثة: كتابة الكود الرئيسي

بدءًا من الكود الرئيسي ، ستحتاج إلى تضمين ملف الرأس الذي تم إنشاؤه في الخطوة السابقة. الكود التالي هو مثال لكيفية استخدام وظيفة isTouching كمفتاح. في حالتي ، أعطيت العنوان اسم capacitiveTouch.h.

#يشمل

# تضمين "capacitiveTouch.h"

// يوضح هذا المتغير ما إذا كان الزر مضغوطًا أم لا

int lastState = 0 ؛

باطل رئيسي () {

// إعداد RC5 كإخراج TRISCbits. TRISC5 = 0 ؛ // تحتاج إلى استدعاء هذه الوظيفة في بداية إعداد البرنامج CapacitiveTouch () ؛ _delay_ms (1000) ؛ // معايرة بعد معايرة الإعداد الدقيق () ؛ while (1) {// التحقق مما إذا كان الزر مضغوطًا إذا (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0 ؛ آخر RC5 = 1 ؛ lastState = 1 ؛ } // التحقق من تحرير الزر وإلا إذا (lastState == 1 &&! isTouching (15)) lastState = 0؛ _delay_ms (20) ؛ }}

معايرة:

عندما يتم استدعاء هذه الوظيفة متغيرات معايرة القيمة ، سيتم تحديث maxCalibrationValue و minCalibrationValue. تستخدم المعايرة القيمة بواسطة وظيفة isTouching. ضع في اعتبارك أنه يجب ترك لوحة اللمس بمفردها أثناء المعايرة.

SetupCapacitive اللمس:

يجب أن يتم استدعاؤها في بداية البرنامج الخاص بك. يقوم بإعداد البتات الضرورية التي تستخدمها الوظائف الأخرى. كما يقوم بتشغيل معايرة النداء. ومع ذلك ، فقد حصلت على نتائج أفضل من خلال الانتظار لمدة ثانية وتشغيل المعايرة مرة أخرى بشكل منفصل.

اللمس:

ترجع هذه الوظيفة 1 إذا اكتشفت زيادة في السعة على C12IN0 وترجع 0 إذا كانت السعة قريبة من تلك التي كانت عليها أثناء المعايرة. وببساطة ، إذا قام شخص ما بلمس اللوحة ، فستقوم وظيفة isTouching بإرجاع 1. وتريد الوظيفة أيضًا معلمة كمدخل ، وهذا هو التفاوت المسموح به لبدء التشغيل. كلما زادت قيمة التسامح ، أصبحت أقل حساسية. في الإعداد الخاص بي ، وجدت أن 15 تعمل بشكل جيد ، ولكن نظرًا لأن هذا يعتمد على تردد المذبذب ومقدار السعة المضافة عند الضغط عليه ، يجب عليك تجربة هذه القيمة حتى تجد شيئًا يناسبك.

getChargeTime:

عندما تريد معرفة المدة التي سيستغرقها شحن السعة إلى جهد CVREF ، فإن هذه الوظيفة ستختبرها وتعيد عددًا صحيحًا. للحصول على الوقت بالثواني ، يمكنك استخدام هذه الصيغة: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds يمكن استخدام هذه الصيغة أيضًا للحصول على إدخال التفاوت من وظيفة isTouching إلى الثواني.