فهرست مطالب:

لمس خازنی با میکروکنترلر PIC16F886: 3 مرحله
لمس خازنی با میکروکنترلر PIC16F886: 3 مرحله

تصویری: لمس خازنی با میکروکنترلر PIC16F886: 3 مرحله

تصویری: لمس خازنی با میکروکنترلر PIC16F886: 3 مرحله
تصویری: Review of WUZHI WZ10020L 100V 1000W Step Down MPPT Converter CNC 2024, جولای
Anonim
لمس خازنی با میکروکنترلر PIC16F886
لمس خازنی با میکروکنترلر PIC16F886

در این آموزش ما نحوه استفاده از میکروکنترلر PIC16F886 برای تشخیص تفاوت در ظرفیت را بررسی می کنیم ، بعداً می توان از آن برای تشخیص فشار دادن صفحه لمسی استفاده کرد. خوب است قبل از ساخت این پروژه با میکروکنترلرهای عکس آشنا شوید.

مرحله 1: مدار خود را سیم کشی کنید

مدار خود را سیم بندی کنید
مدار خود را سیم بندی کنید

ابتدا ، اجازه دهید با سیم کشی مدار مطابق شماتیک بالا شروع کنیم. برای ساختن صفحه لمسی می توانید فویل آلومینیومی را به شکل مربع تا کرده و روی سیم بچسبانید. می توانید مقادیر مختلفی را برای مقاومت 100k آزمایش کنید ، من دریافتم 100k برای من خوب کار می کند.

پین RC4 برای شروع شارژ/تخلیه ظرفیت مورد اندازه گیری استفاده می شود. C12IN0 به طرف یک مقایسه کننده داخلی و پین C1IN به طرف + همان مقایسه کننده متصل است. هنگامی که ولتاژ C12IN0 به بالای ولتاژ C1IN برسد ، میکروکنترلر خازنی را کاملاً شارژ می بیند. تقسیم کننده ولتاژ مقاومتی اطمینان حاصل می کند که C1IN نزدیک به 5 ولت است.

از آنجا که صفحه لمسی بستگی به وجود خازن قابل توجهی بین شما و زمین مدار دارد ، احتمال کار نکردن باتری وجود دارد.

مرحله 2: فایل سربرگ

فایل سربرگ
فایل سربرگ

با تمام اتصالات تمام شد؟ خوب ، ما با فایل هدر ادامه می دهیم. ما از کامپایلر XC8 استفاده خواهیم کرد و همانطور که از عنوان آن پیداست ، اکنون باید یک پروژه سربرگ جدید در پروژه خود ایجاد کرده و کد زیر را کپی-پیست کنید. به همان خوبی می توانید آن را در بالای کد اصلی خود بدون هیچ عنوان سربرگ کپی و پیست کنید.

#تعریف CALIBRATION_SAMPLE 20 #تعریف TOUCH_SAMPLE 10 #تعریف DISCHARGE_TIME 5

int شمارش ؛

int calibrationValue، maxCalibrationValue، minCalibrationValue؛

