- دوشنبه ۱۳ آذر ۱۴۰۲
تشریح عملکرد روتاری انکودر و نحوه استفاده از آن با میکروکنترلر STM32
تشریح عملکرد روتاری انکودر و نحوه استفاده از آن با میکروکنترلر STM32
روتاری انکودر یک قطعه الکترومکانیکی است که با چرخاندن آن به سمت چپ یا راست، یک سیگنال تولید میشود که میتوان با استفاده از این سیگنال، جهت و تعداد چرخش روتاری انکودر را تعیین کرد. به دلیل استحکام و کنترل دیجیتالی مناسب روتاری انکودرها، از آنها در حوزههایی همچون رباتیک، ماشینهای CNC، پرینترها و پروژههای الکترونیکی استفاده میشود.
معرفی انواع روتاری انکودرها
دو مدل از روتاری انکودرها پرکاربردتر هستند که به یکی از آنها «مطلق» و به دیگری «افزایشی» میگویند. انکودرِ مطلق میتواند موقعیت دقیقِ دستگیره را بر حسب درجه به کاربر نشان دهد، در حالی که انکودرِ افزایشی اطلاعات مربوط به تعداد دفعاتیِ که شفتِ آن حرکت کرده است در اختیار کاربر قرار میدهد. روتاری انکودری که در این مطلب به بررسی و کدنویسی خواهیم پرداخت، از نوع افزایشی است.
مقایسه روتاری انکودر با پتانسومتر
روتاری انکودرها را میتوان بهصورت کامل و بدون توقف به هر دو جهت چرخاند، درحالی که پتانسیومتر به اندازه سهچهارم محیط دایره میچرخد. پتانسومترها برای زمانی که میخواهیم از موقعیت دقیق شفتِ آن مطلع شویم، کاربرد بیشتری دارند. اما زمانی که تغییر موقعیت شفت و جهت چرخش آن اهمیت بیشتری داشته باشد، روتاری انکودر بسیار کاربردیتر خواهد بود.
تشریح نحوه عملکرد روتاری انکودرها
در داخل روتاری انکودر، یک دیسک شکافدار متصل به پایه مشترک C و دو پایه تماس A و B وجود دارد که در شکل زیر نشان داده شده است.
هنگامی که روتاری انکودر را میچرخانیم، A و B با پین زمینِ مشترکِC به ترتیب خاصی که در جهت چرخاندن شفت است، تماس برقرار میکنند. وقتی با زمین مشترک تماس برقرار میشود، سیگنالهایی که با هم ۹۰ درجه اختلاف فاز دارند تولید میشوند و دلیلش این است که یک پین قبل از پین دیگر در تماس با زمین مشترک قرار میگیرد. به این روش، رمزگذاری quadrature میگویند.
وقتی روتاری را در جهت عقربههای ساعت میچرخانید، ابتدا پین A و سپس پین B به زمین متصل میشوند. زمانی که روتاری را در خلاف جهت عقربههای ساعت میچرخانید، ابتدا پین B و بعد از آن پین A به زمین متصل میشود. با ردیابی زمانی که هر پین به زمین متصل و از زمین جدا میشود، میتوانیم از این تغییرات سیگنال برای تعیین جهت چرخش روتاری استفاده کنیم. میتوانید این کار را با مشاهده وضعیت B در هنگام تغییر حالت A نیز انجام دهید.
اگر B! = A باشد، روتاری در جهت عقربههای ساعت چرخانده شده است.
اگر B = A باشد، روتاری در خلاف جهت عقربههای ساعت چرخانده شده است.
معرفی پایهها در روتاری انکودر
پایههای روتاری انکودر به شرح زیر هستند:
نام پایه |
توضیحات |
GND |
اتصال به زمین |
VCC |
اتصال به تغذیه 5+ یا 3.3+ ولت |
Switch |
کلید روتاری که با فشردن آن به سمت پایین، با توجه به نوع ماژول High یا Low میشود. |
Output B (DT) |
مانند خروجی CLK است، اما ۹۰ درجه با CLK اختلاف فاز دارد. از این خروجی، جهت تعیین جهت چرخش استفاده میشود. |
Output A (CLK) |
خروجی اصلی پالس برای تعیین تعداد چرخش است. هر بار که روتاری به اندازه یک واحد در هر جهت میچرخد، خروجی CLK در یک سیکل، HIGH و سپس LOW میشود. |
نحوه صحیح Debounce کردنِ روتاری انکودر
در صورت استفاده مستقیم از روتاری انکودر و بدون استفاده از ماژولهای آمادهای که با برد همراه هستند، دقت کنید که حتماً مانند تصویر زیر از دو عدد خازن 10nF جهت دیبانس کردنِ روتاری در مدار استفاده کنید. در غیر این صورت، هنگام چرخش روتاری با سرعت بالا، جهت چرخش بهدرستی توسط میکرو شناسایی نمیشود. همچنین دقت کنید که پایههای DT، CLK و SW با یک مقاومت 10k، Pull-Up شوند.
هدف از انجام آزمایش
در اینجا قصد داریم با استفاده از یک روتاری انکودر، مقدار متغیری به نام counter را افزایش و کاهش دهیم. با چرخاندن روتاری در جهت عقربههای ساعت، مقدار متغیر counter یک واحد افزایش و با هر بار چرخاندن آن در خلاف جهت عقربههای ساعت، مقدار این متغیر یک واحد کاهش خواهد یافت. همچنین با فشردن کلید روتاری به سمت پایین، مقدار متغیر روی صفر باز خواهد گشت.
لطفا قبل از مطالعه کامل این مقاله، مقاله "پروگرام کردن میکروهای STM32 بدون استفاده از پروگرامرهای مرسوم" را مطالعه نمایید.
پیکربندی و تولید پروژه در نرم افزار STM32CUBEMX
میکروکنترلر مورد نظر را که در اینجا برای ما STM32F103C8 است، در نرمافزار CubeMX انتخاب کنید. سه پایه دلخواه را در محیط Cube بهصورت ورودی برای پایههای روتاری (DT، CLK و SW) انتخاب و تعریف کنید.
از آنجایی که در این حالت از وقفههای خارجی استفاده نمیکنیم، برای عملکرد روانترِ روتاری انکودر، میکرو را بر روی کریستال خارجی و فرکانس کاری بالا قرار میدهیم.
به سربرگ Project Manager رفته و IDE مورد نظر را جهت توسعه برنامه انتخاب و پروژه را ذخیره و Generate میکنیم.
شروع برنامهنویسی
ابتدا پورت و شماره پایههای روتاری انکودرِ متصلشده به میکرو را از طریق define در برنامه معرفی میکنیم.
متغیرهای زیر را به برنامه اضافه کنید.
قبل از حلقه while، آخرین وضعیتِ پینِ CLK روتاری را بخوانید و در متغیر lastStateCLK ذخیره کنید.
حلقه while را مانند شکل زیر تکمیل کنید.
توضیح بخشبهبخش کدهای نوشتهشده
1- متغیرهای currentStateCLK و lastStateCLK وضعیت خروجی CLK را در خود نگه میدارند که در تعیین تعداد چرخشهای روتاری کاربرد دارند.
2- قبل از حلقه اصلی، مقدار حالِ حاضر CLK را میخوانیم و آن را در متغیر lastStateCLK ذخیره میکنیم.
3- در حلقه اصلی، مجدداً وضعیت CLK را بررسی کرده و با مقدار ذخیرهشده در lastStateCLK مقایسه میکنیم. اگر با یکدیگر تفاوت داشته باشند، به این معناست که روتاری انکودر چرخانده شده و پالس تولید شده است. همچنین بررسی میکنیم که مقدار currentStateCLK برابر یا ۱ باشد تا تغییر وضعیت روتاری را بهعنوان یک واحد در نظر بگیریم و از دو بار شمردن آن جلوگیری شود.
4- در صورتی که مقادیر CLK و lastStateCLK با یکدیگر متفاوت و نابرابر باشند، به این معناست که روتاری انکودر بهصورت پادساعتگرد چرخیده است. بنابراین مقدار متغیر counter را یک واحد کاهش میدهیم.
1. اگر هر دو مقدار یکی باشند، به این معناست که روتاری انکودر در جهت ساعتگرد چرخیده است. پس مقدار متغیر Counter را افزایش میدهیم.
5- مجدداً آخرین وضعیت CLK را میخوانیم و lastStateCLK را برابر با currentStateCLK قرار میدهیم.
6- در بخش آخر نیز پین مربوط به کلید روتاری را میخوانیم و متغیر counter را در هنگام فشردن آن صفر میکنیم.
7- در نهایت برنامه را کامپایل و بر روی برد، پروگرام کنید.
میتوانید از بخش Debug متغیر counter را در قسمت watch اضافه کرده و با چرخاندن روتاری، تغییر مقادیر را مشاهده کنید. همچنین برای عملکرد بهتر میتوانید با راهاندازی واحد وقفه خارجی (EXTI) برای پینهای روتاری، کدهای نوشتهشده را بهجای حلقه while، در فایل it.c نیز جایگزین کنید.
نتیجهگیری
روتاری انکودر یک سنسورِ موقعیت است که با چرخاندن آن، سیگنالهای مربعی تولید میشوند که میتوان با مقایسه آنها جهت چرخیدنِ روتاری انکودر را تعیین کرد. به دلیل استحکام و کنترل دیجیتالی مناسب روتاری انکودرها، از آنها در حوزههای رباتیک، ماشینهای CNC، پرینترها و بسیاری از دیگر پروژههای الکترونیکی استفاده میشود.
در این مطلب روتاری انکودر و نحوه عملکرد آن توضیح داده شده است. همچنین نحوه کدنویسی و راهاندازی آن در محیط CubeMX و نرمافزار keil تشریح شده است. از روش استفادهشده جهت کدنویسی روتاری انکودر در این مطلب، میتوان برای سایر میکروکنترلرها و بردها مبتنی بر AVR، PIC، آردوینو و دیگر ARMها نیز استفاده کرد.
دپارتمان برق و الکترونیک مجتمع فنی تهران دوره آموزش برنامه نویسی و راه اندازی میکرو کنترلر ARM را در دو سطح مقدماتی و پیشرفته به صورت تخصصی و عملی آموزش می دهد.
تلفن مشاوره : ۲۲۰۶۰۵۸۶-۰۲۱
نویسنده : دکتر آرش فتاحی