جدول المحتويات:

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

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

فيديو: اللمس بالسعة مع متحكم PIC16F886: 3 خطوات
فيديو: Review of WZ5012L 50V 12A 600W Step Down Buck Converter constant Current Battery Charger 2024, يوليو
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 إلى الثواني.

موصى به: