تبليغاتX
علوم و فنون
مرکز علوم و فنون سمنان
 
سنسورهای مادون قرمز پسیو

"سنسورهای مادون قرمز پسیو" وسایل الکترونیکی هستند که تشعشعات اینفرارد از اجسام و اهداف را در میدان دیدش اندازه گیری می کند. به این سنسورها "سنسورهای PIR" گفته می شود که از مخفف Passive InfraRed sensors گرفته شده است.

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

همه اشیاء اینفرارد (مادون قرمز) تشعشع می کنند. این تشعشع از دید انسان نامرئی است ولی می تواند با وسایل الکترونیکی که برای این هدف ساخته شده اند، آشکار شود. عبارت "پسیو" در این سنسور به این معنی است که این سنسور از خود هیچ نوع انرژی ساتع نمی کند، و فقط تشعشعات اینفرارد را از قسمت جلوئی سنسور (Sensor Face) دریافت می کند. در هسته یا مرکز PIR یک یا دسته ای از سنسورهای نیمه هادی وجود دارد، که مساحت تقریبی آن یک چهارم اینچ مربع است. این ناحیه از مواد گرما برقی (pyroelectric) ساخته شده است.

سنسورهای فعلی روی چیپ ها از مواد گرما برقی طبیعی یا مصنوعی و معمولا به صورت یک غشا یا لایه نازک ساخته می شوند. بعضی از ترکیبات عبارتند از: گالیوم نیترید (GaN)، کاسیم نیترات (CsNO3)، پلى وينيل فلوراید، مشتقات فنیل پیرازین و لیتیوم تانتالیک (LiTaO3) که مانند کریستال است و خواص پیرو الکتریک و پیزو الکتریک -ويژگى برخى کريستالها که به هنگام اعمال ولتاژ به انها تحت فشار قرار مى گيرند يا به هنگام قرار گرفتن در معرض فشار مکانيکى يک ولتاژ توليد مى کنند- را با هم دارد.

سنسور PIR اغلب به عنوان قسمتی از مدارات مجتمع ساخته می شود و ممکن است شامل یک، دو، سه یا چهار "پیکسل"، شامل مساحتهای مساوی از مواد گرما برقی باشد. ممکن است سنسورها را به صورت جفتهائی به ورودیهای مخالف تقویت کننده های تفاضلی متصل کنند. در چنین ترکیبی اندازه گیریهای PIR ها یکدیگر را خنثی کرده و در نتیجه اندازه متوسط دمای میدان دید از سیگنال الکتریکی برداشته می شود. این به سنسور اجازه می دهد تا در مقابل آشکارسازی خطا که ناشی از تشعشعات نوری یا روشنائی های بزرگ است، مقاومت کند. نورهای روشن پیوسته می تواند این سنسور را اشباع کرده و باعث می شود تا سنسور نتواند اطلاعات بیشتری را ثبت کند. در عین حال این ترکیب تفاضلی، تداخل مد مشترک را مینیمم می کند که مانع از راه اندازی ناشی از میدانهای الکتریکی نزدیک به وسیله می شود. به هر حال این ترکیب نمی تواند دما را اندازه گیری کند و مختص آشکار سازی اشیاء متحرک است.

آشکارسازهای مبتنی بر سنسورهای PIR

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

مکانیسم کوچکی برای متمرکز کردن انرژی اینفرارد دور دست به سطح سنسور بکار می رود. به این صورت که پنجره فوق الذکر را از لنزهای فشرده شده ای می سازند و گاهی اوقات از آینه های سهموی برای این کار استفاده می کنند. همچنین یک پنجره فیلتر برای محدود کردن طول موج ورودی بین 14-8 میکرومتر قرار می گیرد که مهمترین تشعشعات اینفرارد انسان در آن قرار دارد و قویترین آنها 9/4 میکرومتر است.

وسیله PIR می تواند به عنوان یک دوربین بکار رود که می تواند مقدار انرژی متمرکز شده اینفرارد را به سطح خود در خود برای چند لحظه نگه دارد. یک بار که توان به PIR اعمال شد، انرژی برای چند لحظه در حالت سکون می ماند و می تواند یک رله کوچک را تحریک کند. این رله می تواند دسته ای از اتصالات الکتریکی را کنترل کند که به ورودی هشدار یک آشکار ساز متصل است. اگر انرژی تمرکز شده در طول زمان تغییر کند این وسیله حالت هشدار را تغییر می دهد. این رله معمولا یک رله نرمال بسته (NC) یا فرم B است. برای اطلاعات بیشتر در مورد رله این مقاله را مطالعه نمائید.

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

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

همچنین توصیه شده که سنسور PIR در نزدیکی کانالهای هوا قرار نگیرد. زیرا با اینکه تشعشع اینفرارد هوا بسیار کم است ولی با خنک شدن پلاستیک محافظ و یا لنز می توانند به عنوان هدف خنک تلقی شده و هشدار را اشتباها فعال نمایند.

سنسورهای PIR با ترکیبات مختلف کاربردهای فراوانی دارد. اکثر کاربرد این سنسور در سیستمهای حفاظتی خانه است و رنجی در حدود 10 متر دارند. بعضی PIR های بزرگتر با یک آینه می توانند تغییرات اینفرارد را در 30 متری یا بیشتر حس کنند. همچنین PIR هائی وجود دارند که با آینه های چند جهتی می توانند میدان دید عریض تری در حدود 110 درجه یا برعکس باند باریک را حس کنند.