int getChargeTime () {

int timerCount = 0؛ int overflowCount = 0؛ // ظرفیت تخلیه برای اندازه گیری RC4 = 0 ؛ _ تاخیر_ثانیه (DISCHARGE_TIME) ؛ // تأخیر کافی برای تخلیه کامل (تقریباً به طور کامل) "خازن" // پاک کردن پرچم سرریز تایمر T0IF = 0 ؛ // منتظر بمانید تا زمان سنج سرریز شود ، شمارش را از 0 شروع کنید ((T0IF) ؛ T0IF = 0 ؛ // شروع ظرفیت خازنی برای اندازه گیری RC4 = 1 ؛ // منتظر بمانید تا ظرفیت خازنی تا ولتاژ مرجع شارژ شود (C1OUT) {timerCount = TMR0؛ if (T0IF) {overflowCount ++؛ T0IF = 0 ؛ }} count = (256 * overflowCount) + timerCount؛ // تنظیم مجدد timerCount timerCount = 0؛ overflowCount = 0؛ تعداد بازگشت ؛ }

int isTouching (int tolerance) {

// میانگین چند نمونه متوسط دو برابر = 0؛ برای (int i = 0 ؛ i calibrationValue+tolerance) میانگین ++ ؛ } میانگین /= TOUCH_SAMPLE؛ // اگر یک عدد (میانگین> 0.2) 1 باشد ، عددی بین 0 تا 1 خواهد بود. بازگشت 0 ؛ }

void calibrate () {

int متوسط = 0؛ نمونه های int [CALIBRATION_SAMPLE] ؛ // مقدار متوسط برای (int i = 0 ؛ i <CALIBRATION_SAMPLE ؛ i ++) {نمونه = getChargeTime () ؛ میانگین += نمونه ؛ } میانگین /= CALIBRATION_SAMPLE ؛ calibrationValue = میانگین ؛ // دریافت مقادیر max/min maxCalibrationValue = نمونه [0] ؛ minCalibrationValue = نمونه [0] ؛ برای (int i = 0 ؛ i maxCalibrationValue) maxCalibrationValue = نمونه ؛ if (نمونه <minCalibrationValue) minCalibrationValue = نمونه ؛ }}

void setupCapacitiveTouch () {

// تنظیم پین شارژ/تخلیه به عنوان خروجی ، در این حالت RC4 TRISCbits. TRISC4 = 0 است؛ // تنظیم timer0 T0CS = 0؛ PSA = 1 ؛ // راه اندازی مقایسه C1CH0 = 0؛ C1CH1 = 0 ؛ C1R = 0 ؛ C1ON = 1 ؛ C1POL = 0 ؛ // پاکسازی مقادیر شمارش تعداد = 0؛ // پاکسازی مقادیر کالیبراسیون calibrationValue = 0؛ maxCalibrationValue = 0؛ minCalibrationValue = 0؛ // اجرای کالیبراسیون در شروع کالیبراسیون ()؛ }

مرحله 3: نوشتن کد اصلی

با شروع کد اصلی ، باید فایل هدر ایجاد شده در مرحله قبل را وارد کنید. کد زیر نمونه ای از نحوه استفاده از تابع isTouching به عنوان سوئیچ است. در مورد من ، هدر را با نام capacitiveTouch.h گذاشتم.

#عبارتند از

#شامل "capacitiveTouch.h"

// این متغیر نشان می دهد که آیا دکمه فشار داده شده است یا قبلاً فشار داده نشده است

int lastState = 0؛

void main () {

// تنظیم RC5 به عنوان خروجی TRISCbits. TRISC5 = 0؛ // شما باید این تابع را در شروع برنامه setupCapacitiveTouch () فراخوانی کنید. _ تأخیر_ms (1000) ؛ // بعد از راه اندازی دقیق خود کالیبره کنید ()؛ در حالی که (1) {// بررسی می شود که آیا دکمه در حال فشردن (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0 است ؛ else RC5 = 1؛ lastState = 1؛ } // بررسی اینکه آیا دکمه در حال آزاد شدن است اگر (lastState == 1 &&! isTouching (15)) lastState = 0؛ _ تأخیر_ms (20) ؛ }}

کالیبره کردن:

وقتی این تابع متغیرهای calibrationValue نامیده می شود ، maxCalibrationValue و minCalibrationValue به روز می شوند. calibrationValue توسط تابع isTouching استفاده می شود. به خاطر داشته باشید که صفحه لمسی هنگام کالیبراسیون باید تنها گذاشته شود.

setupCapacitiveTouch:

در ابتدای برنامه باید تماس بگیرید. این بیت های لازم را که توسط سایر توابع استفاده می شود تنظیم می کند. همچنین خطاطی را اجرا می کند. با این حال من با منتظر ماندن یک ثانیه نتایج بهتری گرفتم و دوباره کالیبراسیون را جداگانه اجرا کردم.

isTouching:

این تابع در صورت تشخیص افزایش ظرفیت در C12IN0 ، 1 را باز می گرداند و اگر خازنی نزدیک به ظرفیتی باشد که در زمان کالیبراسیون وجود داشت ، 0 را برمی گرداند. به بیان ساده ، اگر کسی پد را لمس کند ، تابع isTouching 1 برمی گردد. این تابع همچنین یک پارامتر را به عنوان ورودی می خواهد ، این تحمل برای تحریک آن است. هرچه مقدار تحمل بیشتر باشد حساسیت آن کمتر می شود. در تنظیماتم متوجه شدم 15 عدد خوب کار می کند ، اما چون این بستگی به فرکانس مدار و میزان خازنی دارد که وقتی آن را فشار می دهید ، باید با این مقدار آزمایش کنید تا چیزی را پیدا کنید که برای شما مناسب باشد.

getChargeTime:

وقتی می خواهید بدانید چقدر طول می کشد تا ظرفیت خازنی به ولتاژ CVREF شارژ شود ، این تابع آن را آزمایش کرده و یک عدد صحیح را برمی گرداند. برای بدست آوردن زمان در ثانیه از این فرمول استفاده می کنید: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds این فرمول همچنین می تواند برای دریافت ورودی تحمل از تابع isTouching به ثانیه استفاده شود.

توصیه شده: