سایز سوراخ مناسب برای قلاویز
۲۷ آذر ۱۳۹۷۲-۲ ایجاد تاخیر زمانی با استفاده از دستور delay و ساخت LED چشمک زن
۲۷ آذر ۱۳۹۷همانطور که در فصل قبل مشاهده کردید تعدادی کثیری از پایههای یک میکروکنترلر AVR قابلیت انجام اعمال مربوط به Input/Output را دارند. این بدین معناست که یک پایه با قابلیت I/O میتواند هم بهعنوان ورودی در نظر گرفته شود هم بهعنوان خروجی و این وابسته به تعریفی است که ما برای این پایهها در کد خود ارائه میدهیم.
در این فصل تنها با قابلیت Output بودن این پایهها کار میکنیم و در نهایت با انجام چند پروژهی عملی سعی میکنیم شما را با این مفهوم کاملا آشنا سازیم. همانطور که از معنی کلمهی Output دریافت میشود، پایههایی که این قابلیت را دارند میتوانند در مواقع مورد نیاز بر رویشان ولتاژ خاصی قرار گیرد که ما به این حالت میگوییم پایه در حالت on قرار گرفته است. در این حالت اگر Voltmeter خود را بین پایهی میکرو و زمین قراردهید (یعنی یک پراب از Voltmeter را به پایهی میکرو و پراب دیگر را به GND متصل کنید) خواهید دید که Voltmeter عددی در حدود ۵ ولت را به شما نشان میدهد.
حداکثر میزان جریانی که یک پایه از میکروکنترلر میتواند آن را از خود عبور دهد محدود است. این به این مفهوم است که شمار وسایلی که قرار است توسط یک پایهی خاص از میکروکنترلر که قبلا به عنوان خروجی تعریف شده است کنترل شود محدود است و ما نمیتوانیم به هر تعداد که خواستیم مصرف کننده در مسیر این پایه قرار دهیم.
مباحث بالا تحت عنوان Fan Out در میکروالکترونیک مطرح میشوند که خارج از بحث ما میباشند و در اینجا هدف از آوردن این بحث ایجاد یک دید کلی در شما برای درک محدودیتهای این پایهها بود. همچنین در آخر این فصل به بحث در مورد راه اندازهای (Deriver) موتورهای الکتریکی و معرفی چند نوع خاص از موتورها پرداخته میشود. در پایان این فصل انتظار میرود شما بتوانید یک موتور DC را با یک درایور خاص به کار بیندازید.
در هنگام ساختن یک پروژهی جدید درنرمافزار CodeVision به کمک Code Wizard این برنامه، اگر به بخش Ports بروید همانطور که در فصل قبل هم دیدید با منویی از قابلیتها و پورتهای یک میکروکنترلر مواجه میشوید.
اگر یک پورت خاص را انتخاب کنید همانند شکل ۱ در جلوی نام هر پایه یک کلمهی In نوشته شده است.
با کلیک کردن روی این کلمه مشاهده میکنید که کلمهی In به کلمهی Out تغییر پیدا میکند.
در این حالت پایهی مورد نظر در حالت خروجی قرار گرفته است. مثلا در شکل صفحه قبل پایهی صفرم از پورت A به عنوان خروجی انتخاب شده است و بقیهی پایهها این قابلیت را ندارند. (درحالت ورودی تنظیم شده اند) حال به شکل زیر نگاهی بیندازید:
همانطور که در شکل میبینید پینهای ۰ تا ۳ از یک میکروکنترلر ATmega32 بهعنوان خروجی درنظر گرفته شدهاند. حال اگر به ردیف مقابل که با عنوان Pull up/Output Value مشخص شده است نگاه کنید، مشاهده میکنید که عدد صفر در ابتدا در جلوی نام Out آورده شده است. با کلیک کردن روی این عدد مقدار آن از صفر به یک تغییر میکند. حال این سئوال پیش میآید که این صفر و یک به چه معناست؟
در الکترونیک دیجیتال بیش از این که به دنبال اندازهگیری میزان دقیق ولتاژ و جریان نقاط مختلف باشیم به دنبال این هستیم که یک نقطه از مدار ما در چه سطحی قرار دارد. اما باز این مفهوم که در چه سطحی قرار داریم به چه معناست؟ در الکترونیک دیجیتال که در اینجا بحث در مورد الکترونیک دیجیتال میکروکنترلرهای AVR است به ولتاژهایی در حدود ۵+ ولت سطح ۱ را نسبت میدهند و به ولتاژهایی نزدیک ۰ ولت سطح صفر را نسبت میدهند.
البته همان طور که گفته شد ولتاژهایی نزدیک ۵+ ولت، که به این معناست که یک میکروکنترلر با توجه به ویژگیهای ساختاریاش میتواند ولتاژهایی حتی بین ۲.۷ ولت تا ۵.۴ ولت را نیز به عنوان سطح ۱ در نظر بگیرد و میکروکنترلر دیگر ولتاژهایی بین ۴.۷ ولت تا ۵.۲ ولت و این ویژگیایی است که وابسته به مشخصات خاص هر نوع میکروکنترلر است و در برگهی اطلاعات این میکرو کنترلرها تمام این اطلاعات موجود است.
در اینجا چون بیشتر مباحث حول شبیهسازی است و در شبیهسازی اغلب همه چیز در ایدهآلترین شکل خود است با این مسائل زیاد برخورد نداریم، اما به هنگام ورود به مرحلهی واقعیت و خصوصا در مدارات پیچیدهی الکترونیکی این مسئله به شکل قابل لمسی درمیآید. به همین دلیل دانستن این مطالب علاوه بر این که درک الکترونیک دیجیتالی شما را بالا میبرد در مسائل عملی نیز کاربردی است.
حال به بحث خود باز میگردیم.
اما این عدد صفر که در جلوی نام Out آورده شده است به چه معناست؟
به این معناست که زمانی که شما یک پایه را به عنوان خروجی تعریف میکنید آن پایه به عنوان یک Output در میکرو شناخته میشود. اما این مطلب به تنهایی کافی نیست بلکه شما باید سطح ولتاژی را که این پایه باید به هنگام شروع کار داشته باشد را نیز به آن بدهید.
در این جا اگر صفر را انتخاب کنیم به این معناست پایهای که ما به عنوان خروجی انتخاب کردهایم در ابتدا دارای ولتاژی نزدیک به صفر است و در عین حال اگر عدد ۱ را انتخاب کنیم به این معناست که پایهای که ما به عنوان خروجی انتخاب کردهایم در ابتدا دارای ولتاژی نزدیک به ۵+ ولت است.
حال برای تست این ویژگی به عنوان اولین پروژه این خاصیت را چک میکنیم. برای این کار پس از اینکه تنظیمات بالا را انجام دادید با اضافه کردن یک میکرو کنترلر ATmega32 در نرمافزار Proteus و ریختن فایل HEX برنامه بر روی آن شروع به تست کردن برنامه میکنیم. در اینجا نیازی به اضافه کردن حتی یک خط کد هم نیست.
اما قبل از این کار با اضافه کردن چهار LED نورانی (LED ها همانند دیودها هستند ولی به هنگام عبور جریان از آنها اگر در جهت درست قرار گرفته باشند از خود نور ساطع میکنند) و چند مقاومت به پایههای A0 تا A3 این پروژه را تکمیل میکنیم. برای انتخاب LED ها در منوی جستجوی Proteus کلمهی LED-BLUE یا LED-RED را بزنید. برای انتخاب مقاومت در منوی جستجوی Proteus کلمهی RES را بزنید و سپس دکمهی enter را بزنید.
حال مدار زیر را در Proteus طراحی کنید.
پساز قرار دادن مقاومتها در مدار با دوبار کلیک کردن روی هر مقاومت در بخش Resistance مقدار مقاومت را روی ۲۷۰ تنظیم کنید. این عدد به اهم است، همچنین علت قرار دادن مقاومت بر سرراه LED به طور مختصر جلوگیری از آسیب دیدن خود LED و هم میکرو کنترلر است، پس در پروژههای خود همواره به این نکته که همیشه یک مقاومت باید بر سر راه LED تا زمین باشد توجه کنید.
حال پروژه را در این حالت اجرا کنید.
با شکلی مشابه زیر مواجه میشوید.
در شکل بالا همانطور که میبینید LED های با رنگ آبی روشن شدهاند و LED های با رنگ خاکستری خاموش هستند. با انجام پروژهی بالا به وضوح مشاهده میکنید که مقدار دهیهای اولیه به یک پورت تا چه حد میتواند مهم و تاثیر گذار باشند.
حال کمی وارد دنیای کد نویسی میشویم.
ابتدا یک پروژهی جدید در CodeVision ساخته و در هنگام ساخت تمام پایههای پورت A را به عنوان خروجی معرفی کرده و مقدار اولیهی همهی پایهها را صفر قرار دهید.
پس از تولید شدن کد اولیه توسط Code Wizard به قسمتی که در فیلم آموزشی نیز به آن اشاره شد، و با دستور while شروع میشود رفته و مطابق زیر عمل کنید. در نرمافزار CodeVision متغیری که برای هر پورت تعریف شده به نام همان پورت و با حروف بزرگ انگلیسی است. مثلا متغیر مربوط به پورت A به نام PORTA است و برای سایر پورتهای B ،C ،D متغیرها به صورت PORTB ،PORTC ،PORTD تعریف شدهاند. هرکدام از این متغیرها ۸ بیتی بوده، و دلیل این امر هم این است که ما در هر پورت ۸ پایه داریم و باید برای هر پایه ۱ بیت را در نظر بگیریم که بتواند حالت ۰ یا ۱ را برای هر پایه در هر لحظه مشخص کند. همچنین صفرمین پایه از پورت A به صفرمین بیت از متغیر PORTA مربوط میشود. نرم افزار CodeVision همچنین دسترسی به تک تک پایههای یک پورت را برای ما امکان پذیر ساخته است. برای استفاده از این قابلیت کافیست در دستور مقابل PORTX.Y به جای X نام پورت و به جای Y شمارهی پایه را بگذاریم.
مثلا اگر در جایی از برنامه میخواهیم پایهی شمارهی ۳ از پورت B مقدار ۱ (High) داشته باشد کافیست به شکل زیر عمل کنیم:
[php]PORTB.3=1;[/php]
حال اگر بخواهیم به همین پایه مقدار صفر را بدهیم که در این صورت پایه در حالت (Low) قرار میگیرد کافیست به جای ۱ در مقدار دهی بالا صفر بگذاریم.
[php] PORTB.3=0; [/php]
حال با همین خاصیت میخواهیم یک LED را روشن کنیم. در اینجا ابتدا یک پروژه در CodeVision میسازیم که پین A.0 به عنوان خروجی تنظیم شده است.
همچنین حالت ابتدایی این پایه را روی صفر تنظیم کنید. حال پس از انجام کارهایی که در بالا گفته شد در قطعه کد while (1) کد زیر را همان طور که یاد گرفتید وارد کنید.
[php]while(1){ PORTA.0=1; }[/php]
سپس کد را کامپایل کرده و فایل HEX برنامه را روی میکرو در شبیه سازی Proteus وارد کرده و شبیه سازی را اجرا کنید. با شکلی شبیه زیر مواجه میشوید:
همانطور که در شکل بالا مشاهده میکنید LED متصل به پین A.0 روشن شده است.
1 Comment
شکل ۴ مدار طراحی شده فکر کنم اشتباه باشه