کنترل کننده های از راه دور حرارتی مبتنی بر سنسورهای PIR

طراحان از خاصیت اندازه گیری از راه دور سنسورهای PIR استفاده کرده و با استفاده از خروجی "غیر تفاضلی" سنسور برای کنترل حرارت استفاده می کنند. سیگنال خروجی با سیگنال کالیبره شده بر اساس جنس و حرارت دیده شده توسط سنسور، مقایسه می شود. بدون کالیبراسیون PIR فقط می تواند تغییرات دمائی را به ما نشان دهد و نمی تواند دمای حقیقی آن را به ما بدهد.
+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 19:4  توسط مديروبلاگ  | 

 
LM75






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

این سنسور به صورت SMT و برای کار با ولتاژ تغذیه 3/3 تا 5 ولت ساخته شده است . و میتواند دمای مورد نظر را با تفکیک پذیری نیم درجه از ۵۵ - تا ۱۲۵ + درجه سانتی گراد اندازه گیری کرد یکی از دیگران محاسن این سنسور این است که جریان لازم برای کارش در حدود ۲۵۰ میکرو آمپر است که این جریان در بعضی موارد به یک میلی آمپر هم میرسد . و در حالت خاموش در حدود یک میکرو آمپر جریان میکشد . در زیر شمای پایه های سنسور را مشاهده میکند . که تک تک آنها را برای شما تشریح میکنیم . همان طور که در شکل مشاهده میشود پایه های ۴ و ۸ پایه هایی تغذیه سنسور هستند و بنا به مدل سنسور از ۳.۳ تا ۵ ولت تغییر میکنند . در ضمن برای تغذیه حتما یک خازن 1. میکرو فاراد با ید به پایه 8 وصل شود .

پایه شماره ۳ میتواند هم به عنوان یک وقفه برای پروسسور استفاده شود هم میتواند محدوده بالایی را مشخص کند یعنی این که وقتی دما به محدوده بالایی ( ۷۵ درجه) رسید این سنسور این پایه را صفر میکند ( این پایه ACTIVE LOW است .)

همان طور که در مباحث ذکر شد این سنسور از پروتکل I2C استفاده کرده یعنی برای استفاده از این سنسور باید بتوانید با این سنسور ارتباط سریال داشته باشید که این یکی از محاسن این سنسور است . این سنسور ۸ پایه دارد .

*
پایه شماره ۱ و ۲ یعنی SDA و SCL پایه های ارتباط I2C سنسور هست که اقلب به میکرو ای که قادر به ارتباطات اینترفیس باشد وصل میشود .

*
پایه های ۵ و ۶ و ۷ این سه پایه یعنی A0 و A1 و A2 این سه پایه ادرس های اینترفیس سنسور هستند در پروتکل I2C فرمانده که میتواند یک میکرو باشد برای ارتباط با فرمانبر ها آنها را با یک اسم میشناسد که این است 8 بیت که 7 بیت اول نام سنسور است و بیت 8 به سنسور اعلام میکند که گیرنده باشد یا فرستنده . 4 بیت اول اسم سنسور 1001 است و غیر قابل تغییر است و سه بیت کم ارزش توسط این سه پایه تعریف میشود . که بهتر است هر سه صفر یا یک باشند .

همان طور که گفته شد بعد از ارتباط با سنسور و صدا کردن آن توسط بیت هشتم وضعیت سنسور را تعیین میکنیم یعنی به سنسور اعلام میکنیم که اطلاعات بفرستد یا اطلاعات بگیرد . که ما این وضعیت را 1 قرار داده و سنسور را فرستنده میکنیم تا میزان دما را برای ما بفرستد .
+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 18:41  توسط مديروبلاگ  | 

 
اصول و مبانی ترمیستورها

ترمیستور از مواد نیمه هادی ساخته می شود. ترمیستور از اکسید فلزاتی چون منگنز، نیکل، کبالت، مس و یا آهن همراه با سیلیکون ساخته می گردد. رنج دمای آن 50- تا 150 و نهایت 300 درجه سانتیگراد می باشد. در بیشتر مصارف مقاومت آن در دمای 25 درجه سانتیگراد( در RTD مقاومت آن نسبت به صفر درجه محاسبه می شد در ترمیستورها نسبت به 25 درجه سانتیگراد محاسبه می شود.) بین 100 تا 100کیلو اهم می باشد. البته ترمیستورهایی با مقاومت اولیه پایین تر از 10اهم و بالاتر از 40مگا اهم نیز استفاده می شود.

ترمیستورها به دو نوع تقسیم می شوند(Negative Temperature Coefficient NTC که با افزایش دما مقاومت آن کاهش می یابد و(Positive Temperature Coefficient) PTC که با افزایش دما مقاومت آن کاهش می یابد.

ترمیستور نوع NTC حساسیت 3- % تا 6- دارد که در مقایسه با RTD خیلی بالاتر است که باعث گشته سیگنال پاسخ بهتری نسبت به ترموکوپل و RTD داشته باشد، از جهت دیگر حساسیت پایین RTD و ترموکوپل آنها را انتخاب خوبی برای دماهای بیش از 260 درجه سانتیگراد کرده است و این محدودیتی برای ترمیستور است.

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

مدار بهسازی

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

روش دیگر استفاده از مدار تقسیم ولتاژ است.که به دلیل مقاومت زیاد ترمیستور راه حل مناسبی می باشد.

روش دیگر استفاده از مدار زیر است.میکروکنترلر PIC12C508 که توضیح داده می شود.



روش دیگر استفاده از مدار پایین است که روشی مشابه تقسیم ولتاژ می باشد. در این روش OP. Amp با نسبت مقاومت ترمیستور به Rs ولتاژ خروجی را تولید می کند.



یک کار دیگر استفاده از مدار مجتمع AD7711 است که یک A/D می باشد.





روش دیگر استفاده از مداری با IC ، AD7705 می باشد.

+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 18:39  توسط مديروبلاگ  | 

 
درایو دو موتور پله ای با میکروکنترلر PIC

نوان اصلی مقاله: Dual Stepper Motor Driver for a Robot Differential Drive

مقدمه: این مقاله سخت افزار و نرم افزار به کار رفته در کنترل دو موتور پله ای[1] را که برای روبوت های با درایور دیفرانسیلی , مناسب می باشند را شرح می دهد.این مدار دو کلمه دو بیتی را می پذیرد تا به هر یک از موتورها فرامین حرکت به جلو , عقب , تثبیت موقعیت و سکون را دهد.همچنین هرگاه یک پله(گام) شکل گرفت (طی شد) , یک سیگنال خروجی ایجاد می کند.این مدار طرحی مناسب می باشد که با آن میتوان تحریک سیم پیچ , سرعت موتور , شکل "کلمه کنترل [2] " وسایر پارامترهای موتورهای تک قطبی و دو قطبی مبتنی بر میکروکنترلر را اصلاح کرد.نرم افزار آن نیز , به زبانهای C و Assembly تهیه شده است.

مدار سخت افزار:

مدار مذکور شامل سه آی سی است: PIC16F84 وهمچنین دو درایور پل [3] H ,L293D برای موتورهای پله ای دوقطبی(شکل پایین) یا دو ULN2803 برای موتور پله ای های تک قطبی.سوای منابع تغذیه , قطعات مدار تنها به :نوسانساز 4MHz , یک مقاومت بالاکش[4] 10 کیلو اهم و چند کانکتور محدود می شود.در این طرح یک بسته 6 تایی از باتری های 1.2 ولتی ,که اختلاف پتانسیل7.2 ولت تولید می کنند به طور خطی تنظیم(رگوله) می شوند تا تغذیه منطقی 5 ولتی را تامین نمایند.افت ولتاژ ترانزیستورهای دوقطبی درایور , به ولتاژ 7.2 ولت اجازه نمی دهد موتور را بیش از توان آن درایو کند.

" کلمه کنترل"به دو کلمه کنترل 2 بیتی شکسته شده است:دوبیت باارزش ترکه بیتهای 2و3 از PORTA هستند , موتورسمت چپ را کنترل نموده و دو بیت کم ارزش تر یعنی بیتهای 0 ,1 از PORTA موتور سمت راست را کنترل می کنند.برای این مقادیر:00 ,01 ,10 ,11 , کلمه کنترل به موتورها به ترتیب فرامین:جلو ,عقب,تثبیت موقعیت و سکون رامی دهد.این ترتیب را می توان به سادگی عوض کرد(نرم افزار پایین را ببینید)

بنا به مدار طراحی شده,امکان کنترل سرعت موتور فراهم شده است.بخصوص این که به پالس های کنترلی متناوب برای پیشبرد موتورها نیازی نیست.بعلاوه هنگامی که یک گام(پله) طی شد,مداریک سیگنال خروجی در بیت 4 از PORTA تولید می کند.کنترل کننده اصلی می تواند این سیگنال را بازبینی کند تا هنگامیکه کلمه کنترل بایستیتغییر کند را مشخص کند.به عنوان مثال برای اینکهفاصله معینی به جلو حرکت نماید, پردازنده اصلی , تعداد گام های لازم برای دستیابی به این هدف را محاسبه نموده و به این ترتیب فرمان رو به جلو را به موتور صادر می کند.وقتی که تعداد گام های لازم طی شد ,کلمه کنترل می تواند به وضعیت ایست تغییر کند یا مجددا حرکت نماید.در اکثر پردازنده ها عمل شمردن گام ها(پله ها) را می توان به یک فعالیت در پس زمینه موکول کرد تا این امر در هر زمان وبدون دخالت کاربر صورت گیرد.

نرم افزار:

دو نسخه از نرم افزار موجود است.این یکی در C2C که نسخه ای خاص از زبان C است و دیگری در زبان اسمبلی که با کمک چند ماکرو ساختارهای برنامه نویسی سطح بالا ایجاد می کند.

برنامه اصلی به سادگی و به تناوب ,PORTA را جهت یافتن تغییر در کلمه کنترل می خواند.این فرایند هر از چند گاهی هنگامی کهموتور به یک تحریک جدید نیاز داشته باشد توسط وقفه TMR0 متوقف می شود.چون تحریک موتوردوره ای است , کنترل موتور در پس زمینه اجرا می شود.

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

این خطوط شبیه کدنرم افزار هستند:



مدار سخت افزار:

مدار مذکور شامل سه آی سی است: PIC16F84 وهمچنین دو درایور پل [3] H ,L293D برای موتورهای پله ای دوقطبی(شکل پایین) یا دو ULN2803 برای موتور پله ای های تک قطبی.سوای منابع تغذیه , قطعات مدار تنها به :نوسانساز 4MHz , یک مقاومت بالاکش[4] 10 کیلو اهم و چند کانکتور محدود می شود.در این طرح یک بسته 6 تایی از باتری های 1.2 ولتی ,که اختلاف پتانسیل7.2 ولت تولید می کنند به طور خطی تنظیم(رگوله) می شوند تا تغذیه منطقی 5 ولتی را تامین نمایند.افت ولتاژ ترانزیستورهای دوقطبی درایور , به ولتاژ 7.2 ولت اجازه نمی دهد موتور را بیش از توان آن درایو کند.

" کلمه کنترل"به دو کلمه کنترل 2 بیتی شکسته شده است:دوبیت باارزش ترکه بیتهای 2و3 از PORTA هستند , موتورسمت چپ را کنترل نموده و دو بیت کم ارزش تر یعنی بیتهای 0 ,1 از PORTA موتور سمت راست را کنترل می کنند.برای این مقادیر:00 ,01 ,10 ,11 , کلمه کنترل به موتورها به ترتیب فرامین:جلو ,عقب,تثبیت موقعیت و سکون رامی دهد.این ترتیب را می توان به سادگی عوض کرد(نرم افزار پایین را ببینید)

بنا به مدار طراحی شده,امکان کنترل سرعت موتور فراهم شده است.بخصوص این که به پالس های کنترلی متناوب برای پیشبرد موتورها نیازی نیست.بعلاوه هنگامی که یک گام(پله) طی شد,مداریک سیگنال خروجی در بیت 4 از PORTA تولید می کند.کنترل کننده اصلی می تواند این سیگنال را بازبینی کند تا هنگامیکه کلمه کنترل بایستیتغییر کند را مشخص کند.به عنوان مثال برای اینکهفاصله معینی به جلو حرکت نماید, پردازنده اصلی , تعداد گام های لازم برای دستیابی به این هدف را محاسبه نموده و به این ترتیب فرمان رو به جلو را به موتور صادر می کند.وقتی که تعداد گام های لازم طی شد ,کلمه کنترل می تواند به وضعیت ایست تغییر کند یا مجددا حرکت نماید.در اکثر پردازنده ها عمل شمردن گام ها(پله ها) را می توان به یک فعالیت در پس زمینه موکول کرد تا این امر در هر زمان وبدون دخالت کاربر صورت گیرد.

نرم افزار:

دو نسخه از نرم افزار موجود است.این یکی در C2C که نسخه ای خاص از زبان C است و دیگری در زبان اسمبلی که با کمک چند ماکرو ساختارهای برنامه نویسی سطح بالا ایجاد می کند.

برنامه اصلی به سادگی و به تناوب ,PORTA را جهت یافتن تغییر در کلمه کنترل می خواند.این فرایند هر از چند گاهی هنگامی کهموتور به یک تحریک جدید نیاز داشته باشد توسط وقفه TMR0 متوقف می شود.چون تحریک موتوردوره ای است , کنترل موتور در پس زمینه اجرا می شود.

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

این خطوطشبه کدنرم افزار هستند:

كد:


Constants
EXCITATION_TABLE_SIZE = 4  // number of excitations in sequence 
TMR0_CNT_UP  = 100 // 256 - duration (motor speed)
// Motor states
RIGHT_FORWARD  = 0  // These can be re-ordered
RIGHT_BACKWARD = 1
RIGHT_HOLD  = 2
RIGHT_IDLE  = 3
LEFT_FORWARD  = 0   // Above states shifted 2 bits left (multiplied by 4)
LEFT_BACKWARD  = 4
LEFT_HOLD  = 8
LEFT_IDLE  = 12
GlobalVariables
leftExcitationCntr  // current left motor excitation number
rightExcitationCntr  // current right motor excitation number
motorState   // 4 bit function word for both motors
excitations[] = {11000000b, // Excitation table - if the table is changed in size,
  01100000b, // then the EXCITATION_TABLE_SIZE constant
  00110000b, // must be changed
  10010000b}
Functions
motorISR // Motor Interrupt Service Routine
  // Modifies global variables leftExcitationCntr and rightExcitationCntr as a function of motorState.
  // It uses these counters as indices to read the motor excitation from the table and outputs it to PORTB.
  LocalVariables leftExcitation, rightExcitation 
 

 if (motorState is RIGHT_FORWARD)
  if (rightExcitationCntr = EXCITATION_TABLE_SIZE-1)
  rightExcitationCntr = 0
  else
  increment rightExcitationCntr
  rightExcitation = excitations[rightExcitationCntr]
  else if (motorState is RIGHT_BACKWARD)
  if (rightExcitationCntr = 0)
  rightExcitationCntr = EXCITATION_TABLE_SIZE-1
  else
  decrement rightExcitationCntr
  rightExcitation = excitations[rightExcitationCntr] 
  else if (motorState is RIGHT_HOLD)
  rightExcitation = excitations[rightExcitationCntr]
  else // RIGHT_IDLE
  rightExcitation = 0
  shift rightExcitation 4 bits right
  if (motorState is LEFT_FORWARD)
  if (leftExcitationCntr = EXCITATION_TABLE_SIZE-1)
  leftExcitationCntr = 0
  else
  increment leftExcitationCntr
  leftExcitation = excitations[leftExcitationCntr] 
  else if (motorState is LEFT_BACKWARD)
  if (leftExcitationCntr = 0)
  leftExcitationCntr = EXCITATION_TABLE_SIZE-1
  else
  decrement leftExcitationCntr
  leftExcitation = excitations[leftExcitationCntr] 
  else if (motorState is LEFT_HOLD)
  leftExcitation = excitations[leftExcitationCntr] 
  else
  leftExcitation = 0
  PORTB = leftExcitation + rightExcitation
end motorISR
interrupt  // Main interrupt service routine gets control when TMR0 overflows
  if (TMR0 overflowed causing an interrupt)
  bit 4 of PORTA = 1   // signal motor step on
  call motorISR   // call motor interrupt service routine
  bit 4 of PORTA = 0   // signal motor step off
  TMR0 = TMR0_CNT_UP;   // reset TMR0 to proper count
end interrupt
main
  set TMR0 prescaler = 64  // divides clock by value set
  bit 4 of PORTA = 0   // signal motor step off
  leftExcitationCntr  = 0
  rightExcitationCntr = 0
  TMR0 =  TMR0_CNT_UP;
  enable TMR0 interrupts
  while (1)   // continuously update motorState (and wait
  motorState = PORTA   //  for a TMR0 interrupt)
end main
 



جمع بندی:

یک درایور معمولی موتور پله ای (هر چند ناقص) که مبتنی بر میکروکنترلر بود ,طراحی شده و با موفقیت ساخته شد.از آنجا که تنها 124 تا از 1024 کلمه حافظه PIC16F84 استفاده شد(در زبان اسمبلی) , می توان خواصی نظیرافزایش سرعت و کاهش سرعت را نیز به آن اضافه نمود.همه 13 خط ورودی/خروجی در طرح حاضر استفاده شدند , بنابراین سیگنال های کنترلی خارجی اضافه بر این, به یک ارتقا در میکروکنترلرPIC شما نیازمندند.با PIC16F876 که دارای امکاناتی همچون "مدولاسیون پهنای پالس [5] " و تبدیل آنالوگ به دیجیتال است , ممکن است بتوانید درایو برشگر[6] طراحی نمایید.

[1] StepperMotor

[2] Control Word

[3] H-Bridge

[4] Pul-Up

[5] Pulse Width Modulation

[6] Chopper-Drive

+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 18:1  توسط مديروبلاگ  | 

PWM:

اين کلمه مخفف Pulse Width Modulation به معنای مدولاسيون پهنای پالس می باشد. يا به عبارتی ديگر يعنی با تغييراتی در پهنای پالس، توان (قدرت) الکتريکی انتقالی به موتور را کاهش يا افزايش می دهيم. وقتی مي گوئيم موتور DC با ولتاژ DC دارای دور نامی مشخصی می باشد، يعنی اگر ولتاژی با مقدار معين را در سر موتور قرار دهيم، در اين صورت قدرت انتقالی به موتور ثابت بوده و در نتيجه موتور با دور نامی خود، کار خواهد کرد. ولتاژ DC يعنی ولتاژ ثابت. ميدانيم که يک ولتاژ ثابت همان پالس با پهنا پالس دلخواه است. يعنی به ازای اين مقادير زمانی ولتاژ دو سر بار مقداری مستقيم است. حال اگر ما به هر نحوی اين ولتاژ مستقيم روی دو سر موتور را کاهش دهيم، نتيجتاً قدرت انتقالی به موتور و در نتيجه دور موتور کمتر خواهد بود. با ادامه بحث هر چه بيشتر متوجه منظورم خواهيد شد.
اصل و مبنای PWM تغيير (مدوله کردن) پهنای پالس و در نتيجه تغيير مقدار متوسط ولتاژ موج است.در صورتی که يک موج مربعی را در نظر بگيريم، در اين صورت خواهيم داشت:



می دانيم:



در شکل موج فوق،



که در آن y مقدار ولتاژ يكسو شده ميباشد.

روش های توليد PWM:
1) ساده ترين راه ايجاد PWM استفاده از يک موج اره ای و يک موج سينوسی ايجاد ده توسط اسيلاتور می باشد. حال کافی است تا با استفاده از يک Op-Amp اين دو ولتاژ را با يکديگر مقايسه شوند. در صورتی که ولتاژ سبز رنگ در شکل زير بيشتر از ولتاژ آبی رنگ باشد، سطح ولتاژ بالا و در صورتی که منحنی سبز رنگ از منحنی آبی رنگ پائين تر باشد، سطح ولتاژ پائين خواهد بود.



2) روش DELTA:
در اين روش ولتاژ خروجی با دو سطح ولتاژ معين که يکی از آنها همان مقدار ولتاژ اول با مقداری Offset مي باشد، مقايسه ميشود. در صورتی که ولتاژ خروجی از يکی از اين دو محدوديت افزايش يا کاهش يابد، در اين صورت سطح ولتاژ پالس نيز تغيير خواهد کرد. شکل زير بيان گر اين موضوع می باشد.



روش 3) در اين روش ولتاژ خروجی از يک ولتاژ مرجع کمتر ميشود، در صورتی که مجموع اين ولتاژ خطا ( تفاضل ولتاژ خروجی از ولتاژ مرجع) از مقدار معينی بيشتر شود، سطح ولتاژ خروجی عوض ميشود.

روش 4) بسياری از مدارات ديجيتال می توانند PWM توليد کنند. برای مثال بسياری از ميکروپروسسور ها دارای خروجی PWM می باشند. معمولاً اين ميکروپروسسور ها درای شمارنده ای می باشند که پس از زمان معينی سطح ولتاژ خروجی را تغيير می دهند.

علاوه بر روش های گفته شده برای توليد PWM، سه حالت کلی برای PWM موجود می باشد:
1) مرکز پالس در روی محور زمانی ثابت باشد و با افزايش يا کاهش کناره های (لبه های کناری) مدولاسيون پالس رو تغيير دهيم.
2) لبه بالايی را ثابت نگه داريم و لبه پايينی را تغيير دهيم
3) لبه پايينی را ثابت نگه داريم و لبه بالايی را تغيير دهيم.
از ساير موارد کار برد PWM علاوه بر کنترل دور موتور، می توان کار برد آن در مخابرات و تنظيم ولتاژ و پخش توان اشاره کرد.

