مطلب اختصاصي مركز مكاترونيك ايران
توسط :محمدرضا ناظم
همواره يكي از مهمترين بخش هاي يك آسانسور و يا يك روبات رولر (چرخ دار) كنترل حركت و ميزان آن به صورت دقيق است. از قطعات بسيار مفيدي كه امروزه براي اين هدف استفاده مي شود، مي توان به انكودرها اشاره نمود. كه در حال حاضر به شكل هاي خاصي يافت مي شوند. هدف از اين آموزش آشنايي با انكودرهاي مكانيكي و يا نوري نيست، بلكه هدف بالاتري را در نظر داريم تا شما را با انكودرهاي جدا و انكودرهايي كه به صورت مجتمع با موتورها نصب شده اند را بررسي نماييم. در حقيقت اين انكودرها از نوع انكودرهاي مستقل و وابسته هستند كه هر دو از لحاظ عملكرد به يك شكل كار مي كنند.
روش عملكرد انكودر ها به اين صورت هست كه به ازاي مثلا يك دور كامل 3600 پالس توليد كنند. در نتيجه با شمارش پالس ها مي توان ميزان چرخش و در نتيجه ميزان جابه جايي را محاسبه نمود.
فرض كنيد يك چرخ با قطر 10 سانتي متر را به يك انكودر بسته ايم. در اينجا به ازاي هر دور چرخ 3600 پالس توليد مي شود كه در حقيقت اين 3600 پالس بيانگر محيط طي شده دايره چرخ مي باشد. كه با يك نسبت ساده در برنامه نوشته شده براي انكودر، قابل محاسبه خواهد بود. بديهي است هرچه تعداد پالس ها بيشتر شوند، دقت محاسبه حركت هم بيشتر مي شود ولي بايد اين نكته را هم در نظر گرفت كه آي سي متصل شده به انكودر نيز قادر به شمردن اين پالس ها با توجه به كريستال به كار برده شده در شمارنده، باشد.
از جمله انكودرهاي مستقل كه در حال حاظر در بازار به انكودر آسانسورها نيز معروفند، انكودرهاي Autonics مي باشند كه با پالس هاي گوناگون و دقيق از جلمه 1024، 2048، 3600 (از 10 پالس تا 10000 پالس) در بازار مي باشند. اين انكودر ها در گروه بندي به انكودرهاي INCREMENTAL نيز معروف هستند كه در ادامه به بحث توضيح آنها خواهيم پرداخت.
عملكرد اصلي يك انكودر بر اساس توليد پالس هاست و هدف اصلي ما در اين آموزش ارائه ي روشي مطمئن براي شمارش اين پالس ها توسط AVR مي باشد.
و اما يك انكودر در عمل چگونه كار مي كند.
بسياري از انكودر هاي بازار داراي چند سيم مختلف هستند كه به طور كلي به صورت زير مي باشد:
1- سيم ولتاژ (VCC) انكودر
2- سيم زمين (GND)انكودر
3- سيم A براي پالس اول
4- سيم B براي پالس دوم با اختلاف فاز 90 درجه نسبت به پالس A
5- سيم Z كه به ازاي هر دور كامل انكودر (از لحظه حركت آن ، تا يك دور كامل) يك پالس توليد مي كند.
6- سيم شيلد دار براي حذف نويز
تعداد پالس هاي توليدي A يا B براي شناسايي تعداد پالس ايجاد شده براي هر دور انكودر كافي است. ولي نكته اصلي اينجاست كه علاوه بر هر تعداد پالس، ما نيازمند به اطلاعات جهت چرخش نيز هستيم و اينجاست كه پالس B به كمك ما مي آيد. اين پالس به دليل اختلاف فازي كه دارد در چرخش هاي CW (ساعتگرد) انكودر جلوتر و در چرخش هاي CCW (پادساعتگرد) انكودر عقب تر قرار مي گيرد. اين اختلاف به راحتي در شكل زير قابل مشاهده است (براي بزرگتر ديدن تصوير بر روي آن كليك كنيد):
و اما روش شمارش پالس ها با AVR :
از مهمترين مواردي كه در شروع كار بايد در نظر گرفت، روش خواندن اين پالسها با خطاي نزديك به صفر درصد است . پس انتخاب بهترين روش، براي خواندني با اين دقت، نيازمند راهكارهايي است كه در ادامه ذكر خواهند شد.
گام هايي كه در اينجا براي شمارش پالس ها نياز است:
1- ساخت مدار ساده فليپ فلاپ از نوع D براي شناسايي پالس پيشتاز (در حقيقت براي شناسايي CCW يا CW انكودر)
2- فعال سازي Interupt خارجي ميكرو براي شمارش تعداد پالس هاي توليدي و ارتباط اين پالس با ميكرو به بهترين شكل
3- ايجاد سطح ولتاژ مناسب آي سي براي حذف كاهش خطا با توجه به ولتاژ انكودر (5 ولت يا 12 ولت)
هدف بزرگ ديگري كه اين مقاله دنبال مي كند، ارائه روشي است كه از انكودرهاي 12 ولتي هم مانند انكودرهاي 5 ولتي بتوان استفاده نمود، ولي مشكل اصلي استفاده از انكودرهاي 12 ولتي، ايجاد پالس تا سطح 10 ولت است كه اين حد از مقدار قابل قبول AVR بيشتر بوده و منجر به آسيب رسيدن به اين آي سي مي شود. لذا در اينجا روشي را ارائه خواهيم نمود تا از اين آسيب نيز جلوگيري كامل به عمل آيد.
براي حل اين مشكل تقسيم مقاومتي مناسب، ولتاژ 10 ولت را به سطح 5 ولت مي آورد و قابل اعمال براي عملكرد صحيح فليپ فلاپ مي شود.
و اما شروع كار:
در مرحله اول مي خواهيم با آي سي 4013 يك فليپ فلاپ از نوع D (تاخيري) را براي اتصال به انكودر آماده سازي كنيم. (PDF اين آي سي در فايل پيوست قابل دانلود است.)
نتيجه خروجي اين فليپ فلاپ يك سطح منطقي صفر و يك است كه به يكي از پورت هاي آي سي وصل مي شود و براي شناسايي CCW يا CW چرخيدن انكودر به راحتي استفاده مي شود. نكته مهم ديگر در مدار عملي اين فليپ فلاپ، استفاده از مقاومت هاي نويز گير هست كه حتما شما نيز در مدار عملي بايد از آنها بهره ببريد.
در زير شماتيك اين مدار را مي توانيد مشاهده كنيد (براي بزرگتر شدن تصوير، روي آن كليك كنيد...):
همچنين از اين لينك مي توانيد فايل شبيه سازي و روش استفاده از آي سي 4013 در پروتئوس 7.7 را دانلود كنيد. (احتمالا با ورژن هاي پايين تر مشكل خواهيد داشت.)
دانلود كنيد:
دانلود این فایل فقط برای اعضای سایت می باشد. اگر شما هم می خواهید دانلود کنید، باید در سایت عضو شوید.
و اما روش برنامه نويسي:
تا كنون با روش شناسايي جهت چرخش انكودر آشنا شديد. همانطور كه مي دانيد ، آي سي هاي AVR داراي Interrupt خارجي براي عمليات روي پالس هستند كه مي توانند در مدهاي زير عمل كنند.
توضيح اين حالت ها در حقيقت شرح بخش هاي مختلف وقفه خارجي در Wizard كدويژن است.
1- Low Level: با اعمال يك سطح پايين به پايه فعال مي شود . (در بعضي از ميكرو ها اين سطح پايين وجود ندارد.) مادامي كه INTX ميكرو در وضعيت صفر قرار دارد، اين وقفه فراخواني مي شود...
2- Falling Edge: وقفه با لبه پايين رونده پالس اعمالي به اينتراپت ميكرو، فعال ميشود.
3- Rising Edge : عكس حالت پايين رونده
4- Any Change : وقفه براي مورد 2 و 3 نام برده، با توجه به وضعيت پايه اينتراپت ميكرو فعال مي شود.
نكته: حداقل كريستال مورد نياز براي يك انكودر با دقت 1024 پالس، 8 مگاهرتز انتخاب شود تا مشكلي در دقت آن بوجود نيايد.
حال كه با وضعيت كلي وقفه ها آشنا شديد، به روش برنامه نويسي مي پردازيم:
در ابتدا با Wizard كدويژن تنها يكي از اينتراپت ها را فعال و آنرا به لبه بالا رونده حساس كنيد. (دقت كنيد پايه اي كه انتخاب مي شود، بايد مطابق پايه اي باشد كه در ديتاشيت AVR اينتراپت آن معرفي شده و شما در عمل پالس خروجي A يا B انكودر را به آن وصل كرده ايد.)
سپس براي آنكه اعداد بتوانند در حافظه آي سي به درستي قرار گيرند، بايد حافظه را آدرس دهي كنيد. براي اين كار به صورت زير متغير ها را تعريف كنيد:
;int result=0
;float result2=0
;char x
;char buffer[33];// need spacechar *str=buffer,*str2=buffer
حال دستور زير را براي INTX خارجي ميكرو مي نويسيم:
(interrupt [EXT_INTX] void ext_intX_isr(void
}
( if (PINC.0==0
;result2=result2+1
(if (PINC.0==1
;result2=result2-1
{
در اينجا فرض مي كنيم، نتيجه خروجي فليپ فلاپ را به پايه 0 پين C داده بوديم. (اين پايه همان جهت ساعتگرد يا پادساعتگرد انكودر را بيان مي كرد)
هدر stdlib.h را با دستورinclude به اول برنامه اضافه مي كنيم و عدد شمارش شده انكودر را با دستور زير به رشته تبديل مي كنيم:
;(void)ftoa(result2,0,str)
نتيجه در رشته str قرار مي گيرد كه مي توان با دستور (puts(str به خروجي برد. يا با دستور (lcd_puts(str بر روي ال سي دي به نمايش در آوريد.
در زير يك نمونه سورس كد تست شده با آي سي ATMEGA64 و با متصل نمودن 2 انكودر و همچنين ارسال اطلاعات بر روي كامپيوتر براي ديدن اعداد قرار گرفته است:
براي دانلود كليك كنيد:
دانلود این فایل فقط برای اعضای سایت می باشد. اگر شما هم می خواهید دانلود کنید، باید در سایت عضو شوید.
بحث و سوال در مورد اين مطلب در انجمن: