مقدمه ای بر الگوریتم AVR آسانسور

در بحث آموزش آسانسور در رابطه باالگوریتم کنترل آسانسور توسط میکروکنترلر AVR خواهیم نوشت:

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

این مطلب در مورد یکی از این تجهیزات (میکروکنترلر) به اختصار از نظر خوانندگان محترم می گذرد و به اختصار در کلاس آموزش آسانسور به آن پرداخته می شود.

مقدمه

برنامه کنترل آسانسور در مقابل برنامه های بسیاری از وسایل مورد استفاده افراد جامعه مانند ماشین لباس شویی به مراتب پیچیده تر است.اما از سوی دیگر نسبت به برنامه های تجهیزاتی که محاسبات پیچیده ریاضی دارند و پردازش تصویر انجام می دهند (از جمله : موبایل ، تجهیزات پزشکی MRI که از بدن انسان تصویر می گیرد و ... ) بسیار کم حجم و ساده است. در نگاه نخست تابلوی کنترل آسانسور دارای تعدادی ورودی است که در حلقه ای بی نهایت به طور مرتب چک می شوند و نسبت به تغییرات ایجاد شده در این ورودی ها خروجی ها تغییر داده می شوند. تعدادی از این ورودی ها مثل ورودی های سنسورهای روی کابین خیلی سریع قطع و وصل می شوند. (به این نوع از ورودی ها به وسیله وقفه پاسخ داده میشود) در واقع برنامه کنترل آسانسور چندان هم ساده و کم حجم نبوده و بیش از هزار خط( برنامه ) دارد که باید در آن تمام احتمالات و دستورات به طور دقیق و بدون اشتباه در نظر گرفته شود. این مقاله صرفا نگاهی کلی به چگونگی چک کردن ورودی های تابلو فرمان دارد که در قالب سه بخش تقدیم می شود:

  • تابع Main و توابع فرعی
  • وقفه های کنترل
  • وقفه دور انداز آسانسور


در قسمت قبل عنوان گردید که روند کلی چک کردن ورودی تابلو فرمان آسانسور مشتمل بر دو قسمت بوده و در این مقاله به روش اول تابع Main و توابع فرعی آن می پردازیم:

تابع Main و توابع فرعی:

برای شروع کار در آسانسور لازم است ابتدا موقعیت کابین آسانسور مشخص شود در صورت نامشخص بودن موقعیت کابین تابع شناسایی کابین فراخوانده می شود. بعد از این مرحله برنامه وارد یک حلقه (while (1 می شود. در این حلقه تمامی ورودی ها و خروجی های تابلو فرمان آسانسور به طور منظم چک می شود و دستورات لازم صادر میگردد.

در طراحی این حلقه تلاش شده است اصولا از فرمان Delay و یا توابعی که دارای این فرمان هستند استفاده نشود و برای اندازه گیری زمان از تایمر شمارنده یا تعداد تکرار شدن حلقه استفاده می شود:

#include<mega64>

#definemotorPORTC// ماکروی موتور جهت فرمان دادن به کنتاکتورها

Char vorodi[8]={0};char level;

Char hal ,kabin ,rvzion_swich=0;

Char i, Jehat , ss ,n_stop;

Char dorandaz ,time-park; char tabage; char activate_stop;

Int tim_travel=0;

Void revizsion(void){}

Void shenasi(void){}

Void main(void)}

Shenasi();

While(1)

{if(tim_travel>0)} tim_travel++;  if(time_travel>2000){};};

If((PINF&1)==1) vorodi[0]++; else(vorodi[0]=0 hal&=0xfe);

If(vorodi(0)>200)

(hal=hal|1; vorodi[0]=201;};

If((pinf&2)==2)(rvzion_Swich=1; revision();}else(rvzion_swich=0;};};};

در برنامه فوق جهت کوچک شدن برنامه تنها دو ورودی که چک می شود، یکی شاسی احضار و دیگری کلید رویزیون بوده و از آرایه های متغیر آرایه ای Vorodi جهت اندازه گیری مدت زمان یک (بودن) ورودی ها استفاده می شود. اگر به برنامه توجه نمایید شاهد خواهید بود که برای تشخیص ورودی رویزیون از یک بار نمونه برداری استفاده شده است. ولی برای تشخیص شاسی احضار از 200بار نمونه برداری استفاده شده است که علت آن به ساختار شاسی ها بر می گردد. در انتها که سیم های احضار وصل می شود تعدادی LED قرار داده می شوند که هنگام پذیرفته شدن احضار روشن می گردد

در ادامه بحث تابع Main و توابع فرعی :

با توجه به طول زیاد سیم شاسی های احضار آسانسور و این LEDها ، سیم احضار طبقات در مجاورت تغییرات شار مغناطیسی مثل یک حلقه سیم عمل می کند و دچار نویز القایی شدیدی می شود که اغلب اوقات موجب چشمک زدن LED احضار در داخل تابلو فرمان آسانسور می شود. در مقابل ورودی های احضار از انجا که مسیر جریان به طور کامل قطع می شود ورودی های سنسورهای روی کابین سیم های قفل و کنتاکت درها میکروسویچ ها و کلید کابین سیم های قفل و کنتاکت درب ها میکروسویچ ها و کلید رویزیون به سختی دچار نویز می شوند. سیم های سون سگمنت ها نیز دچار نویز نمی شوند یا اگر هم بشوند خیلی ضعیف است چرا که مسیر جریان های القایی در تابلو فرمان آسانسور از داخل ترانزیستور می گذرد و این قطعه در حالت خاموشی مقاومت بسیار بالایی دارد. بنابراین ورودی ها از نظر نویز پذیری به دو دسته تقسیم می شوند ورودی های نویز بالا و ورودی های نویز کم. در مثال بالا برای بی اثر کردن تاثیر نویز بر روی محاسبات کنترل اسانسور و محاسبه زمان از روش شمارش استفاده شده است.

متغیر Time Travel جهت اندازه گیری زمان حرکت کابین است. در هر بار تکرار حلقه بی نهایت مقدار این متغیر افزایش می یابد. قبلا مشخص شده که در هر 3 ثانیه 2000 بار حلقه تکرار می شود. برنامه به گونه ای نوشته شده تا هنگام دیده شدن سنسورهای مغناطیسی روی کابین در تابع وقفه این سنسورها مقدار متغیر یک و هنگامی که کابین متوقف است صفر شود. در نتیجه هنگام گیر کردن کابین در یک نقطه موتور بیشتر از 3 ثانیه کار نمی کند

روش اول چک کردن ورودی های تابلو فرمان به پایان رسید و در این مقاله به روش دوم چک کردن ورودی تابلو فرمان (روش وقفه های کنترل) می پردازیم:

از وقفه ها جهت پاسخ سریع به سنسورهای تراز (Level) و دور انداز طبقات و اطلاعات دریافت شده از طریق رابط های سریال و شالترهای داخل چاه استفاده می شود البته شالترها را از طریق حلقه اصلی نیز می توان کنترل کرد. در حلقه اصلی کنترل شاسی ها و مدار سری استپ چک می شود و با توجه به اطلاعات به دست امده جهت حرکت کابین مشخص و فرمان های لازم جهت حرکت کابین صادر می شود ولی فرمان های دوراندازی سرعت و تراز طبقات توسط وقفه ها صادر شود. در برنامه زیر برای موقعیت کابین پنج متغیر وجود دارد. متغیر های :   Level , n-stop , tabage , cf3 , jehat

هر بیت از متغیر Level نشان دهنده یک طبقه است که همیشه تنها یک بیت آن یک است و مقدار ان با شیفت به چپ یا شیفت به راست تغییر می کند. متغیر n-stop موقعیت طبقه ای را نشان می دهد که کابین در آن متوقف شده است. وقتی کابین متوقف می شود مقدار آن با با مقدار Level برابر می شود ولی در حالت حرکت مقدار آن صفر است. متغیر tabage  موقعیت کابین را به صورت یک عدد نشان می دهد و مقدار آن با ++ یا – تغییر می کند. متغیر jehat  جهت حرکت کابین را نشان می دهد. از متغیر  Cf3 جهت تشخیص لحظه ای دوراندازی استفاده می شود. ماکروی Motor فرمان های کنتاکتورها یا درایو را اعمال می کند. ترتیب خروجی های Motor عبارتند از بیت صفر فرمان جهت بالا بیت 1 فرمان جهت پایین بیت 2 فرمان دورتند بیت 3 فرمان دور کن

3- وقفه دورانداز آسانسور:

1-3- روش اول:

متغیر cf3 نشان دهنده دور انداز اول یا دوم بین طبقات است. با دیده شدن سنسور تراز آسانسور مقدار آن صفر می شود و هر بار که یک سنسور دور انداز آسانسور دیده می شود مقدار آن ++ می شود. اگر قرار باشد با سنسور اول دوراندازی کند هنگامی که مقدار این سنسور عدد 1 را نشان می دهد متغیر شاسی را با متغیر تراز AND می کند و در صورتی که نتیجه بزرگتر از 1 بود بیت دور تند را از ماکروی Motor  صفر و بیت دور کند را یک می کند.

2-3- روش دوم:

متغیر cf3 در جهت بالا ++ و در جهت پایین – می شود. شماره دورانداز هر توقف و جهتی که باید در آن دوراندازی شود در آرایه ای مثلا به نام [Cf3-level[64 نگهداری می شود. هر بار با دیده شدن سنسور دورانداز آسانسور با توجه به اطلاعاتی که در [Cf3-level[Cf3 وجود دارد موقعیت کابین و بیت های دورکند و تند ماکروی motor تغییر داده می شود. از آنجا که هر توقف دو سنسور دورانداز دارد پس متغیر Cf3-level  برای 32 توقف 64 عضو دارد.

3-3- روش سوم:

روش سوم تقریبا شبیه به روش دوم است با این تفاوت که در آرایه های Cf3-level مقدار پالس های انکودر برای هر توقف نگهداری می شود. از این روش در سیستم های Close Loop جهت حذف سنسورهای دورانداز و ترازکردن دقیق کابین استفاده می شود.

Interrupt[ext-int1-isr(void)//1cf  وقفه ای

{if(jehat==0x20) {tabage++;level<<=1;}

If(jehat==0x40) {tabage--;level>>=1;}

If(rvzion-swich==1){}else{if((motor&4)>0)motor=0;}

Tim-travel=1;};

Interrupt[EXT-INT7] voidext-int7-isr(void)//cf3  وقفه ای

{if(jehat==0x20){dorandaz++;};

If(jehat==0x40){dorandaz--;};

If(rvzion-swich==1) {} else {if

((ss&dorandaz-level[dorandaz])>0)

{motor=(motor&0xf7)0x04;};}; tim-travel=1;};