+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 17:51  توسط مديروبلاگ  | 

 

 

در این بخش آموزش برنامه نویسی سی کد ویژن قرار می گیرد
avr-->c-->code
vision

اولین قدم شناخت شکل کلی برنامه نویسی سی است

سرامد
متغیر های عمومی
تعریف توابع
تابع اصلی
{
متغیر محلی
تعریف سخت افراری
برنامه اصلی
}
تشریح توابع

 

سرامد ها برنامه هایی از پیش نوشته شده اند که برای جلوگیری از نوشتن چند باره ی آن ها در برنامه متعدد ایجاد شده اند
شکل کلی سرامد به صورت زیر می باشد
#include <
نام سرایند . h >
از سرامد های پرکاربرد می توان به سرامد میکروکنترلر اشاره کرد که در هر برنامه ای ضروری است و کار شناسایی سخت افزار های داخلی میکرو کنترلر را بر عهده دارد
و از دیگر سرامد ها می توان به سرامد کیبرد موشواره ال سی دی ها ی گرافیکی دوربین ها و ... اشاره کرد

 

 

متغیر ها مکان هایی از حافظه اند که مقادیری می گیرند .
متغیر ها به صورت زیر تعریف میشوند
نام متغییر نوع متغیر
-
در کد ویژن متغیر ها یکی از صورت های زیر است
bit :
اعداد بولی 0 یا 1 که یک بیت حافظه اشغال می کند
char :
اعداد صحیح بین -128 و 127 که یک بایت حافظه اشغال می کنند
int :
اعداد صحیح بین -32768 و 32767 که دو بایت حافظه اشغال می کنند
long :
اعداد صحیح بین -2^31 و 2^31-1 که چهار بایت حافظه اشغال می کنند
float :
اعداد اعشاری بین +_ 1/175*10^-38- و +_ 3/402*10^38 که چهار بایت حافظه اشغال می کند
double :
اعداد اعشاری با دقت مضاعف که هشت بایت اشغال می کند
اگر قبل از نوع متغیر صحیح از کلمه ی
unsigned
استفاده شود منفی آن متغییر از بین رفته و حداکثر مقادیر آن دو برابر می شود

 

متغیر ها در سه جا می توانند ذخیره شوند

در ram برای این کار هیچ پییشوندی لازم نیست

در rom برای این کار از پیشوند eeorom استفاده می شود

در flash برای این کار از پیشوند flash استفاده می شود

متغیر های که در رم ذخیره می شوند پس از ریست از بین می روند

متغیر هایی که در فلش ذخیره می شوند ثابت می باشند و امکان مقدار دادن در ادامه برنامه به آن موچود نمی باشد

همچنین استفاده از پیشوند باعث ثابت شدن متغیذ می شود

متغیر ها یا محلی اند و یا عمومی اند

اگر در اول برنامه قبل از تابع main تعریف شده یاشند متغیر عمومی و اگر در داخل یک تابع تعربف شده باشند متغیر محلی اند

از متغیر عمومی در تمام قسمت های برنامه می توان استفاده کرد

ولی از متغیر محلی فقط در داخل همان تابع استفاده می شود و با اتمام اجرای تابع آن ها ازبین می روند

 

 

آرایه ها n بعدی ماتریس های n بعدی هستند که به صورت زیر تعیریف می شوند

كد:


جنس اعضا نام آرایه [تعداد اعضای بعد اول] [تعداد اعضای بعد دوم] [تعداد اعضای بعد سوم] ...

 

كد:

int robot [23][245][24][4]


اگر جنس اعضا از نوع char باشد به آرایه ؛ رشته نیز می گویند

كد:

char string [10][15]

 

 


آرایه ها نیز مانند متغیر ها داری دو نوع محلی عمومی می باشد

 

ساختمان ها مجموعه هایی از متغیر ها ثابت ها رشته ها آرایه ها و ساختمان های دیگر هستند
اگر شما از یک شی مشخصاتی دارید بهترین وسیله برای بیان ساختمان می باشد وبه صورت زیر تعریف می شود

