پرش به محتوا

آموزش توابع آردوینو – توابع زمانی (تاخیر و تایمر)

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

;()delay

شرح:

این تابع، برنامه را به اندازه دلخواه (بر حسب میلی ثانیه‌) متوقف می کند. هر ثانیه شامل 1000 میلی ثانیه‌ است.

ساختار کد دستور:

delay(ms)

مولفه‌ ها:

  • ms: تعداد میلی ثانیه هایی که برنامه باید متوقف شود. (داده‌ مجاز: unsigned long)

مقدار بازگشتی:

ندارد.

نمونه‌ کد:

در کد زیر قبل از این که وضعیت پین مورد نظر را تغییر بدهیم، برنامه را برای یک ثانیه متوقف کرده‌ایم.

				
					int ledPin = 11;              // LED را به دیجتیال پین 11 متصل کرده ایم

void setup() {
  pinMode(ledPin, OUTPUT);    // دیجیتال پین را به عنوان خروجی تنظیم کرده ایم
}

void loop() {
  digitalWrite(ledPin, HIGH); // LED را روشن کرده ایم
  delay(1000);                // یک ثانیه برنامه را متوقف میکنیم
  digitalWrite(ledPin, LOW);  // LED را خاموش کرده ایم
  delay(1000);                // یک ثانیه برنامه را متوقف میکنیم
}

				
			
توابع زمانی

یادداشت ها و اخطارها:

راه اندازی برنامه چشمک زن با استفاده از توابع زمانی delay بسیار ساده‌است. ‌به همین خاطر در بسیاری از پروژه ها برای ایجاد تاخیرهای کوتاه مدت از این تابع استفاده‌ میشود. مثلا با استفاده از delay یک تاخیر بسیار کوتاه ایجاد میکنیم تا سوییچ عملکرد بهتری داشته‌باشد. با این وجود لازم است معایب این تابع را بشناسیم.

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

برنامه نویسان حرفه ای معمولا برای برنامه های کمتر از 10 میلی ثانیه سراغ تابع delay میروند. البته که در پروژه های ساده مثل چمشک زن میتوان از تابع delay به راحتی استفاده‌ کرد، چون هیچ اختلالی در برنامه ایجاد نمیشود.

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

      برای رفتن به لیست توابع کلیک کنید

;()delayMicroseconds

شرح:

برنامه را برای مدت زمان مشخص و بر حسب میکروثانیه متوقف میکند. هر ثانیه شامل یک میلیون میکروثانیه‌ است.

اگر میخواهید یک تاخیر دقیق ایجاد کنید، باید حداکثر عدد 16383 را در این تابع قرار دهید. با استفاده از این تابع نمیتوان تاخیرهای خیلی طولانی ایجاد کرد و ممکن است آردوینو در ورژن‌های بعدی این موضوع را تغییر و بهبود بدهد. ‌‌در‌ هر صورت اگر قصد دارید تاخیرهای بیشتر از 16 هزارمیکروثانیه ایجاد کیند، تابع delay بهترین گزینه‌ خواهد بود.

ساختار کد دستور:

delayMicroseconds(us)

مولفه‌ ها:

us: تعداد میکروثانیه هایی که برنامه‌ باید متوقف شود. (داده‌ مجاز: unsigned int)

مقدار بازگشتی:

ندارد.

نمونه‌ کد:

‌د‌ر برنامه زیر پین 8 را به عنوان خروجی تعریف کرده ایم و یک تاخیر 100 میکروثانیه ایجاد کرده‌‌ایم. با اجرای دستورات زیر میکروکنترلر یک رشته پالس 100 میکروثانیه را ایجاد میکند.

				
					int outPin = 13;               //یجیتال پین 13

void setup() {
  pinMode(outPin, OUTPUT);    // دیجیتال پین 13 را به عنوان خروجی تعریف کرده ایم 
}

void loop() {
  digitalWrite(outPin, HIGH); // پین مورد نظر را فعال کرده ایم
  delayMicroseconds(50);      // پالس 50 میکروثانیه ای تعریف کرده ایم
  digitalWrite(outPin, LOW);  // پین مورد نظر را غیرفعال کرده ایم
  delayMicroseconds(50);      // پالس 50 میکروثانیه ای تعریف کرده ایم
}

				
			
توابع زمانی

یادداشت ها و اخطارها:

از این تابع میتوانید برای ایجاد پالس های 3 میکروثانیه تا 1638 میکروثانیه استفاده‌ کنید. این تابع تنها در این محدوده دقیق عمل میکند و برای ایجاد تاخیرهای بزرگ تر امکان خطای ناچیز وجود دارد. از آردوینو ورژن 18 تابع ()delayMicroseconds سایر وقفه ها را غیرفعال نمی کند.

      برای رفتن به لیست توابع کلیک کنید

;()micros

شرح:

این تابع تعداد میکروثانیه هایی که پس از روشن شدن آردوینو سپری شده را برمیگرداند. تقریبا هر 70 دقیقه یک بار این عدد سرریز شده و صفر میشود. در بردهای خانواده Arduino Portenta این تابع با رزولوشن یک ثانیه عمل میکند.

در بردهای آردوینو با فرکانس 16 مگاهرتز مثل Duemilanove و Nano این تابع با رزولوشن چهار میکروثانیه عمل میکند. به این معنی که عدد بازگشتی همیشه ضریبی از چهار است. همچنین در بردهای آردوینو با فرکانس 8 مگاهرتز مثل LilyPad عملکرد این تابع با رزولوشن 8 میکروثانیه خواهد بود.

ساختار کد دستور:

time = micros();

مولفه‌های توابع زمانی: micros() 

بدون مولفه‌.

مقدار بازگشتی:

مقدار میکروثانیه سپری شده از زمان روشن شدن آردوینو تا حال حاضر را برمیگرداند. (داده‌ مجاز: unsigned long)

نمونه‌ کد:

کد زیر تعداد میکروثانیه های سپری شده پس از زمان شروع کار آردوینو را برمیگرداند و در سریال مانیتور چاپ میکند.

				
					unsigned long time;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Time: ");
  time = micros();

  Serial.println(time); //مدت زمان سپری شده پس از روشن شدن آردوینو را پرینت میکند
  delay(1000);          //یک ثانیه صبر میکند و مجدد برنامه اجرا میشود
}

				
			

یادداشت ها و اخطارها:

هر یک میلی ثانیه شامل 1000 میکروثانیه بوده و هر ثانیه شامل 1000000 ثانیه‌ است.

      برای رفتن به لیست توابع کلیک کنید

;()millis

شرح:

این تابع تعداد میلی‌ ثانیه هایی که پس از روشن شدن آردوینو سپری شده را برمیگرداند. این عدد هر 49 روز یکبار سرریز و صفر میشود.

آموزش برنامه نویسی آردوینو (تکنیک استفاده از تابع millis)

ساختار کد دستور:

time = millis();

مولفه‌ ها:

بدون مولفه‌.

مقدار بازگشتی:

مدت زمان روشن بودن آردوینو را برحسب میلی ثانیه‌ برمیگرداند. (داده‌ مجاز: unsigned long)

نمونه‌ کد:

با استفاده از کدهای زیر، تعداد میلی ثانیه های سپری شده پس از روشن شدن آردوینو را روی سریال مانیتور چاپ میکنیم.

				
					unsigned long myTime;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Time: ");
  myTime = millis();

  Serial.println(myTime); // prints time since program started
  delay(1000);          // wait a second so as not to send massive amounts of data
}

				
			

یادداشت ها و اخطارها:

توجه داشته باشید که مقدار بازگشتی تابع ()millis از نوع unsigned long است. د‌ر صورتی که از انواع داده های کوچکتر مثل int استفاده کنید احتمال بروز خطا وجود دارد. حتی اگر داده از نوع signed long باشد چون حداکثر مقدار آن نصف unsigned long است، باز هم احتمال بروز خطا وجود دارد.در صورتی که تایمر های میکروکنترلر را مجددا پیکربندی کرده باشید، احتمال بروز اشتباه در خواندن تابع millis() وجود دارد. در‌ هسته های Arduino AVR Boards و Arduino megaAVR Boards از تایمر 0 برای تولید مقدار تابع ()millis استفاده‌ شده‌ است. ‌د‌ر‌ هسته های Arduino ARM (32-bit) و Arduino SAMD (32-bit ARM Cortex-M0+) از تایمر SysTick برای تولید مقدار توابع زمانی ()millis استفاده‌ شده‌ است.

      برای رفتن به لیست توابع کلیک کنید

اشتراک گذاری این نوشته

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

شاید این مطالب براتون جذاب باشه!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری