2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
في هذا البرنامج التعليمي سوف نستعرض كيف يمكنك استخدام متحكم 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 إلى الثواني.