كد:


stract
نام ساختمان
{
اعضا
}
شی هایی از نوع ساختمان;

 

كد:



struct avr
{
type
name
pin
vcc
{
atmega32,tiny11,atmega5660;


برای استفاده از ساختمان از کل به جز حرکت کرده و وسط آن نقطه می گذاریم


كد:

ali.dars.omumi.farsi=13

 

 

اشاره گر ها مکان هایی از حافظاه اند که به آدرس متغییر دیگری اشاره می کنند و به صورت زیر تعریف می شوند

كد:

جنس اشاره گر * نام اشاره گر

 

كد:


int a;
int *b;
b = &a;


اشاره گر ها فقط آدرس متغیر ها از جنس خود را نگه می دارند و دادن آدرس دیگر متغیر ها غلط است

 

 

عملگر ها قسمت اول

+
جمع
-
تفریق
*
ضرب
/
تقسیم
++
افزایش یک واحدی
--
کاهش یک واحدی
%
باقی مانده ی تقسیم
=
انتساب
>>
شیفت به چپ
<<
شیفت به راست
~ not
منطقی
& and
منطقی
| or
منطقی
! not
بولی
&& and
بولی
|| or
بولی
=+
اول جمع سپس انتساب
=-
اول تفریق سپس انتساب
=*
اول ضرب سپس انتساب
=/
اول تقسیم سپس انتساب
=%
اول باقی مانده سپس انتساب
==
شرط برابری
=!
شرط نابرابری
<
شرط بزرگتر بودن
>
شرط کوچکتر بودن
=>
شرط کوچکتر یا مساوی بودن
=<
شرط بزرگتر یا مساوی بودن
&
استخراج آدرس
*
روجوع به آدرس

 

عملگر ها قسمت دوم

کدهای دوگانه ی زیر برابرند

كد:


c =a + c ;
-------------------------
c + = a ;

 

كد:


d = a - d;
-------------------------
d - = a ;

 

كد:


e = a * e ;
---------------------
e * = a ;

 

كد:


f = a + f ;
--------------------
f * = a ;

 

كد:


g = a / g ;
-----------------
g / = a ;

 

كد:


h = a % h ;
-----------------------
h % = a;

 

كد:


a = b ;
------------
k = & a ;
b = * k ;

 

توابع

تابع ها قسنت هایی در برنامه هستند که کد ها در داخل آن ها اجرا می شود هر تابع اول باید تعریف شوند سپس استفاده شوند و در آخر تشریح شوند

تعریف توابع
تعزیف ها در اول برنامه نوشته شود

كد:

جنس خروجی نام تابع ( جیس وروذی اول , جنس وروذی دوم , ... )



مانند

كد:


float ave (int , float [16] );

void chap (void);

int rotbe (void) ;

bit and (bit , bit ) ;


استفاده از توابع

توابع برای این که شروع به کار کنند کافی است اسم آن ها آورده شود به همراه مقدار ورودی ها
الین تابعی که بدون فراخوانی و تعربف در اول شروع برنامه اجرا می شود تابع main است
پس توابع را باید در توابع دیگر صدا زد

برای مثال فراخوانی توابع بالا

كد:


y = ave ( 6 , stdudent) ;

 chap( ) ;

z= rotbe ( ) ;

a = and ( 1 , k ) ;


تشریح توابع

 


در پایان برنامه باید توابع تشریح شوند که به صورت زیر به کار می روند

كد:


جنس خروجی نام تابع ( جنس ورودی اول نام وردی اول , ... )
}
دستورات تابع
بازگشت خروجی
{




مانند

كد:


float ave (int tedad , float nomre [16] );
{
for ( i=1  ; i{
sum+=nomre[i-1] ;
}
return (sum/tedad) ;
}

 

if

در برنامه نویسی از این دستور زیاد استفاده می شود

و برای گذاشتن شرط بدون حلقه به کار می رود

كد:


اگر ( شرط )
{
دستورات
}
در غیر این صورت
{
دستورات
}




مانند

كد:


if (a<=b)
{
a = 10 ;
b = 20 ;
}
else
{
a = 1 ;
b = a ;
}

 

 

حلقه شرطی شمارشی for

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

كد:


برای (دستور اولیه ؛ شرط ؛ دستور پایان حلقه )
{
دستورات
}



مانند

كد:


for ( i=0 ; i<100 ; i=i+2)
{
PORTA=i;
}

 

 

حلقه ی while

وقتی می خواهیم یک سری دستور تا وقتی شرطی برقرار است تکرار شوند از این دستور استفاده می شود

كد:


تا وقتی که ( شرط )
{
دستورات
}



یا


كد:

انجام بده
{
دستورات
}
تا وقتی که ( شرط ) ؛



فرق اولی با دومی آن است که در دومی اول یک بار دستورات انجام می شود وسپس مانند اولی می گردد

برای ایجاد حلقه بی نهایت کافیست شرط را برابر عدد مثبتی قرار دهیم

مانند

كد:


while(a==b)
{
{ PORTA=0x12;
}

 

كد:


do
{
PORTB=0x00 ;
}
while (b

 

كد:


while ( 1)
{
PORTC=PIND ;
}

 

درگاه

هر پایه avr قبل از استفاده باید تعریف شود
هر درگاه از 3 ثبات تشکیل شده که با مقدار دادن به آن ها خاصیت آن درگاه را می توان تغییر داد

ثبات DDR

از این ثبات برای تعیین ورودی خروجی استفاده می شود و اگر به آن مقدار صفر بدهیم ورودی و اگر مقدار یک بدهیم خروجی می شود

كد:


DDRA.4=1 ;

DDRC.2=0 ;



اگر بخواهیم کل یک پورت را یکجا مقدار دهیم باید مقدار آن را به صورت مبنای 16 در آوریم

كد:


DDRA=0x00 ;

DDRB=0xBE ;

DDRC=0xFF ;



ثبات PORT

اگر درگاه خروجی بتشد با مقدار صفر دادن به آن درگاه ولتاژ زمین و با یک دادن به آن درگاه ولتاز VCC به خود می گیرد


كد:


 PORTA=0x16 ;

PORTD.5=1 ;


ثبات PIN

از این ثبات برای خواندن مقدار درگاه های ورودی استفاده می شود


كد:


A = PINA ;

MEQ = PIND.2 ;

 

 

 

سرامد delay

وقتی شما از این سرامد در اول برنامه به صورت زیر استفاده می منید

كد:

#include



انگاه قادر به استفاده از دو تابغ زیر هستید


كد:

delay_us( عدد ) ;



که باعث می شود به اندازه آن عدد میکروثانیه ادامه برنامه متوقف بشود


كد:

delay_ms(  عدد ) ;



که باعث می شود به مقدار عدد میلی ثانیه ادامه برنامه متوقف شود

 

اولین برنامه  

چشمک زن

اگر به هر یک از پایه های پورت a یک led با مقاومت 220 اهم وصل نمایید شروع به چشمک زدن می نماید

كد:

//strat program
// http://robot.freeforums.org
#include
#include
void main(void)
{
   // port a khoroji
   DDRA=0xFF;
        while (1)
   {
      PORTA=0x00;
      delay_ms(500);
      PORTA=0xFF;
      delay_ms(500);
   }
}//end program

 

 

 

+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 17:43  توسط مديروبلاگ  | 

 
الگوریتم های حل ماز میکرو ماوس هزار تو لابیرنت

 



1- الگوریتم دنبال کردن دیواره ها

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

الگوریتم دنبال کردن دیواره ها در مازهای سه بعدی نیز عملی است. مثلا در یک ماز سه بعدی مسیر های رو به بالا می توانند شمال غرب و مسیرهای رو به پایین جنوب شرق فرض شوند و با روش دنبال کردن دیواره ها به نتیجه رسید.

2- الگوریتم Pledge

ماز های گسسته را می توان به روش دنبال کردن دیواه ها حل کرد، در صورتی که ورودی و خروجی ماز روی دیواره های خارجی ماز قرار داشته باشند. چنانچه از درون ماز شروع به حرکت کنیم، ممکن است الگوریتم دنبال کردن دیواره ها در قسمت گسسته ای که شامل خروجی نیست دائما یک حلقه را طی کند. الگوریتم Pledge می تواند این گونه مسائل را حل کند.

الگوریتم Pledge برای رفع موانع، به طی یک مسیر اختیاری نیاز دارد. هنگام مواجهه با مانع،یک دست (مثلا دست راست) را در امتداد مانع نگه می داریم در حالیکه زوایای چرخش شمرده می شود. وقتی دوباره در راستای مسیر اصلی قرار گرفتیم و جمع زاویه ای چرخش ها برابر صفر شد، می توان مانع را ترک کرد و در راستای مسیر اصلی حرکت نمود. این الگوریتم به شخص اجازه ی جهت یابی را در شروع از هر نقطه برای خارج از مازهای دوبعدی، را می دهد.

3- الگوریتم جستجوی تصادفی

این الگوریتم یک روش ضعیف است که به وسیله ی ربات های غیر هوشمند یا موش قابل اجراست، اما تضمینی برای رسیدن به هدف وجود ندارد. در این الگوریتم یک مسیر مستقیم طی می شود تا به اولین مانع برسد، سپس یک مسیر تصادفی را برای ادامه انتخاب می کند. این الگوریتم در صورتی که خروجی به صورت یک سوراخ در میانه ی دیوار باشد، با شکست مواجه می شود.

4- الگوریتم Tremaux

الگوریتم Tremaux یک روش کارآمد است که در آن مسیرهای طی شده با رسم خطوط نشان دار می شوند. این الگوریتم برای همه ی مازهایی که مسیر های خوش تعریف دارند، عملی است. با رسیدن به تقاطع های بی نشان، می توان یکی از جهت های ممکن را انتخاب کرد. اگر یک تقاطع قبلا طی شده باشد می توان مسیر طی شده را باز گشت. اگر نیاز به طی مسیری باشد که نشان دار است، می توان خط دیگری رسم کرد و تقاطع بعدی ممکن است شامل مسیر غیر نشان دار باشد. در این روش نیاز به طی مسیری بیش از دو بار نمی باشد و اگر خروجی وجود نداشته باشد، این روش با نقطه ی شروع ماز بر می گردد.
+ نوشته شده در  دوشنبه پانزدهم بهمن 1386ساعت 17:14  توسط مديروبلاگ  |