آموزش میکروکنترلر STM32 – ورودی کردن GPIO

در پست قبل یاد گرفتیم چگونه می‌توان پایه میکرو را به صورت GPIO_Output کانفیگ کرد و با صفر یا یک کردن آن، LED یا هر چیز دیگری را کنترل کرد. اما در اینجا مشکلی که وجود داشت این بود اگر LED بصورت ثابت و دائم  روشن بود و ما قصد خاموش کردن آن را پس از مدتی داشتیم، می‌بایست دوباره برنامه را تغییر دهیم و بر روی پایه میکروکنترلر مقدار صفر را قرار دهیم تا LED خاموش شود. خب این کار قطعاً معقول نیست و راه بهتر این است که هر وقت خواستیم LED را خاموش کنیم به کمک یک کلید و از طریق ورودی کردن GPIO به میکرو بفهمانیم که قصد این کار را داریم و میکرو طبق برنامه ما و وضعیت کلید، فرمان خاموش شدن LED را بدهد.

 

کلیدی که در اینجا مد نظر ماست یک تک سوئیچ 1ساده دو وضعیتی میباشد. در نتیجه، بسته به مداری که طراحی میکنیم، صفر یا یک را روی پایه میکروکنترلر قرار می‌دهد. اصولاً یکی از دو شماتیک زیر نشان‌دهنده مداری است که ما کلید را به میکرو وصل میکنیم.

آموزش میکروکنترلر stm32 - ورودی کردن gpio - پول آپ و پول داون

پول آپ و پول داون کردن یک پایه:

در یک مدار دیجیتال، به مقاومتی که بین VCC+  و پایه آی‌سی قرار می‌گیرد، مقاومت پول آپ می‌گویند. این کار باعث می‌شود تا هنگامی که به این پایه، مدار دیگری وصل نیست یا مداری وصل است که مقاومت ورودی‌اش بسیار بالاست [/note]High Impedance2ما مطمئن باشیم که مقدار یک دیجیتال بر روی پایه قرار می‌گیرد. بطور عکس، اگر این  مقاومت بین VCC- (یا GND) و پایه آی سی قرار گیرد، به آن مقاومت پول داون می‌گویند.

بعضی از میکروکنترلرها این قابلیت را دارند که به صورت داخلی و با فرمان نرم‌افزاری Pull Up یا Pull Down شوند. هر چند در صنعت برای اطمینان بیشتر گاهی توصیه نمیشود از این قابلیت داخلی استفاده کنیم.

بار دیگر به دو شماتیک بالا توجه کنید. تفاوت این دو در چیست؟

بله، در یکی ما پایه را Pull up کرده‌ایم و در دیگری Pull Down.  در صورتی که پایه ما Pull up باشد، بطور عادی مقدار 3.3 ولت یا یک دیجیتال را بر روی این پایه خواهیم داشت و اگر کلید فشرده شود مقدار 0 ولت یا صفر دیجیتال بر روی پایه قرار می‌گیرد. برعکس همین ماجرا برای حالت Pull down برقرار است.

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

بار دیگر به توابع فایل stm32f0xx_hal_gpio.h نگاهی بیندازید. احتمالاً حدس زده اید که  تابع زیر همان چیزی است که به آن نیاز داریم.

GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

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

در پست خروجی کردن GPIO پین‌های PA0 تا PA7 را به عنوان خروجی برای روشن کردن LEDها استفاده کردیم. در اینجا به یک پین نیاز داریم تا آن را با ورودی کردن GPIO به کلید وصل کنیم. می خواهیم هر بار که کلید فشرده شد کل ردیف 1 روشن شود و هرگاه رها شد، خاموش شود. من PB1 را برای این کار انتخاب کردم. برای کانفیگ به عنوان ورودی، فایل .ioc پروژه قبلی را باز میکنیم. بر روی پین PB1 کلیک کرده و گزینه GPIO_Input را انتخاب میکنیم. برای تنظیم بیشتر این پین، به تب Configuration می رویم و بر روی GPIO کلیک میکنیم.

برای راحتی کار در اینجا Pull up داخلی را فعال می‌کنیم. هر چند الزامی نیست، اما بهتر است در قسمت User Label نامی دلخواه به این پایه اختصاص دهیم. این کار باعث خوانایی بیشتر برنامه می شود. بعد از انجام این تنظیمات و OK کردن، باید پروژه را دوباره generate کرد.

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

دیدن این کد، قبل از هرگونه تلاش و فکر کردن هرگز توصیه نمی‌‌‌شود.

  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)
		{
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
														|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);	
		}
		else
		{
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 
														|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
		
		}
   
  }

 تمرین:

در پست قبل قرار شد که یک LED در ردیف 4 دات ماتریکس روشن کنید و آن را در هر نیم ثانیه بصورت چرخشی، حرکت دهید. این بار این کار را با کلید انجام دهید. یعنی به جای هر نیم ثانیه، هر بار که کلید فشار داده شد، پیکسل ما یک واحد جابجا شود.

پانوشت:

  1. tactile switch

Leave a Reply

avatar
  Subscribe  
Notify of