فهرست مطالب:

نحوه تفسیر جهت چرخش از یک سوئیچ دوار دیجیتال با PIC: 5 مرحله
نحوه تفسیر جهت چرخش از یک سوئیچ دوار دیجیتال با PIC: 5 مرحله

تصویری: نحوه تفسیر جهت چرخش از یک سوئیچ دوار دیجیتال با PIC: 5 مرحله

تصویری: نحوه تفسیر جهت چرخش از یک سوئیچ دوار دیجیتال با PIC: 5 مرحله
تصویری: مدار چپگرد راستگرد سریع اتوماتیک با میکرو سوئیچ 2024, جولای
Anonim
نحوه تفسیر جهت چرخش از یک سوئیچ روتاری دیجیتال با PIC
نحوه تفسیر جهت چرخش از یک سوئیچ روتاری دیجیتال با PIC

هدف از این دستورالعمل نشان دادن نحوه اتصال یک سوئیچ دوار دیجیتال (با کد چهار درجه) با یک میکروکنترلر است. نگران نباشید ، من توضیح می دهم که چهار ضلعی برای ما چه معنایی دارد. این رابط و نرم افزار همراه به میکروکنترلر اجازه می دهد جهت چرخش را برای هر حرکت از یک بازدارنده به دیگری تشخیص دهد. من اخیراً از این نوع سوئیچ در پروژه میکروکنترلر استفاده کردم که نیاز به وارد کردن یک نقطه تنظیم فشار با استفاده از یک دکمه با 16 دارد. به جای دکمه های بالا/پایین نگهدارنده ایده این بود که به کاربر اجازه دهیم فشار مورد نظر را "شماره گیری" کند. در نتیجه ، ما مجبور شدیم یک روال نرم افزاری برای دریافت اطلاعات موقعیت از سوئیچ و استنباط جهت چرخش به منظور افزایش یا کاهش نقطه تنظیم فشار برای سیستم اصلی ایجاد کنیم. در این دستورالعمل ، من رابط فیزیکی را پوشش می دهم برای میکروکنترلر ، نظریه عملکرد سوئیچ دوار ، نظریه عملکرد نرم افزار و همچنین روال کسر. در نهایت ، من برنامه روتین کسر را به شما نشان خواهم داد. با پیشرفت ما ، من سعی خواهم کرد که موارد را تا حدودی عمومی نگه دارم تا این ایده تا حد امکان در بسیاری از سیستم عامل ها اعمال شود ، اما همچنین آنچه را که انجام دادم به اشتراک می گذارم تا بتوانید یک برنامه خاص را مشاهده کنید.

مرحله 1: قطعات

قطعات
قطعات

برای پیاده سازی این مورد ، به موارد زیر نیاز دارید: برگه اطلاعات سوئیچ دوار 8.2 کیلو اهم را در دو خط داده که از سوئیچ خارج می شوند ، جمع می کند. شما می خواهید برگه اطلاعات مربوط به رمزگذار موردنظر برای استفاده را بررسی کنید. سوئیچ دوار مورد استفاده من را می توان با کلید دکمه ای محوری سفارش داد. این یک ویژگی مفید برای انجام انتخابهایی است که در آنها شماره گیری شده است ، و غیره ، اما من در مورد رابط آن در اینجا بحث نمی کنم. من "پلت فرم مناسب میکروکنترلر" را ذکر کرده ام زیرا (فکر می کنم) این را می توان در بیش از یک پلت فرم اجرا کرد. من افراد زیادی را دیده ام که از میکروکنترلرهای دیگر برای Instructables استفاده می کنند ، بنابراین می خواهم رویکرد کلی را نیز نشان دهم. من تمام کد را در PIC Basic Pro برای استفاده با Microchip PIC16F877A نوشتم. در واقع ، نکته کلیدی که در میکروکنترلر به آن نیاز دارید ، توانایی قطع در صورت تغییر منطقی در هر دو پین است. در PIC16F877A ، این وقفه تغییر PORTB نامیده می شود. ممکن است نامهای دیگری برای آن در کنترلرهای دیگر وجود داشته باشد. این ویژگی وقفه میکروکنترلر بخشی از چیزی است که این پیاده سازی را بسیار زیبا می کند.

مرحله 2: رابط سخت افزاری

رابط سخت افزاری
رابط سخت افزاری

یک راه حل "ساده" وجود یک سوئیچ "تک قطبی -16 پرتاب" با 16 اتصال به میکروکنترلر است. سپس هر خروجی سوئیچ به یک پین روی میکروکنترلر متصل می شود تا هر موقعیت شماره گیری توسط میکروکنترلر بررسی شود. این استفاده بیش از حد از پین های ورودی/خروجی است. اگر بخواهیم بیش از 16 موقعیت (بازداشت کننده) روی سوئیچ در دسترس ما باشد ، اوضاع بدتر می شود. هر موقعیت اضافی روی سوئیچ نیاز به ورودی اضافی برای میکروکنترلر دارد. این به سرعت به یک استفاده بسیار ناکارآمد از ورودی های یک میکروکنترلر تبدیل می شود. زیبایی سوئیچ دوار را وارد کنید. سوئیچ دوار تنها دو خروجی به میکروکنترلر دارد که به عنوان A و B در برگه اطلاعات ذکر شده است. تنها چهار سطح منطقی وجود دارد که این خطوط می توانند انجام دهند: AB = 00 ، 01 ، 10 و 11. این تعداد خطوط ورودی را که باید در اتصال سوئیچ به میکروکنترلر استفاده کنید بسیار کاهش می دهد. بنابراین ، ما تعداد خطوط ورودی را به دو خط کاهش دادیم. حالا چی؟ به نظر می رسد که ما واقعاً به 16 حالت مختلف نیاز داریم اما این سوئیچ جدید فقط چهار حالت دارد. آیا به پای خود شلیک کرده ایم؟ جواب منفی. ادامه مطلب را بخوانید. ما برای توضیح کمی نظریه پشت عملکرد سوئیچ دوار را پوشش می دهیم.

مرحله 3: تئوری سخت افزار عملیات

تئوری سخت افزار عملیات
تئوری سخت افزار عملیات
تئوری سخت افزار عملیات
تئوری سخت افزار عملیات
تئوری سخت افزار عملیات
تئوری سخت افزار عملیات

سنجش جهت چرخش با استفاده از سوئیچ "پرتاب تک قطبی -16" فوق امکان پذیر است ، اما از ورودی های زیادی بر روی میکروکنترلر استفاده می کند. استفاده از سوئیچ دوار تعداد ورودی های میکروکنترلر را کاهش می دهد اما در حال حاضر ما باید سیگنال های دریافتی از سوئیچ را تفسیر کرده و آنها را به جهت چرخش ترجمه کنیم. قبلاً اشاره کردم که سوئیچ دارای کد درجه چهارم بود. این نیز یکی از ظرافت های کلیدی در این راه حل است. این بدان معناست که یک کد 2 بیتی وجود دارد که سوئیچ می دهد و با موقعیت سوئیچ مطابقت دارد. شاید فکر کنید: "اگر یک ورودی دو بیتی برای میکروکنترلر وجود داشته باشد ، چگونه همه 16 موقعیت را نشان می دهیم؟" این سوال خوبی است. ما نماینده همه آنها نیستیم ما فقط باید موقعیت های نسبی دستگیره را بدانیم تا بتوانیم جهت چرخش را تعیین کنیم. موقعیت مطلق دستگیره مهم نیست. برای چرخش در جهت عقربه های ساعت ، کدی که سوئیچ می دهد هر چهار بار تکرار می شود و کد خاکستری دارد. خاکستری به این معنی است که برای هر تغییر موقعیت فقط یک تغییر وجود دارد. به جای شمارش ورودی AB برای چرخش جهت عقربه های ساعت به صورت دودویی به این صورت: 00 ، 01 ، 10 ، 11 ، به این صورت تغییر می کند: 00 ، 10 ، 11 ، 01. توجه کنید که برای الگوی دوم ، فقط یک ورودی بین مجموعه ها مقادیر خلاف جهت عقربه های ساعت برای ورودی AB به میکروکنترلر به این شکل خواهد بود: 00 ، 01 ، 11 ، 10. این به سادگی عکس الگوی ساعتگرد است که ابتدا AB = 00 در آن ذکر شده است. برای توضیح بصری بیشتر به نمودارها نگاه کنید. به

مرحله 4: نظریه عملکرد نرم افزار

نظریه عملکرد نرم افزار
نظریه عملکرد نرم افزار

روالي كه جهت چرخش را استنباط مي كند ، وقفه ايجاد مي شود. میکروکنترلری که انتخاب می کنید باید بتواند هر زمان که فعال شد وقفه در یکی از (حداقل) دو پین تغییر کرد ، قطع شود. این وقفه تغییر PORTB در PIC16F877A نامیده می شود. هر زمان که سوئیچ بچرخد ، میکروکنترلر قطع می شود و اجرای برنامه به روال سرویس وقفه (ISR) ارسال می شود. ISR به سرعت می فهمد که سوئیچ به چه صورتی چرخانده شده است ، یک پرچم مناسب تنظیم کرده و به سرعت به برنامه اصلی باز می گردد. در صورتی که کاربر سوئیچ را خیلی سریع بچرخاند ، لازم است این اتفاق سریع رخ دهد. ما می دانیم که الگوی AB با رنگ خاکستری هر چهار موقعیت را تکرار می کند ، بنابراین اگر ما روال عادی را برای انتقال بین این چهار موقعیت انجام دهیم ، برای همه بقیه کار می کند. توجه داشته باشید که در یک چرخه چهار موقعیتی ، چهار لبه وجود دارد. یک لبه بالا و یک لبه سقوط برای ورودی A و همچنین ورودی B. ریزپردازنده هر بار که لبه ای وجود دارد قطع می شود و این بدان معناست که هر زمان که دکمه چرخانده می شود ، میکروکنترلر قطع می شود. در نتیجه ، ISR باید بفهمد که دستگیره به کدام طرف چرخانده شده است. برای کمک به ما در چگونگی انجام این کار ، برای چرخش در جهت عقربه های ساعت به شکل موج روی می آوریم. توجه داشته باشید که هر زمان که A دارای یک لبه باشد ، مقدار جدید آن همیشه با B متفاوت است. هنگامی که دکمه از موقعیت 1 به 2 می رود ، A از منطق 0 به منطق 1 تغییر می کند. B هنوز برای این انتقال 0 است و با مقدار جدید A مطابقت ندارد. هنگامی که دستگیره از موقعیت 3 به 4 می رود ، A دارای لبه سقوط است در حالی که B در منطق -1 باقی می ماند. دوباره توجه کنید که B و مقدار جدید A متفاوت است. در حال حاضر ، ما می توانیم ببینیم که هر زمان که A باعث چرخش در جهت عقربه های ساعت می شود ، مقدار جدید آن با B. متفاوت است. بیایید B را بررسی کنیم تا ببینیم چه اتفاقی می افتد. وقتی سوئیچ از موقعیت 2 به 3 می رود B دارای یک لبه صعودی است. در اینجا ، مقدار جدید B همان A است. با نگاه کردن به آخرین لبه باقی مانده برای چرخش جهت عقربه های ساعت ، B دارای یک لبه سقوط است که از موقعیت 4 به 5 حرکت می کند. (موقعیت 5 همان موقعیت 1 است.) مقدار جدید B در اینجا نیز همان A است! اکنون می توانیم چند کسری انجام دهیم! اگر A باعث وقفه شود و مقدار جدید A با مقدار B متفاوت باشد ، چرخش در جهت عقربه های ساعت بود. علاوه بر این ، اگر B باعث وقفه شود و مقدار جدید B همان A باشد ، چرخش در جهت عقربه های ساعت بود. بیایید سریع مورد چرخش خلاف جهت عقربه های ساعت را بررسی کنیم. درست مانند چرخش جهت عقربه های ساعت ، چرخش خلاف جهت عقربه های ساعت باعث ایجاد چهار وقفه در یک چرخه می شود: دو مورد برای ورودی A و دو مورد برای ورودی B. ورودی A هنگام حرکت دکمه از موقعیت 4 به 3 و یک لبه سقوط از موقعیت 2 به 1 دارای یک لبه بالایی است. هنگامی که دکمه از موقعیت 4 به 3 حرکت می کند ، مقدار جدید A همان مقدار B است. توجه داشته باشید که وقتی A از موقعیت 2 به 1 حرکت می کند ، مقدار جدید آن نیز همان مقدار B است. اکنون ، می توانیم ببینیم که وقتی A باعث وقفه می شود و مقدار جدید آن با B مطابقت دارد ، چرخش خلاف جهت عقربه های ساعت بود. به سرعت ، ورودی B را برای بررسی همه چیز بررسی می کنیم. B هنگام حرکت دستگیره از موقعیت 5 (که همان 1 است) به 4 و هنگامی که دستگیره از موقعیت 3 به 2 حرکت می کند ، وقفه ایجاد می کند. در هر دو مورد ، مقدار جدید B با مقدار موجود مطابقت ندارد. از A که برعکس مواردی است که B باعث وقفه در جهت چرخش عقربه های ساعت می شود. این خبر خوبی است. همه چیز آنطور که باید بررسی می شود. به طور خلاصه ، اگر A باعث وقفه شود و مقدار جدید آن با مقدار B مطابقت نداشته باشد یا اگر B باعث وقفه شود و مقدار جدید B با مقدار A مطابقت داشته باشد که می دانیم چرخش در جهت عقربه های ساعت وجود داشته است. ما می توانیم موارد دیگر را برای چرخش خلاف جهت عقربه های ساعت در نرم افزار بررسی کنیم یا می توانیم فرض کنیم که چون چرخش آن در جهت عقربه های ساعت نبود ، در خلاف جهت عقربه های ساعت بود. روال من به سادگی این فرض را ایجاد کرد.

مرحله 5: نرم افزار

نرم افزار
نرم افزار
نرم افزار
نرم افزار

من از وقفه های ساخته شده در PIC Basic Pro استفاده نکردم. من از چند فایل که در کد خود از Darrel Taylor گنجانده بودم برای انجام کارهای معمول استفاده کردم. اینجاست که اعتبار بزرگی به دارل تعلق دارد! فایل ها رایگان هستند. فقط برای اطلاعات بیشتر ، سایر برنامه ها و بارگیری فایل ها به وب سایت وی مراجعه کنید. اگر از PIC با وقفه های Darrel Taylor استفاده نمی کنید ، می توانید این قسمت را رد کنید. فقط لازم است وقفه ها را بر روی پلتفرمی که استفاده می کنید تنظیم کنید. برای به دست آوردن وقفه های Darrel Taylor (DT) دو کار وجود دارد: 1.) فایل های DT_INTS-14.bas و ReEnterPBP.bas را در فایل خود قرار دهید. کد 2.) این را کپی کرده و در کد خود جایگذاری کنید. ASMINT_LIST ماکرو ؛ IntSource ، Label ، Type ، ResetFlag؟ INT_Handler RBC_INT، _ISR، PBP، yes endm INT_CREATEENDASMI زبانه ها و فضاهایی مانند گرافیک را در انتهای دستورالعمل قرار دهید تا بتوانید کارها را کمی ساده تر در کد خود مشاهده کنید. شما باید کمی آن را متناسب با نیازهای خود تغییر دهید. در برچسب ، ISR را با نام فرعی که ISR شما است جایگزین کنید. زیر خط را فراموش نکنید! شما به آن نیاز دارید! برای کارکردن وقفه ها ، دو کار دیگر نیز باید انجام دهید: 1.) ISR را بنویسید. شما این را درست مانند زمانی که قصد نوشتن یک زیر روال PBP دارید مینویسید با این تفاوت که باید @ INT_RETURN را در انتهای زیرروال به جای RETURN وارد کنید. با این کار وقفه قطع می شود و اجرای برنامه به همان جایی که در حلقه اصلی متوقف شده بود برمی گردد. در داخل ISR ، باید پرچم وقفه را پاک کنید تا برنامه شما در وقفه بازگشتی گرفتار نشود. فقط خواندن PORTB تنها کاری است که باید انجام شود تا پرچم وقفه در PIC16F877A پاک شود. هر میکروکنترلر متفاوت روش متفاوتی برای پاک کردن پرچم های وقفه دارد. 2) وقتی به نقطه ای در کد خود رسیدید که می خواهید وقفه را فعال کنید ، از این خط کد استفاده کنید:@ INT_ENABLE RBC_INT هنگامی که می خواهید وقفه را غیرفعال کنید به سادگی از:@ INT_DISABLE RBC_INT موارد زیادی وجود دارد مطالبی که در مورد آنها توضیح داده شده است ، بنابراین به سرعت خلاصه می کنم. تا اینجا ، برنامه شما باید چیزی شبیه به این باشد:؛ راه اندازی یا کد مورد نیاز INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST ماکرو ؛ IntSource ، Label ، Type ، ResetFlag؟ INT_Handler RBC_INT ، _myISR ، PBP ، بله پایان INT_CREATEENDASM؛ سایر تنظیمات مورد نیاز یا کد@ INT_ENABLE RBC_INT ؛ کدی که باید بداند دستگیره به چه سو می چرخد@ INT_DISABLE RBC_INT ؛ کد دیگرEND ؛ پایان برنامه: ISR: ؛ کد ISR اینجا@ INT_RETURN (جدول راه اندازی کنترل کننده وقفه) من فکر می کنم این جایی است که هرکسی که از وقفه های PIC یا DT استفاده نمی کند می تواند دوباره به آن بپیوندد. در حال حاضر ، ما باید ISR را بنویسیم تا میکروکنترلر بداند دستگیره به کدام سمت می چرخد. از بخش نظریه نرم افزار به یاد بیاورید که در صورتی که ورودی عامل وقفه ، مقدار جدید آن و مقدار ورودی دیگر را بدانیم ، می توانیم جهت چرخش را استنباط کنیم. در اینجا شبه کد وجود دارد: PORTB را در یک متغیر خراش بخوانید تا flag وقفه پاک شود. بررسی کنید اگر A باعث وقفه شده است. در صورت صحت ، A و B را مقایسه کنید ، بررسی کنید که آیا متفاوت است یا متفاوت ، این چرخش در جهت عقربه های ساعت بود ، اگر B باعث وقفه می شد ، در جهت خلاف جهت عقربه های ساعت EndifCheck بود. اگر صحیح است ، A و B را مقایسه کنید بررسی کنید که آیا متفاوت است ، اگر یکسان باشد ، این چرخش در جهت عقربه های ساعت بود ، در غیر این صورت بود. EndifReturn from interrupt چگونه می دانیم که آیا تغییر در A یا B باعث وقفه شده است؟ کشف مقدار جدید ورودی تغییر یافته و ورودی دیگر (بدون تغییر) آسان است زیرا می توانیم آنها را در ISR بخوانیم. قبل از ارسال اعدام به ISR ، باید بدانیم وضعیت هر یک چگونه بود. این در روال اصلی اتفاق می افتد. روال اصلی نشسته و منتظر است تا یک متغیر بایت که ما CWflag نامیده ایم روی 1 تنظیم شود یا توسط ISR روی 0 پاک شود. پس از هر تغییر تأیید شده دستگیره یا در صورت عدم وجود فعالیت دستگیره ، متغیر روی 5 تنظیم می شود تا یک حالت بیکار را نشان دهد. اگر پرچم تنظیم شود یا پاک شود ، روال اصلی بلافاصله فشار نقطه تنظیم شده را به طور مناسب بر اساس چرخش افزایش یا کاهش می دهد و سپس متغیر CWflag را به 5 باز می گرداند زیرا دستگیره اکنون دوباره بیکار است. از آنجا که روال اصلی بررسی CWflag است ، همچنین وضعیت مقادیر سوئیچ دوار A و B را نیز ثبت می کند. این واقعا ساده است و شبیه این است: oldA = AoldB = B واقعاً هیچ چیز فوق العاده ای در اینجا وجود ندارد. فقط آن دو خط را در ابتدای حلقه قرار دهید که CWflag را برای چرخش بررسی می کند. ما فقط مقادیر منطقی ورودی های دستگیره دوار در داخل حلقه افزایش/کاهش را در روال اصلی به روز می کنیم تا بتوانیم ببینیم چه ورودی باعث وقفه هنگام اجرای ISR شده است. در اینجا کد ISR آمده است: ABchange: scratch = PORTB 'PORTB را بخوانید تا پرچم وقفه پاک شود' اگر A باعث وقفه می شود ، B را جهت چرخش بررسی کنید IA oldA! = A THEN 'اگر A و B متفاوت باشند ، اگر در جهت عقربه های ساعت بود IF A! = B THEN GOTO CW 'در غیر این صورت ، چرخش خلاف جهت عقربه های ساعت بود ELSE GOTO CCW ENDIF ENDIF' اگر B باعث وقفه می شود ، جهت چرخش را در صورت قدیمی بودن B! = B سپس 'اگر A و B یکسان هستند ، چرخش در جهت عقربه های ساعت بود اگر A == B سپس GOTO CW 'در غیر این صورت ، این حرکت خلاف جهت عقربه های ساعت بود ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN من کد ISR را در یک فایل AB_ISR.bas گنجانده ام زیرا زبانه های کد آنطور که باید نشان داده نمی شوند. در حال حاضر ، چون ISR دارای مقادیر قدیمی برای ورودی A و B است ، می تواند تعیین کند که کدام ورودی باعث وقفه شده است ، آن را با ورودی دیگر (بدون تغییر) مقایسه کرده و جهت را تعیین کند از چرخش تنها کاری که باید انجام دهید این است که CWflag را بررسی کنید تا ببینید دکمه به کدام طرف چرخانده است (در صورت وجود) و یک شمارنده ، نقطه تنظیم یا هر چیزی که دوست دارید یا نیاز دارید را افزایش یا کاهش دهید. امیدوارم این کمک کند و خیلی هم نبوده است گیج کننده این نوع رابط به ویژه در صورتی مفید است که سیستم شما قبلاً از وقفه ها استفاده می کند ، زیرا این فقط یک وقفه دیگر برای اضافه کردن است. لذت بردن!

توصیه شده: