با سلام خدمت همه دوستان و همراهان گرامی مایکروالکام. در اکثر مواقع نیاز داریم که وضعیت دستگاه را با یک یا چند کلید تغییر دهیم. یا عمل خاصی را انجام دهیم. در اینگونه مواقع نیاز به اتصال کلید به میکروکنترلر و خواندن وضعیت آن داریم. در این مطلب قصد دارم نحوه اتصال کلید با مسیر (سیم) طولانی به میکروکنترلر با قابلیت تشخیص قطعی مسیر آن را بررسی کنم. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطالب من رو از این لینک مطالعه و بررسی کنید.
خواندن وضعیت کلید با میکروکنترلر
در بسیاری از مدارات به طور معمول برای وارد کردن فرامین مشخص از طرف کاربر به دستگاه، از یک یا چند کلید (Button) استفاده می شود. یک راه ساده برای اتصال کلید به میکروکنترلر و خواندن وضعیت آن، استفاده از مقاومت Pull-up یا Pull-Down می باشد.
این روش در شکل زیر آورده شده است:
در این مدارات ساده، وضعیت پین میکرو در حالت بسته بودن کلید توسط کلید و در حالت باز بودن، توسط مقاومت تعیین میشود. اما در مواردی، کلید بر روی یک پنل خارج از دستگاه نصب می شود و در طول مسیر، احتمال قطع شدن سیم ارتباطی بین این دو وجود دارد.
در چنین مواردی چگونه باید حالت قطع شدن سیم ارتباطی را تشخیص داد؟
در مدارات شکل بالا، در هر حالت، قطع شدن سیم ارتباطی با یکی از حالت های بسته یا باز بودن کلید تداخل دارد و قابل تفکیک نیست. به عنوان مثال، در مدار B چه زمانی که کلید باز باشد و چه سیم ارتباطی قطع باشد، پین میکروکنترلر برابر سطح صفر است و اگر سیم ارتباطی قطع شود، دستگاه آن را به عنوان “کلید فشار داده نشده” تلقی کرده و اپراتور از قطع بودن سیم مطلع نمیشود.
تشخیص وضعیت قطعی مسیر اتصال کلید به میکروکنترلر
برای اینکه بتوانیم هر سه وضعیت “صفر” ، “یک” و “قطع” را تشخیص دهیم، می توانیم از روشی ابتکاری استفاده کنیم. به مدار زیر توجه کنید:
در این مدار، کلید از نوع دو حالته می باشد و توسط سیم بلندی به مدار RC داخل دستگاه و نهایتا به پین میکروکنترلر متصل شده است. در این روش، میکروکنترلر هر بار طی دو مرحله کلید را قرائت می کند. مراحل به شرح زیر می باشد:
مرحله اول:
- ابتدا پین را خروجی کرده و مقدار آن را یک میکند و مدت 5 میلی ثانیه صبر میکند.
- سپس بلافاصله پین را ورودی کرده و مقدار پین را میخواند و در متغیر A ذخیره میکند.
مرحله دوم:
- مجددا پین را خروجی کرده و این بار مقدار آن را صفر کرده و مدت 5 میلی ثانیه صبر میکند.
- سپس بلافاصله پین را ورودی کرده و مقدار پین را میخواند و در متغیر B ذخیره میکند.
پس از انجام این مراحل در برنامه، با مقایسه مقدار متغیر های A و B میتوان وضعیت سه گانه کلید را به ترتیب زیر تشخیص داد:
- اگر A و B هر دو صفر بودند، یعنی کلید در وضعیت صفر است.
- اگر A و B هر دو یک بودند، یعنی کلید در وضعیت یک است.
- اگر A مقدار یک و B مقدار صفر داشت، یعنی سیم ارتباطی کلید و میکروکنترلر قطع شده است.
راه حل
در این روش لازم است برنامه نویس بتواند وضعیت پین میکروکنترلر را در طول برنامه بین حالت ورودی و خروجی تغییر دهد. این کار در میکروکنترلر های مختلف با رجیستر مربوطه قابل انجام است. به عنوان مثال، در میکروکنترلر های AVR این کار توسط رجیستر DDR و در میکروکنترلر های PIC توسط رجیستر TRIS انجام میشود.
در مرحله اول، میکروکنترلر با یک کردن پین، خازن را از طریق مقاومت شارژ میکند. با توجه به مقادیر مقاومت و خازن استفاده شده در مثال، مدت زمان مورد نیاز برای شارژ کامل خازن 5 میلی ثانیه میباشد. بنابراین میکروکنترلر به مدت 5 میلی ثانیه صبر می کند تا خازن شارژ شود. سپس با تغییر وضعیت پین به ورودی، مقدار ولتاژ خازن را به صورت لاجیک میخواند. از آنجایی که امپدانس ورودی پین میکروکنترلر مقدار بالایی دارد، اگر بلافاصله بعد از شارژ شدن خازن پین میکروکنترلر ورودی شده و قرائت شود، ولتاژ روی خازن افت خاصی نخواهد داشت. سپس میکروکنترلر با صفر کردن پین، خازن را دشارژ کرده و دوباره ولتاژ آن را میخواند.
اگر کلید به مدار متصل باشد و در یکی از حالت های صفر یا یک قرار داشته باشد، ولتاژ خازن بدون اینکه از ولتاژ پین میکروکنترلر تاثیر ببیند، در هر دو حالت، در وضعیت مربوط به کلید باقی میماند. اما اگر سیم ارتباطی قطع شده باشد، میکروکنترلر با شارژ شدن خازن، سطح یک و با دشارژ شدن آن سطح صفر را از خازن قرائت میکند. بنابراین می توان حالت قطع شدن سیم ارتباطی را به راحتی تشخیص داد و اخطار های لازم به اپراتور دستگاه صادر نمود.
برنامه نویسی
نمونه کد این مطلب که در محیط MikroC Pro For AVR نوشته شده است را در زیر مشاهده میکنید.
bit A; bit B; void main() { UART1_Init(9600); SFIOR.PUD = 1; // Disable IO Pull-Up Resistors ADCSRA.ADEN = 0; // Disable ADC Because Port C Used while (1){ A = 0; B = 0; //----------- Part 1 -------------- DDRC.B0 = 1; // Set Pin To Output PORTC.B0 = 1; // Set Pin To 1 Delay_ms(5); // Wait For Capacitor Charging DDRC.B0 = 0; // Set Pin To Input A = PINC.B0; // Reading Pin //----------- Part 2 -------------- DDRC.B0 = 1; // Set Pin To Output PORTC.B0 = 0; // Set Pin To 0 Delay_ms(5); // Wait For Capacitor Discharging DDRC.B0 = 0; // Set Pin To Input B = PINC.B0; // Reading Pin if ((A == 1) && (B == 1)){ UART1_Write_Text("Key: 1"); } if ((A == 0) && (B == 0)){ UART1_Write_Text("Key: 0"); } if ((A == 1) && (B == 0)){ UART1_Write_Text("Key: Open"); } UART1_Write(13); UART1_Write(10); delay_ms(100); } }
نتیجه:
در تصاویر زیر نتایج مشاهده شده حاصل از این کد ها قابل نمایش میباشد.
جمع بندی
برای اتصال یک کلید به میکروکنترلر، ساده ترین روش استفاده از مقاومت Pull-Up و Pull-Down میباشد. اما گاهی کلید به صورت ریموت و بیرون دستگاه متصل شده است.
در این حالت ممکن است به هر دلیلی سیم ارتباطی بین سوئیچ و دستگاه قطع شود. در این مواقع نمیتوان قطع شدن سیم ارتباطی را تشخیص داد و این اتفاق ممکن است توسط دستگاه به اشتباه به عنوان یکی از حالت های کلید تلقی شود.
در این مطلب، مداری ابتکاری معرفی شد که میکروکنترلر میتواند طی چند مرحله، قطع بودن سیم ارتباطی را تشخیص دهد.
امیدوارم که این مطلب مورد رضایت شما قرار گرفته باشد. چنانچه در این خصوص سوال، نظر و یا اطلاعات و تجربه ای دارید، آن را از قسمت کامنت ها با ما در میان بگذارید تا در اسرع وقت پاسخ داده شود و از تجربیات و اطلاعات شما هم استفاده شود. همچنین ما را در پیج اینستاگرام مایکروالکام دنبال کنید.
با درود و تشکر موضوع بسیار جالبی بود و خیلی هم کاربردی. ممنون از شما.
از اینکه مطلب مفید بوده خوشحالیم.